|
Visual Basic-Objekte wie Forms und Steuerelemente verfügen über die Tag-Eigenschaft, in der Sie einen beliebigen String ablegen können. So können Sie irgendwelche Daten fest mit einem Objekt verbinden, ohne globale Variablen samt einer eventuell komplizierten Verwaltung für mehrere Instanzen von Objekten einrichten zu müssen.
Manchmal wäre es allerdings wünschenswert, mehrere solcher Datenablage-Möglichkeiten zur Verfügung zu haben. So sollte beispielsweise bei Verwendung der API-Methode SetParent das bei ihrem Aufruf zurückgegebene Fenster-Handle des vorherigen Besitzers festgehalten werden, um später die Änderung des Parent-Verhältnisses wieder exakt rückgängig machen zu können. Sie könnten dieses Handle zwar in der Tag-Eigenschaft des per SetParent verschobenen Steuerelements ablegen, würde sich aber damit jede andere Nutzungsmöglichkeit der Tag-Eigenschaft blockieren.
Wenn es, wie im geschilderten Fall, lediglich um Long-Werte gehen sollte, könnten Sie über das API eine zusätzliche Datenablage-Möglichkeit nutzen. Jedes Fenster verfügt nämlich ähnlich der Tag-Eigenschaft in VB über einen kleinen Speicherbereich, in dem ein Long-Wert abgelegt werden kann. Den Zugriff auf diesen erhalten Sie über die API-Funktionen SetWindowLong und GetWindowLong und den Index-Parameter GWL_USERDATA.
Die Prozedur SetExtraTag und die Funktion GetExtraTag vereinfachen den Aufruf:
Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Any) As Long
Private Const GWL_USERDATA = (-21)
Public Sub SetExtraTag(ByVal hWnd As Long, ByVal Value As Long)
SetWindowLong hWnd, GWL_USERDATA, Value
End Sub
Public Function GetExtraTag(ByVal hWnd As Long) As Long
GetExtraTag = GetWindowLong(hWnd, GWL_USERDATA)
End Function
Bei Visual Basic-eigenen Forms und Steuerelementen sollten Sie diese Speicherstelle problemlos verwenden können. Bei externen Steuerelementen und Komponenten sollten sie sich jedoch vergewissern, ob diese nicht diese Speicherstelle bereits selbst verwenden (eventuell auch nur kurzzeitig zwischendurch).
|