@FluidByte: Hab' da doch noch eine Frage (ich habe mich bemüht, es selbst herauszukriegen, aber nicht geschafft): Ich habe Dein Event-Handling innerhalb der Repeat-Schleife ergänzt um die im Forum gepostete Autocomplete-Prozedur. Wenn ich jetzt z. B. "dies" eingebe, dann sieht man nicht den Anfang des Eintrags "dies ist ein Beispiel für langen Eintrag". Vielleicht hast Du da noch eine Idee.
Hier ist mein Code:
Code: Alles auswählen
Declare ComboboxAutoComplete(WindowID, Message, wParam, lParam)
#combo = 1
If OpenWindow(0, 40, 40, 300, 400,"Combobox", #PB_Window_SystemMenu)
If CreateGadgetList(WindowID(0))
ComboBoxGadget(#combo, 80, 40, 120, 300, #PB_ComboBox_Editable | #CBS_NOINTEGRALHEIGHT)
EndIf
EndIf
;Callback-Prozedur für Autocomplete-Funktion der Combobox
SetWindowCallback(@ComboboxAutoComplete())
;Aufklappen der Combobox
SendMessage_(GadgetID(#combo),#CB_SHOWDROPDOWN,1,0)
;Fokus auf Combobox setzen
SetActiveGadget(#combo)
;Füllen der Combobox
AddGadgetItem(#combo, -1, "kurzer Eintrag")
AddGadgetItem(#combo, -1, "dies ist ein Beispiel für langen Eintrag")
AddGadgetItem(#combo, -1, "wieder kurz")
AddGadgetItem(#combo, -1, "noch ein Beispiel für einen langen Eintrag")
AddGadgetItem(#combo, -1, "kurz")
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
Select EventGadget()
Case #combo
If EventType() = #CBN_SELCHANGE
SendMessage_(GadgetID(#combo),#CB_SETEDITSEL,0,0)
EndIf
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
End
Procedure ComboboxAutoComplete(WindowID, Message, wParam, lParam)
Protected comboWert.s, comboIndex.l, comboLang.l, comboStart.l, parameter.l
Protected start.l, ende.l
result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_COMMAND
Select lParam
Case GadgetID(#combo)
Select (wParam >> 16 & $FFFF)
Case #CBN_EDITUPDATE
If GetAsyncKeyState_(#VK_BACK) Or GetAsyncKeyState_(#VK_DELETE)
;tu nix
Else
comboWert = GetGadgetText(#combo)
comboIndex = SendMessage_(lParam, #CB_FINDSTRING, -1, @comboWert)
comboStart = Len(comboWert)
;Länge des eingegebenen Textes
If comboIndex >= 0
SendMessage_(lParam, #CB_SETCURSEL, comboIndex, 0)
comboLang = Len(GetGadgetText(#combo))
;Länge des gefundenen Textes
parameter = (comboLang << 16 & $FFFFFFFF) + comboStart
SendMessage_(lParam, #CB_SETEDITSEL, 0, parameter)
EndIf
EndIf
EndSelect
EndSelect
EndSelect
ProcedureReturn result
EndProcedure