|
Da Steuerelementfelder ("Control-Arrays") nicht durchgängig belegt sein brauchen (Ausnahme: Menü-Steuerelemente), können Sie nicht so leicht feststellen, ob ein Element geladen ist oder nicht. Die Prüfung der Unter- oder Obergrenze hilft nämlich nicht weiter.
Sie könnten nun die gesamte Controls-Collection eines Forms (bzw. UserControls oder UserDocuments) durchlaufen und prüfen, ob das betreffende Steuerelement ("MeinControl(Index)") schon vorhanden ist:
Dim nControl As Control
For Each nControl In Controls
If nControl Is MeinControl(Index) Then
' geladen
Exit For
End If
Next
Je nach Anzahl der vorhandenen Steuerelemente kann dieser Test in einer Schleife eine gewisse Zeit dauern. Direkter und wahrscheinlich schneller ist wohl der Versuch, auf eine Eigenschaft des betreffenden Steuerelements zuzugreifen und aus einem Fehlschlag daraus zu schließen, dass das Element noch nicht geladen ist.
Public Function CtlIsLoaded(Control As Control) As Boolean
Dim nTestVisible As Boolean
Dim nTestLeft As Single
On Error Resume Next
If TypeOf Control Is Line Then
nTestVisible = Control.Visible
CtlIsLoaded = CBool(Err.Number = 0)
Else
nTestLeft = Control.Left
CtlIsLoaded = CBool(Err.Number = 0)
End If
End Function
Bis auf das Line-Steuerelement verfügen eigentlich alle Steuerelemente über eine Left-Eigenschaft, die Sie daher zur Prüfung verwenden können. Lediglich beim Line-Steuerelement müssen Sie auf eine andere Eigenschaft ausweichen - die Visible-Eigenschaft beispielsweise.
Wenn es Ihnen jedoch lediglich darum geht, nach einem Ladeversuch sicher zu sein, dass ein Steuerelement eines Steuerelementfeldes mit dem gewünschten Index geladen ist, können Sie einen Fehlversuch einfach mit einer Fehlerbehandlung ignorieren:
On Error Resume Next
Load MeinControl(Index)
On Error GoTo 0
Wenn das Steuerelement bereits geladen war, passiert nichts weiter. War es noch nicht geladen, wird es eben geladen.
Dies hat jedoch unter Umständen den Nachteil, dass das Steuerelement danach nicht unbedingt "jungfräulich" ist. Denn die Eigenschaften des bereits geladenen Steuerelements können ja zuvor schon geändert worden sein. Die folgende Funktion SafeLoadControl zum greift daher zunächst auf die obenstehende Funktion CtlIsLoaded zurück, um zu prüfen, ob das Element bereits geladen ist. Ist dies der Fall, wird es entladen. Erst dann wird das gewünschte Element neu geladen. Anderenfalls wird es direkt geladen.
Public Function SafeLoadControl(ControlArray As Object, _
ByVal Index As Integer) As Control
If CtlIsLoaded(ControlArray(Index)) Then
Unload ControlArray(Index)
End If
Load ControlArray(Index)
Set SafeLoadControl = ControlArray(Index)
End Function
|