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
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)