Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0014: Steuerelemete zur Laufzeit dynamisch laden

 von 

Beschreibung 

Mit diesem Tipp können Sie Steuerelemente wärend der Laufzeit dynamisch laden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [2,12 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Textfeld "Text1" (Index von 0 bis 0)

Option Explicit

Private Sub Command1_Click()
    'Deklaration: Lokale Prozedur-Variablen
    Static lngRichtung As Long
    Static lngIndex As Long

    If lngIndex > 4 And lngRichtung = 1 Then
        lngRichtung = -1
        lngIndex = lngIndex + 1
    ElseIf lngIndex = 1 And lngRichtung = -1 Then
        lngRichtung = 1
        lngIndex = 0
    ElseIf lngIndex = 0 And lngRichtung = 0 Then
        lngRichtung = 1
    End If

    lngIndex = lngIndex + lngRichtung

    If lngRichtung = 1 Then
        Load Text1(lngIndex)

        Text1(lngIndex).Top = Text1(0).Top
        Text1(lngIndex).Left = Text1(0).Left + Text1(0).Width * (lngIndex) + 90 * (lngIndex)
        Text1(lngIndex).Text = "Text1(" & Trim$(lngIndex) & ")"
        Text1(lngIndex).Visible = True
    Else
        Unload Text1(lngIndex)
    End If
End Sub

Private Sub Form_Load()
    'Control-Eigenschaften initialisieren
    Command1.Caption = "Hier klicken!"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'Deklaration: Lokale Prozedur-Variablen
    Dim i As Long

    If Text1.UBound > 0 Then
        For i = 1 To Text1.UBound
            Unload Text1(i)
        Next i
    End If
End Sub

'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 18 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Jochen Wierum am 23.07.2007 um 14:37

Hallo Rene,

kann es sein, dass die Textbox "Text1" die Eigenschaft "Index" nicht gesetzt hatte? Diese muss zur Laufzeit auf "0" gesetzt werden, da sich sonst keine weiteren Steuerelemente nachladen lassen.

Mit freundlichen Grüßen
Jochen Wierum

Kommentar von Rene am 23.07.2007 um 14:33

hallo,

ich habe den code von oben mittels copy & paste in ein neues projekt bei mir eingefügt - es funktioniert komischerweise nicht: "Fehler beim Komilieren: Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft"
Wenn ich den Code downloade und das Projekt mittels Doppelklick öffne, dann geht's

Das kann soch nicht sein? Hat jemand ne Idee was hier nicht stimmt?

Kommentar von Dominik am 21.07.2007 um 21:22

Public label2() As Label

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim i As Int16
ReDim label2(3)

For i = 0 To 2
label2(i) = New Label
With label2(i)
.Parent = panEdit
.Name = "Label" & i
.Text = i & ". hallo "
.BackColor = Color.FromArgb(255, 255, 255)
.Top = i * 29
.Tag = i
'hier das wichtigste
AddHandler .Click, AddressOf btn_Click
End With
Next i

End Sub

Private Sub btn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim index As String
index = sender.tag

MsgBox("test " & index)
End Sub

Kommentar von Dominik am 21.07.2007 um 20:15

Hallo,

hab mal eine Möglichkeit rausgefunden zum problem mit VB 2005...

denke mal, dass das so eine ganz gute Lösung ist.

Es wird ein Label-Array angelegt. Beim klicken auf eines der Labels wird das Ereigniss "btn_Click" ausgelöst. Über den Tag der Objekte kann man auf die jeweiligen Indizes zugreifen.

Quelltext:

Public label2() As Label

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim i As Int16
ReDim label2(3)

For i = 0 To 2
label2(i) = New Label
With label2(i)
.Parent = panEdit
.Name = "Label" & i
.Text = i & ". hallo "
.BackColor = Color.FromArgb(255, 255, 255)
.Top = i * 29
.Tag = i
'hier das wichtigste
AddHandler .Click, AddressOf btn_Click
End With
Next i

End Sub

Private Sub btn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim index As String
index = sender.tag

MsgBox("test " & index)
End Sub

Kommentar von swat am 13.04.2007 um 15:31

In .NET wird vom Form Designer ne Datei ("Form.Vbdesigner.vb") automatisch generiert. Öffnet man diese, kann man Control(-Arrays) dynamisch erzeugen.

Kommentar von Markus am 01.12.2006 um 17:41

Hallo,

Weiß zufällig jemand wie das in .NET (bzw. VB 2005 Express) zu lösen ist?

Dort funktioniert es nämlich nicht so :(

Grüße
Markus

Kommentar von Matthias am 04.11.2005 um 10:02

Hallo Andy,
wenn das erste Objekt (index=0) schon in einem Anderen Parentobjekt liegt werden die neu erstellten auch automatisch in diesem Parentobjekt angezeigt.
Nicht vergessen die Einstellung

Objekt(index).Visible = True
nach dem erzeugen des neue Objektes für dieses Objekt zu setzen.

Kommentar von HMS am 11.07.2005 um 21:13

Hallo,

das dynamische Laden von Steuerelementen (in meinem Fall Labels) ist kein Problem - das größere Problem bereitet mir das Entladen ebendieser Labels. Da ich (aus welchem Grund auch immer) in einer ComboBox_Click-Prozedur kein Unload verwenden darf, muß ich Labels anders entladen. Wer mir helfen will, soll mir eine E-Mail an camper.schreck@gmx.de schicken; ich sende dem-/derjenigen dann gerne den Code zu.

Kommentar von Andy am 20.05.2005 um 10:39

Hallo,
funktioniert wunderbar, wenn ich Objekte direkt auf's Form platziere.

Aber wie stelle ich es an, wenn ich ein anderes Parent-Objekt haben möchte als das Form, zum Beispiel ein TabStrip?

Kommentar von Martin am 11.04.2005 um 12:55

Hallo,
Das ist im Fall, ich habe ein textbox control on das formular in design time plaziert (mit ein index - > control array).
Jetzt möchte ich wie folgt machen:
ich habe auf dem Formular nur ein control (Textbox), in runtime möchte ich ändern type von dem steuerelement in z.B. Commandbutton, oder auch mein selbt erstellte Controls.

Geht es so?
Danke
Martin

Kommentar von Schwammerl am 07.03.2005 um 13:55

Hallo,

wie mache ich es, das ich bei dem oben gennanten Tipp die TextBoxen auch untereinander bringe?
Also pro reihe z.B. drei TextBoxen und z.B. drei Reihen untereinander.

Gruß
Schwammerl

Kommentar von Peter am 27.07.2003 um 14:55

Super Tip! Habe seit Tagen danach gesucht.
Mein Problem war, daß ich zur Entwurfszeit nicht festlegen konnte wie oft ein von mir entworfenes Steuerelement (Bildvorschau) vom User tatsächlich im Formular benötigt wird.
Vielen Dank!!

Kommentar von sEbbeL am 06.07.2003 um 08:07

Semertzidis,
die Load Funktion is ja für den dynamischen Einsatz bedacht - geht es dir nur darum ob ein control sichtbar ist oder nicht - nimm die visible eigenschaft, denn somit verminderst du auch Bugs..

Kommentar von Semertzidis am 03.07.2003 um 10:05

Ist es besser für den Arbeitsspeicher wenn man die
Steuerelemente zur Laufzeit erstellt oder wenn man
mit der Visible-Eigenschaft arbeitet ???

Vielen Dank !!!

Kommentar von sEbbeL am 30.01.2003 um 01:49

öh und wie mach ich des das die erstellten objekte als oberstes sichtbares objekt landen? :D

hab nämisch en imgControl als Hintergrund - nur leider laden sich die Objekte hinter den Hintergrund :/

Kommentar von RootSSW am 17.01.2003 um 14:59

Super Tipp. Funktioniert wunderbar. Danke...

Kommentar von Ramon Brülisauer am 18.10.2002 um 08:31

Ein Super-Tipp! Nach einem solchen Beispiel habe ich stundenlang in der MSDN gesucht und nichts brauchbares gefunden.

Active-VB rulez!

Kommentar von rolf am 14.04.2002 um 23:11

Geht auch, indem man ein webbrowser-objekt einbindet, darin eine site mit anzeigt. diese kann man nach dem ausfüllen dann prima abfragen. man kann ntürlich auch eine ganze kaskatde von html-site benutzen, mit links und so.