Rubrik: Controls · Sonstiges | VB-Versionen: VB5, VB6 | 27.01.05 |
SSTab: Suchen der Registerkarte für ein Control Wie lässt sich die Registerkarte ausfindig machen, auf der sich ein ganz bestimmtes Control befindet? Die Lösung erfahren Sie hier. | ||
Autor: Wolfgang Christ | Bewertung: | Views: 9.836 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Haben Sie sich auch schon einmal gefragt, wie sich beim SSTab-Control die Registerkarte ausfindig machen lässt, auf der sich ein ganz bestimmtes Control befindet?
Eine Möglichkeit wäre, einfach alle Controls jeder einzelnen Registerkarten des SSTab-Control zu "durchlaufen". Und damit der Anwender davon nichts merkt (Umschalten der Registerkarten), sperren wir einfach das autom. Neuzeichnen des Controls während des gesamten Vorgangs.
Das Ganze sieht dann in etwa so aus:
Option Explicit ' zunächst die benötigten API-Deklarationen Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Long) As Long Private Declare Function GetClientRect Lib "user32" ( _ ByVal hWnd As Long, _ lpRect As cRECT) As Long Private Declare Function RedrawWindow Lib "user32" ( _ ByVal hWnd As Long, _ lprcUpdate As cRECT, _ ByVal hrgnUpdate As Long, _ ByVal fuRedraw As Long) As Long Private Const WM_SETREDRAW = &HB Private Const RDW_INVALIDATE = &H1 Private Const RDW_ALLCHILDREN = &H80 Private Const RDW_UPDATENOW = &H100 Private Const RDW_ERASE = &H4 Private Type cRECT left As Long top As Long right As Long bottom As Long End Type
' Neuzeichnen eines Fensters sperren Private Sub LockWindow(ByVal hWnd As Long, wLock As Boolean) Dim ClientRect As cRECT If wLock = True Then SendMessage hWnd, WM_SETREDRAW, False, 0& Else SendMessage hWnd, WM_SETREDRAW, True, 0& GetClientRect hWnd, ClientRect RedrawWindow hWnd, ClientRect, 0&, RDW_ERASE Or _ RDW_INVALIDATE Or RDW_ALLCHILDREN Or RDW_UPDATENOW End If End Sub
' Sucht im SSTab nach der Registerkarte für ein bestimmten Control ' liefert -1, falls TabControl nicht Container des gesuchten Controls Public Function GetTabNumberByControlName(ByVal oTabControl As SSTab, _ ByVal vControl As Variant, _ Optional ByVal bAutoActivateTab As Boolean = True) As Long Dim lCounter As Long Dim lTab As Long Dim oControl As Control Dim bFound As Boolean bFound = False With oTabControl ' alle Controls durchlaufen For Each oControl In .Container If IsObject(vControl) Then bFound = (oControl Is vControl) Else bFound = (oControl.Name = vControl) End If ' gefunden If bFound Then If Not oControl.Container Is oTabControl Then bFound = False Else Exit For End If End If Next If Not bFound Then ' das Control ist nicht im TabControl enthalten GetTabNumberByControlName = -1 Exit Function End If ' z.Zt. aktuelles Tab sichern lTab = .Tab ' Neuzeichnen deaktivieren LockWindow .hWnd, True ' jetzt Registerkarte ausfindig machen For lCounter = 0 To .Tabs - 1 .Tab = lCounter If oControl.left > 0 Then ' Tab gefunden ... GetTabNumberByControlName = lCounter Exit For End If Next lCounter If Not bAutoActivateTab Then ' altes Tab wieder herstellen .Tab = lTab End If ' Neuzeichnen wieder einschalten LockWindow .hWnd, False End With End Function
Aufrufbeispiele:
Im ersten Beispiel wird nach der Registerkarte gesucht, auf dem sich das Control mit dem Namen "Text1" befindet.
Dim nTab As Long nTab = GetTabNumberByControlName(SSTab1, "Text1")
Im zweiten Beispiel suchen wir nach dem Control mit dem Namen Text1 und dem Index = 2 - also nach einem Control aus einem Steuerelementfeld. In diesem Fall müssen wir anstelle des Controlnamens das Control als Objekt übergeben:
Dim nTab As Long nTab = GetTabNumberByControlName(SSTab1, Text1(2))
Anmerkung:
Soll das Register nicht autom. aktiviert werden, einfach den dritten optionalen Parameter beim Funktionsaufruf auf False festlegen.