Combobox

Anfängerfragen zum Programmieren mit PureBasic.
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Combobox

Beitrag 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 
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Combobox

Beitrag von Kiffi »

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

Grüße ... Kiffi
a²+b²=mc²
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag 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.
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Benutzeravatar
Waldixxl
Beiträge: 108
Registriert: 27.12.2005 17:35
Wohnort: Linz, Österreich

Beitrag von Waldixxl »

Schuld an Deinem Problem ist der Konstante #PB_ComboBox_Editable
diese setzt den Curser an das Ende der Zeile
Lesen bei schlechten Lichtverhältnissen ist nicht schlecht für die Augen, sondern trainiert sie sogar.

Linux Ubuntu Mate 18.04
PB 5.71
Intel i5
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Windows 10 Pro, 64-Bit / Outtakes | Derek
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag von Andi »

@FluidByte: What can I say? - Grossartig. Danke.
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag 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
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

So geht es:

Code: Alles auswählen

SendMessage_(lParam, #CB_SETEDITSEL, 0, 0);parameter)
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag von Andi »

No, so geht's leider auch nicht; zwar steht der Cursor am Anfang, aber der Autocomplete-Mechanismus klappt nicht mehr!
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag 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)
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten