Rubrik: Controls · Sonstiges | VB-Versionen: VB5, VB6 | 15.09.03 |
TabStrip: Register (optisch) disablen Dieser Tipp zeigt, wie sich einzelne oder alle Registerkarten des TabStrip-Controls disablen lassen - und zwar auch optisch. | ||
Autor: Dieter Otter | Bewertung: | Views: 18.204 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Heute möchten wir Ihnen einen Weg zeigen, wie sich einzelne oder alle Registerkarten eines TabStrip-Controls disablen lassen - und zwar auch optisch, so dass der Anwender dies sofort erkennen kann.
Im Normalfall werden Controls, die disabled sind, grau angezeigt. Leider trifft dies nicht für das TabStrip-Control zu. Setzt man die Enabled-Eigenschaft auf FALSE, sind die einzelnen Reiter nicht mehr auswählbar, aber der Anwender kann dies leider nicht erkennen, da die Texte weiterhin schwarz angezeigt werden.
Wie kann man die Reiter aber auch optisch "disablen"?
Und vor allem: Wie kann man einzelne Registerkarten disablen?
Folgende Überlegung: Wir zeichnen den Text einfach neu Und zwar in grauer Schrift.
Glücklicherweise kann man jedem Reiter ein Bild zuordnen. Was liegt also näher, als die Texte der einzelnen Registerkarten als Bild zuzuordnen?
Starten Sie ein neues Projekt, ziehen das TabStrip-Control auf die Form, dazu noch ein ImageList-Control, einen Command-Button und eine PictureBox mit der Eigenschaft BorderStyle = 0 und Appearance = 0.
Im Form_Load Ereignis erstellen wir zunächst die einzelnen Registerkarten. Anschließend erstellen wir die Bilder, sowohl für den normalen Zustand, als auch für den disabled Zustand. Die Bilder für den "normalen" Zustand ordnen wir dann den einzelnen Registerkarten zu.
Private Sub Form_Load() Dim i As Integer Dim u As Integer Picture1.AutoRedraw = True Picture1.BackColor = vbButtonFace Picture1.Visible = False ' Reiter erstellen With TabStrip1 .Tabs.Clear .Tabs.Add , , "Reiter 1" .Tabs.Add , , "Reiter 2" .Tabs.Add , , "Reiter 3" ' Bilder für die Texte erstellen und dem ' ImageList hinzufügen For i = 1 To .Tabs.Count For u = 1 To 2 Picture1.Cls Picture1.CurrentY = 45 Picture1.ForeColor = IIf(u = 1, vbButtonText, vbGrayText) Picture1.Width = .Tabs(.Tabs.Count).Width - 150 Picture1.Height = .Tabs(.Tabs.Count).Height Picture1.Print .Tabs(i).Caption ImageList1.ListImages.Add , IIf(u = 1, "e", "d") & CStr(i), _ Picture1.Image Next u Next i Picture1.AutoRedraw = False ' ImageList dem TabStrip zuweisen Set .ImageList = ImageList1 ' Beschriftung durch Bild für den ' normalen Zustand ersetzen For i = 1 To .Tabs.Count .Tabs(i).Caption = "" .Tabs(i).Image = "e" & CStr(i) Next i End With End Sub
An dieser Stelle sei angemerkt, dass Sie auf diese Weise auch die Textfarbe für den normalen Zustand individuell festlegen können. Einfach anstelle von vbButtonText den gewünschten Farbwert einsetzen
Um nun alle Registerkarten zu disablen, tauschen wir jetzt einfach die jeweiligen Bilder aus und setzen die Enabled-Eigenschaft des TabStrip-Controls auf False:
Dim i As Integer ' alle Register disablen/enablen For i = 1 To TabStrip1.Tabs.Count With TabStrip1.Tabs(i) .Image = "d" & CStr(i) End With Next i TabStrip1.Enabled = False
Ok... kein Problem. Der Anwender sieht nun auch optisch, dass das Register-Control komplett inaktiv ist.
Leider lässt sich das TabStrip-Control immer nur vollständig disablen, verfügt also nicht über die Möglichkeit, einzelne Register zu disablen. Das war bisher. Ab sofort ist auch das kein Problem Um eine einzelne Registerkarte zu disablen blenden wir zunächst auf "graue" Bild um und prüfen im Click-Ereignis, ob der User versucht, die inaktive Registerkarte zu öffnen. Falls dies der Fall ist, wechseln wir einfach zur vorigen Registerkarte.
' 2. Register disablen With TabStrip1.Tabs(2) .Image = "d" & CStr(nTab) End With
Private Sub TabStrip1_BeforeClick(Cancel As Integer) ' aktuelles Register merken TabStrip1.Tag = TabStrip1.SelectedItem.Index End Sub
Private Sub TabStrip1_Click() ' Falls Reiter disabled... With TabStrip1 If Left$(.SelectedItem.Image, 1) = "d" Then ' ...vorigen Reiter wieder öffnen Set .SelectedItem = .Tabs(Val(.Tag)) End If End With End Sub
So... packen wir obigen Code zum Disablen aller bzw. einzelner Registerkarte nun in eine universelle Prozedur, die es erlaubt den Status von Enabled auf Disabled und umgekehrt zu setzen:
' Alle/einzelne Register disablen/enablen Public Sub SetTabStripEnabled(ByVal nTab As Integer, _ ByVal bEnabled As Boolean) Dim i As Integer If nTab = 0 Then ' alle Register disablen/enablen For i = 1 To TabStrip1.Tabs.Count With TabStrip1.Tabs(i) .Image = IIf(bEnabled, "e", "d") & CStr(i) End With Next i TabStrip1.Enabled = bEnabled Else ' einzelne Registerkarte disablen/enablen If TabStrip1.Enabled = True Then With TabStrip1.Tabs(nTab) .Image = IIf(bEnabled, "e", "d") & CStr(nTab) End With End If End If End Sub
Der Aufruf erfolgt dann so:
' alle Registerkarten disablen SetTabStripEnabled 0, False
' alle Registerkarten enablen SetTabStripEnabled 0, True
' einzelne Registerkarte disablen SetTabStripEnabled 2, False
' einzelne Registerkarten enablen SetTabStripEnabled 2, True