Kontakt
DSVGO
Ein ControlArray ist ein Feld von Steuerelementen, welche alle über den gleichen Namen (aber verschiedene Index-Eigenschaften) angesprochen werden können. Es dient zur Reduzierung von Ressourcen-Verbrauch und Programmier-Aufwand. Ausserdem ist es mit ControlArrays möglich, zur Laufzeit neue "ähnliche" Steuerelemente zu erzeugen.
Angelegt wird ein ControlArray dadurch, dass zur Design-Zeit ein Control auf ein Formular platziert wird, und dessen Index-Eigenschaft auf eine Ganzzahl größer/gleich "0" gesetzt wird. (Normalerweise wird als Startwert "0" gewählt.)
Zur Laufzeit können mit Load neue Controls erzeugt werden (welche übrigens Default-mäßig nicht sichtbar sind) und mit Unload wieder entfernt werden.
Wird ein ControlArray dynamisch vergrößert und verkleinert, so können u.U. Lücken in der Index-Reihenfolge entstehen.
Mit der unten vorgestellten FreeIndex-Funktion können solche Lücken leicht gefunden werden, um sie eventuell wiederzuverwenden.
Das folgende Beispiel demonstriert die Nutzung von Load und Unload. Benötigt wird ein Formular mit einer TextBox namens "txt" darauf, wobei die Index-Eigenschaft auf einen numerischen Wert (z.B. "2") gesetzt wird. (Dadurch wird ja gerade ein ControlArray angelegt.)
Wird das Programm gestartet, so geschieht folgendes: Bei jedem Klick auf die Formularfläche wird eine neue TextBox erzeugt und an der ersten freien Stelle eingefügt. Bei einem Doppelklick in eine TextBox wird die entsprechende TextBox wieder entfernt.
Private Sub Form_Load() 'Original einrichten: With txt(txt.LBound) .Text = CStr(.Index) .Move (.Index Mod 5) * 300, (.Index \ 5) * 300, 300, 300 End With End Sub Private Sub Form_Click() Dim NewIndex As Long 'Kopie erzeugen: NewIndex = FreeIndex(txt) Load txt(NewIndex) 'Kopie einrichten: With txt(NewIndex) .Text = CStr(NewIndex) .Move (NewIndex Mod 5) * 300, (NewIndex \ 5) * 300 .Visible = True .SelLength = 9 'Text markieren .SetFocus End With End Sub Private Sub txt_DblClick(Index As Integer) 'Control entfernen: On Error Resume Next Unload txt(Index) If Err.Number Then MsgBox "Das Original???" End Sub
Die folgende Funktion geht alle potenziellen Indexe durch, und testet (via Error-Handler), ob ein entsprechendes Control bereits existiert:
Function FreeIndex(CtlArr As Object) As Long Dim Dummy As Long On Error Resume Next For FreeIndex = 0 To CtlArr.UBound Dummy = CtlArr(FreeIndex).Index If Err.Number Then Exit Function Next FreeIndex End Function
© Jost Schwider, 14.04.2001-14.04.2001 - http://vb-tec.de/ctrlarr.htm