Combobox und Autocomplete

Für allgemeine Fragen zur Programmierung mit PureBasic.
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag von Andi »

Hallo, Falko! Ich habe Deinen Code kopiert und nur die Pfade für die beiden Bitmaps und die txt.Datei geändert. Das Ergebnis ist leider nicht annähernd so, wie es auf Deinen Rechnern der Fall ist:
- Ich sehe keinen Effekt aufgrund der BMPs (das ist vielleicht auch nicht so wichtig)
- Die Combobox-Dropdown-Liste öffnet sich nicht (gut, das kann ich mit dem Ergänzen um den entsprechenden SendMessage-Befehl erreichen, funktioniert bei Dir das Ausklappen ohne diesen Befehl?)
- außerdem muss ich die "If GetGadgetState(0)<0"-Abfrage abschalten, um überhaupt eine Auswahl aus der Item-Liste zu erreichen. Wenn ich dies nicht tue, bleibt das Programm nach der Eingabe von 2 Buchstaben auf dem ersten Eintrag "hängen".
Vielleicht hast Du ja noch eine Idee!!?
Gruß, Andreas
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Hallo Andi,
ich glaube ich hatte da was falsch verstanden. Also wenn du editieren willst,
dann soll sich der AutoComplete-String in der oberen Combobox komplett selectieren.
Dazu musst du den Platz für #CB_SETCURSEL nach unten stellen, wie im nachfolgenden Source:

Code: Alles auswählen

Procedure cmbAutoComplete(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(0)
       ; If GetGadgetState(0)<0
         ; SetGadgetState(0, 1)
        ;EndIf
          Select (wParam >> 16 & $FFFF)
            Case #CBN_EDITUPDATE
             
              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
                SendMessage_(lParam, #CB_SETTOPINDEX, 1, 0)
                If comboIndex >= 0
                 ;SendMessage_(lParam, #CB_SETCURSEL, comboIndex, 0); hier ausklammern
                  comboLang = Len(GetGadgetText(#comboTest))
                  ;Länge des gefundenen Textes
                  parameter = (comboLang << 16 & $FFFFFFFF) + comboStart
                  SendMessage_(lParam, #CB_SETEDITSEL, 0, parameter)
                 ; eybd_event_(#VK_DOWN, 0, 0, 0)
                 ; eybd_event_(#VK_END, 0, 0, 0) 

                 SendMessage_(lParam,#CB_SETCURSEL,comboIndex,0); und hier hinschreiben
                EndIf
              EndIf
            EndSelect
      EndSelect
  EndSelect

  ProcedureReturn result
 
EndProcedure
Dann brauchst du die beiden VK nicht mehr einsetzen, da auch nach Eingabe der komplette automatisch eingesetzte String markiert wird, der in der Liste auftaucht.

Das aufklappen, habe ich bei mir mit dem Pfeilunten-Button in der oberen
Combobox gemacht. Da muss ich noch mal nachschauen

Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag von Andi »

Vielen Dank, Falko, für Deine hilfreichen Anregungen und Tipps, wodurch ich es geschafft habe, mein Problem zu lösen.
Konkret: Am Ende der Autocomplete-Prozedur frage ich den Index des vervollständigten Eintrags ab:

Code: Alles auswählen

index_auto = GetGadgetState(#combobox)
Außerdem führe ich in der Repeat-Schleife ein Combobox-Event-Handling durch, indem ich nach der Cursor-down-Taste abfrage:

Code: Alles auswählen

If EventGadget() = #combobox
   If GetAsyncKeyState_(#VK_DOWN)
       ind = index_auto + 1
       SetGadgetState(#combobox, ind)
       index_auto = ind
    EndIf
endif
Klappt einwandfrei! Nochmals besten Dank! Andi
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Antworten