Im nachfolgenden möchten wir Ihnen verschiedene Möglichkeiten zum Durchsuchen einer ComboBox bzw. Standard-ListBox zeigen. Hierbei kommt u.a. auch eine WinAPI-Funktion zum Einsatz, mit der sich eine Liste sehr schnell durchsuchen lässt. Diese Variante hat jedoch einen Nachteil: Die Suche kann nicht global innerhalb eines Eintrags erfolgen, wobei zusätzlich auch immer die Groß-/Kleinschreibung ignoriert wird. Unsere Suchfunktion soll aber universell einsetzbar sein, d.h. es soll auch möglich sein, global oder nach Teilbegriffen zu suchen, mit oder ohne Berücksichtigung der Groß-/Kleinschreibung. Die Funktion selbst lässt sich sehr einfach verwenden. Als ersten Parameter übergeben Sie der Funktion das Control (also ComboBox oder ListBox). Der zweite Parameter legt den Suchbegriff fest. Soll nach einem Teilbegriff gesucht werden, verwenden Sie folgende "Regeln":
Und hier ist sie - die Universal-Suchroutine für Combo- und ListBoxen: ' 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, _ ByVal lParam As String) As Long Private Const LB_FINDSTRING = &H18F Private Const LB_FINDSTRINGEXACT = &H1A2 Private Const CB_FINDSTRING = &H14C Private Const CB_FINDSTRINGEXACT = &H158 ' Universal-Suchroutine für Combo-/Listboxen Public Function IsItemInList(Liste As Control, _ ByVal strItem As String, _ Optional ByVal lngStart As Long = 0, _ Optional ByVal bIgnoreCase As Boolean = False) As Long Dim Index As Long Dim I As Long Dim lngCount As Long Dim lngLen As Long Dim wMsg As Long ' Kann die schnelle API-Funktion verwendet werden? ' Voraussetzung: ' exakte Suche, oder Suche nach Teilbegriff von links ' UND Groß-/Kleinschreibung ignorieren If Left$(strItem, 1) <> "*" And bIgnoreCase Then ' Voraussetzungen erfüllt! If TypeOf Liste Is ListBox Then wMsg = IIf(Right$(strItem, 1) = "*", _ LB_FINDSTRING, LB_FINDSTRINGEXACT) Else wMsg = IIf(Right$(strItem, 1) = "*", _ CB_FINDSTRING, CB_FINDSTRINGEXACT) End If If Right$(strItem, 1) = "*" Then _ strItem = Left$(strItem, Len(strItem) - 1) If lngStart = 0 Then lngStart = -1 Index = SendMessage(Liste.hwnd, wMsg, _ lngStart, strItem) If Index < lngStart Then Index = -1 ElseIf Left$(strItem, 1) <> "*" And _ Right$(strItem, 1) <> "*" And bIgnoreCase = False Then ' exakte Suche unter Berücksichtigung der ' Groß-/Kleinschreibung Index = -1 With Liste lngCount = .ListCount - 1 For I = lngStart To lngCount If .List(I) = strItem Then Index = I: Exit For End If Next I End With ElseIf Left$(strItem, 1) <> "*" And _ Right$(strItem, 1) = "*" And bIgnoreCase = False Then ' Suche beginnend von links unter Berücksichtigung ' der Groß-/Kleinschreibung strItem = Left$(strItem, Len(strItem) - 1) lngLen = Len(strItem) Index = -1 With Liste lngCount = .ListCount - 1 For I = lngStart To lngCount If Left$(.List(I), lngLen) = strItem Then Index = I: Exit For End If Next I End With ElseIf Left$(strItem, 1) = "*" And _ Right$(strItem, 1) <> "*" And bIgnoreCase = False Then ' Suche beginnend von rechts unter Berücksichtigung ' der Groß-/Kleinschreibung strItem = Mid$(strItem, 2) lngLen = Len(strItem) Index = -1 With Liste lngCount = .ListCount - 1 For I = lngStart To lngCount If Right$(.List(I), lngLen) = strItem Then Index = I: Exit For End If Next I End With Else ' Globale Suche oder Suche von rechts beginnend, ' Groß-/Kleinschreibung ignorieren Index = -1 With Liste lngCount = .ListCount - 1 For I = lngStart To lngCount If .List(I) Like strItem Then Index = I: Exit For End If Next I End With End If IsItemInList = Index End Function Nun ist die Funktion doch ziemlich umfangreich. Man hätte natürlich gerade die vier letzten "Blöcke" als einen Blockzusammenfassen können, doch wären dann pro Durchlauf (1...ListCount) ziemlich viele If...Then...Else Abfragen notwendig, was die Suche in umfangreichen Listen doch erheblich verlangsamt. Aus diesem Grund haben wir alle Suchvarianten einzeln behandelt. Nur für diejenigen, die wissen möchten, wie man die letzten vier Blöcke hätte zusammenfassen können - hier der Code: lngLen = Len(strItem) - 1 Index = -1 With Liste lngCount = .ListCount - 1 For I = lngStart To lngCount If Left$(strItem, 1) <> "*" And _ Right$(strItem, 1) <> "*" And bIgnoreCase = False Then ' exakte Suche unter Berücksichtigung der ' Groß-/Kleinschreibung If .List(I) = strItem Then Index = I: Exit For ElseIf Left$(strItem, 1) <> "*" And _ Right$(strItem, 1) = "*" And bIgnoreCase = False Then ' Suche beginnend von links unter Berücksichtigung ' der Groß-/Kleinschreibung If Left$(.List(I), lngLen) = Left$(strItem, lngLen) Then Index = I: Exit For End If ElseIf Left$(strItem, 1) = "*" And _ Right$(strItem, 1) <> "*" And bIgnoreCase = False Then ' Suche beginnend von rechts unter Berücksichtigung ' der Groß-/Kleinschreibung If Right$(.List(I), lngLen) = Mid$(strItem, 2) Then Index = I: Exit For End If Else ' Globale Suche oder Suche von rechts beginnend, ' Groß-/Kleinschreibung ignorieren If .List(I) Like strItem Then Index = I: Exit For End If Next I End With Dieser Tipp wurde bereits 21.216 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. sevOutBar 4.0 Vertikale Menüleisten á la Outlook Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |