Seite 2 von 2

Verfasst: 27.10.2008 01:20
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

Verfasst: 27.10.2008 20:00
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

Verfasst: 27.10.2008 22:16
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