Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Objekte / Controls / Array

ControlArray besser nutzen

Einleitung

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.

Problem

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.

Beispiel

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

Code

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