Creer un label par du code en vb6

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 :slight_smile:

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. :wink:

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: