salut a tous, j’essaie de créer un label en vb6 mais ca n’a pas l’air de marcher comme en vb.net.
J’ai essayé :
dim L as new Label
mais rien qu’a cette ligne, il y a une erreur !
Comment faire ?
salut a tous, j’essaie de créer un label en vb6 mais ca n’a pas l’air de marcher comme en vb.net.
J’ai essayé :
dim L as new Label
mais rien qu’a cette ligne, il y a une erreur !
Comment faire ?
Ca fait une éternité que j’ai pas fait de VB mais je crois qu’en faisant :
' il faut ajouter manuellement un label
' et dans index mettre 0
Private Sub Form_Load()
Dim m_counter As Long
Dim num As Long
num = 5 ' 5 labels
For m_counter = 1 To num
Call Load(Label1(m_counter))
Label1(m_counter).Caption = "Label " + Str(m_counter + 1)
Label1(m_counter).Width = Label1(m_counter - 1).Width
Label1(m_counter).Height = Label1(m_counter - 1).Height
Label1(m_counter).Left = Label1(m_counter - 1).Left + Label1(m_counter - 1).Width + 20
Label1(m_counter).Visible = True
Next m_counter
End Sub
:oui:
C’est en effet impossible de créer dynamiquement des controles graphiques en VB6, on peut uniquement cloner ceux qui existent déja dans une form.
Sisi c’est possible mais c’est juste que j’avais la flemme de le faire, en résumé, il faudrait utiliser les API, en l’occurence CreateWindow, ce qui donnerais :
Const SW_NORMAL = 1
Private Const WS_VISIBLE = &H10000000
Private Const WS_CHILD = &H40000000
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Sub CreateDynLabel(ByVal posx As Long, ByVal posy As Long, ByVal width As Long, ByVal height As Long, ByVal title As String)
Dim m_hWnd As Long
m_hWnd = CreateWindowEx(ByVal 0&, "STATIC", title, WS_CHILD, posx, posy, width, height, Me.hwnd, ByVal 0&, App.hInstance, ByVal 0&)
Call ShowWindow(m_hWnd, SW_NORMAL)
End Sub
Private Sub Form_Load()
Dim m_counter As Long
Dim m_initialposx As Long
Dim m_initialposy As Long
m_initialposx = 20
m_initialposy = 20
For m_counter = 1 To 5
Call CreateDynLabel(m_initialposx, m_initialposy, 70, 50, "Label Dynamique " + Str(m_counter))
m_initialposx = m_initialposx + 100
Next m_counter
End Sub
Si tu veux faire réagir les clicks de souris sur les labels, il faudra sous classer ta form et créer une fonction de rappel, répondre aux message windows (le wParam de WM_COMMAND), bref, c’est la fête de la saucisses et l’utilisation des winapi
Oui c’est tres bancal comme solution, et ca ne crée pas un vrai controle VB, donc bonjour les soucis par la suite (encore, pour un label c’est vrai que ca va a peu pres, mais pour un bouton ou autre, ca devient vite la galere).
Moi je préférai ta premiere solution :oui:
Ca reste bien un label, il faut appeler d’autres API pour faire en sorte que le label ressemble à ceux de VB notamment ce qui concerne les bordures.
Ce n’est pas une solution bancales, toutes applis utilisent consciemment ou pas, createwindow ('fin, c’est windows qui s’en occupe).
C’est bancal dans le sens ou si tu fais un “For Each c In Form.Controls”, il ne sera pas listé. :neutre:
De la meme facon, tu ne peux pas accéder a ses propriétés en VB, tu es obligé de passer par les API, ce qui fait beaucoup d’inconvénients pour quasiment aucun avantage.
Oui mais la, ce qu’on est en train de dire montre tout simplement les lacunes de VB dès que l’on sort un peu de la philosophie VB : for each, par exemple, qui ne concerne que des objet VB mais libre à toi d’implémenter un module ou une class permettant de manipuler un label dynamique, tu pourras y apporter les propriétés que tu souhaites et même des évenements (raiseevent).
Si on devait se cantonner qu’à VB sans les API, on en ferait pas grand chose :whistle: