Autocomplete bei Comboxgadgets

Für allgemeine Fragen zur Programmierung mit PureBasic.
Calloway
Beiträge: 106
Registriert: 15.09.2004 23:26

Autocomplete bei Comboxgadgets

Beitrag von Calloway »

Hallo! Sorry, dass ich meine Anfrage noch einmal poste, aber es scheint, als wäre sie im Originalthread untergegangen.

Ich habe folgenden Code von Karl für PB4 angepasst:

Code: Alles auswählen

#comboTest = 0 



Procedure cmbAutoComplete(WindowID, Message, wParam, lParam) 
  
  Protected comboWert.s, comboIndex.l, comboLang.l, comboStart.l, parameter.l 
  
  result = #PB_ProcessPureBasicEvents 
  
  
  Select Message 
    Case #WM_COMMAND 
      Select lParam 
        Case GadgetID(0) 
          Select (wParam >> 16 & $FFFF) 
            Case #CBN_EDITUPDATE 
              comboWert = GetGadgetText(#comboTest) 
              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(#comboTest)) 
                ;Länge des gefundenen Textes 
                parameter = (comboLang << 16 & $FFFFFFFF) + comboStart 
                SendMessage_(lParam, #CB_SETEDITSEL, 0, parameter) 
              EndIf 
          EndSelect 
      EndSelect 
  EndSelect 

  ProcedureReturn result 
  
EndProcedure 

Procedure InitWindow() 
  
  ;Window zeichnen und ComboBox aus einer externen Datei füllen (jede Zeile = ein Eintrag) 
  
  If OpenWindow(0, 0, 0, 400, 200, #PB_Window_SystemMenu, "Test") 
    If CreateGadgetList(WindowID(0)) 
      ComboBoxGadget(#comboTest, 10, 10, 180, 150, #PB_ComboBox_Editable) 
    EndIf 
    ReadFile(0, "cmb.txt") 
    While ~Eof(0) 
      AddGadgetItem(0, -1, ReadString()) 
    Wend 
    CloseFile(0) 
  EndIf 

EndProcedure 


InitWindow() 
SetWindowCallback(@cmbAutoComplete()) 

Repeat 
  
Until WaitWindowEvent() = #PB_Event_CloseWindow 

End
Bei beiden Versionen (für 3.94 und 4.0) kann ich, solange das Gadget erkannt hat, dass man einen Eintrag aus der Liste eingeben möchte und diesen Eintrag markiert in das Gadget schreibt, die Delete- und Backspace-Taste nicht mehr verwenden. Das funktioniert erst wieder, wenn man etwas ins Gadget schreibt, das nicht in der Liste steht. Kann man das noch korrigieren?

Wie kann ich den Code so umstricken, dass ich quasi eine Prozedur habe "SetComboBoxGadgetAutoComplete(Gadget)" habe? Ich kenne mich mit den API-Sachen nicht so aus. Der obige Code ist ja nur ein bestimmtes Gadget gedacht.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Das Problemkommt durch das Markieren. Durch die Loeschtasten loescht
nur den markierten Text. Dies wiederum loest CBN_EDITUPDATE aus.
Das ganze Spiel geht nun von vorne los ...
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag von Karl »

Ich hab das heute erst gesehen, aber mit einem kleinen Kniff kann man das Problem beseitigen:

Code: Alles auswählen

...
If GetAsyncKeyState_(#vk_back) Or GetAsyncKeyState_(#vk_delete)
  ;tu nix
Else
  comboWert = GetGadgetText(#comboTest)
  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(#comboTest))
    ;Länge des gefundenen Textes
    parameter = (comboLang << 16 & $FFFFFFFF) + comboStart
    SendMessage_(lParam, #CB_SETEDITSEL, 0, parameter)
  EndIf
EndIf
...
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Autocomplete bei Comboxgadgets

Beitrag von marcelx »

Hallo,

ich habe 2 comboxgadets - wie kann ich Autocomplete verwenden?
Kann ich 2 SetWindowCallback() aufrufen?

Danke für eine Hilfe

Gruß MarcelX
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Autocomplete bei Comboxgadgets

Beitrag von marcelx »

Gelöst - mit Block für GadgetID(0) auf GadgetID(1) kopiert in der Procedure cmbAutoComplete

Code: Alles auswählen

        Case GadgetID(0)
...
        Case GadgetID(1)
...
Win-10, PB 5.31 (Windows - x86)
Antworten