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 19.132 mal aufgerufen.
Anzeige
![]() ![]() ![]() (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. |
sevZIP40 Pro DLL ![]() Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats ![]() Dieter Otter PopUp-Menü wird nicht angezeigt :-( In diesem Tipp verraten wir Ihnen, wie Sie Probleme mit PopUp-Menüs umgehen können, wenn diese unter bestimmten Umständen einfach nicht angezeigt werden. 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. |
||||||||||||||||
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. |