VB 5/6-Tipp 0014: Steuerelemete zur Laufzeit dynamisch laden
von ActiveVB
Beschreibung
Mit diesem Tipp können Sie Steuerelemente wärend der Laufzeit dynamisch laden.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: keine | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
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.