Seite 1 von 2

Combobox

Verfasst: 31.10.2008 18:36
von Andi
Hallo zusammen! Mit dem unten stehenden Code habe ich folgendes Problem: Wenn ich die Dropdown-Liste durchlaufe, dann werden die einzelnen Items zwar in der oberen Zeile angezeigt, aber bei den langen Einträgen fehlt der Anfang, weil die Darstellung von rechts nach links geht. Gibt es dafür eine Lösung? - Andi

Code: Alles auswählen

#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

;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
   event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow

End 

Re: Combobox

Verfasst: 31.10.2008 18:46
von Kiffi
Andi hat geschrieben:Gibt es dafür eine Lösung?
http://www.purebasic.fr/german/viewtopi ... 743#215743

Grüße ... Kiffi

Verfasst: 31.10.2008 19:31
von Andi
Danke, Kiffi, für Deine Antwort. Aber ich glaube, ich meine etwas anderes. Die Dimensionen der Combobox sollen unverändert bleiben. Die langen Einträge (sie sind länger als das Combobox-Gadget breit ist) sollen oben in der Editierzeile so dargestellt sein, dass man ihren Anfang sieht und nicht ihr Ende.

Verfasst: 31.10.2008 20:10
von Waldixxl
Schuld an Deinem Problem ist der Konstante #PB_ComboBox_Editable
diese setzt den Curser an das Ende der Zeile

Verfasst: 31.10.2008 20:25
von Fluid Byte

Code: Alles auswählen

#CMB_Eintrag = 101

OpenWindow(0,50,50,300,400,"Combobox",#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ComboBoxGadget(#CMB_Eintrag,80,40,120,300,#PB_ComboBox_Editable | #CBS_NOINTEGRALHEIGHT)

SetActiveGadget(#CMB_Eintrag)

SendMessage_(GadgetID(#CMB_Eintrag),#CB_SHOWDROPDOWN,1,0)

AddGadgetItem(#CMB_Eintrag,-1,"kurzer Eintrag")
AddGadgetItem(#CMB_Eintrag,-1,"dies ist ein Beispiel für langen Eintrag")
AddGadgetItem(#CMB_Eintrag,-1,"wieder kurz")
AddGadgetItem(#CMB_Eintrag,-1, "noch ein Beispiel für einen langen Eintrag")
AddGadgetItem(#CMB_Eintrag,-1,"kurz")
     
Repeat
   EventID = WaitWindowEvent()
   
	If EventID = #PB_Event_Gadget
		Select EventGadget()
			Case #CMB_Eintrag
			If EventType() = #CBN_SELCHANGE
				SendMessage_(GadgetID(#CMB_Eintrag),#CB_SETEDITSEL,0,0)
			EndIf
		EndSelect
	EndIf
Until EventID = #PB_Event_CloseWindow

Verfasst: 31.10.2008 21:16
von Andi
@FluidByte: What can I say? - Grossartig. Danke.

Verfasst: 31.10.2008 22:42
von Andi
@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

Verfasst: 02.11.2008 16:00
von dysti
So geht es:

Code: Alles auswählen

SendMessage_(lParam, #CB_SETEDITSEL, 0, 0);parameter)

Verfasst: 02.11.2008 17:16
von Andi
No, so geht's leider auch nicht; zwar steht der Cursor am Anfang, aber der Autocomplete-Mechanismus klappt nicht mehr!

Verfasst: 03.11.2008 10:11
von dysti
Also, bei mir funzt es,
aber es geht auch so:

Code: Alles auswählen

SendMessage_(lParam, #CB_SETEDITSEL, 0, parameter)
SendMessage_(lParam, #CB_SETEDITSEL, 0,0)