VB-Tec.de Visual Basic - Technik, FAQ, Tricks, BeispieleHome / Objekte / Controls / Array ControlArray besser nutzen |
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