Zum Beispiel:
1. Eintippen von 'An' führt zu dem Eintrag 'Andreas', wobei nur der ergänzte Teil, also 'ndreas' markiert ist
2. Anschließendes Cursor-Down um eine Position führt zum Eintrag 'Anna', der vollständig markiert ist
3. Anschließendes Eintippen von 'c' führt zu dem Eintrag 'Carola', wobei nur der ergänzte Teil, also 'arola' markiert ist. (Super, so muss es sein!)
Wenn ich aber den Code unter PB 5.50 oder PB 5.60 kompiliere, bekomme ich ein merkwürdiges Verhalten:
Die Schritte 1. und 2. ergeben das gleiche Verhalten. Aber der 3. Schritt - also Eintippen von 'c' - führt zu dem Eintrag 'Anna'. (Nicht gut, macht keinen Sinn!)
Der Schlüssel für die Lösung des Problems muss in der Autocomplete-Funktion liegen. Ich erkenne aber nichts, was durch die neuen Versionen PB 5.50 bzw. PB 5.60 beeinflusst wäre.
Code: Alles auswählen
Declare ComboboxAutoComplete(WindowID, Message, wParam, lParam)
#window = 0
#combo = 0
Global index_auto ;wird in der ComboxAutoComplete-Prozedur verändert
OpenWindow(#Window, 0, 0, 400, 200, "Combobox mit AutoComplete", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
ComboBoxGadget(#combo, 40, 40, 260, #Null, #PB_ComboBox_Editable | #CBS_NOINTEGRALHEIGHT)
MoveWindow_(GadgetID(#combo),GadgetX(#combo),GadgetY(#combo),GadgetWidth(#combo), 22, #True)
;Die Combobox mit Namen füllen
AddGadgetItem(#combo, -1, "Albert")
AddGadgetItem(#combo, -1, "Alfred")
AddGadgetItem(#combo, -1, "Andreas")
AddGadgetItem(#combo, -1, "Anna")
AddGadgetItem(#combo, -1, "Barbara")
AddGadgetItem(#combo, -1, "Bernd")
AddGadgetItem(#combo, -1, "Berta")
AddGadgetItem(#combo, -1, "Birgit")
AddGadgetItem(#combo, -1, "Carola")
AddGadgetItem(#combo, -1, "Claus")
SetActiveGadget(#combo)
SetWindowCallback(@ComboboxAutoComplete())
Repeat
event = WaitWindowEvent()
If event = #PB_Event_CloseWindow
quit = #True
EndIf
If event = #PB_Event_Gadget
If EventGadget() = #combo
If GetAsyncKeyState_(#VK_DOWN)
ind = index_auto + 1
SetGadgetState(#combo, ind)
index_auto = ind
EndIf
If GetAsyncKeyState_(#VK_UP)
ind = index_auto - 1
If ind < 0
ind = 0
EndIf
SetGadgetState(#combo, ind)
index_auto = ind
EndIf
EndIf
EndIf
Until quit = #True
Procedure ComboboxAutoComplete(WindowID, Message, wParam, lParam)
Protected result.l
Protected comboWert.s, comboLang.l, comboStart.l, parameter.l, start.l, ende.l
Static comboIndex.l
result = #PB_ProcessPureBasicEvents
Select Message
;Case #WM_PAINT
Case #WM_COMMAND
Select lParam
Case GadgetID(#combo)
Select (wParam >> 16 & $FFFF)
Case #CBN_EDITUPDATE
If GetAsyncKeyState_(#VK_BACK) Or GetAsyncKeyState_(#VK_DELETE)
comboWert = GetGadgetText(#combo)
If comboIndex >= 0 ;da Var beim Aufruf zuvor bestimmt, muss sie als static definiert sein
combowert = Left(comboWert, Len(combowert)-1)
EndIf
Else
comboWert = GetGadgetText(#combo)
EndIf
;
comboIndex = SendMessage_(lParam, #CB_FINDSTRING, -1, @comboWert)
comboStart = Len(comboWert) ;Länge des eingegebenen Textes
If combostart = 0
SetGadgetText(#combo, "")
EndIf
;
If comboIndex >= 0 ;es gibt einen Match
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)
index_auto = GetGadgetState(#combo)
EndIf
EndSelect
EndSelect
EndSelect
ProcedureReturn result
EndProcedure