ComboBoxGadget() - Wie Cursorposition setzen bzw. auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

ComboBoxGadget() - Wie Cursorposition setzen bzw. auslesen

Beitrag von Ghosty1967 »

Hallo zusammen...
Eine kleine Frage zum ComboBox-Gadget. Immerhalb eines String-Gadgets kann ich ohne Probleme die aktuelle
Cursorposition einlesen bzw. setzen. Als Prozedur sieht das dann bei mir so aus (aus dem CodeArchiv)...

Code: Alles auswählen

Procedure GetCursorX(Gadget.l)  
  SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Min, @Max)
  ProcedureReturn Max - SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, SendMessage_(GadgetID(Gadget), #EM_LINEFROMCHAR, Min, 0), 0)
EndProcedure  

Procedure SetCursorX(Gadget.l, PosFrom.l, PosTo.l)  
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, PosFrom, PosTo)
EndProcedure  
Nehme ich statt eines StringGadgets ein ComboBoxGadget (mit #PB_ComboBox_Editable) funktioniert keine der beiden
Prozeduren. Wo liegt denn hier der Fehler bzw. weiss jemand wie es gehen kann?!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von edel »

Da heissen die Konstanten #CB_GETEDITSEL und #CB_SETEDITSEL.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von Ghosty1967 »

Danke!...
Hab jetzt mal die Konstanten #CB_GETEDITSEL und #CB_SETEDITSEL eingesetzt...
Also, das auslesen der Cursorposition funktioniert jetzt, aber das setzen geht überhaupt nicht...
Könnte mir evtl. jemand die Proceduren umstricken, damit ich sehe, wo mein Fehler liegt...
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von RSBasic »

Code: Alles auswählen

EnableExplicit

Procedure SetCursorX(Gadget, PosFrom, PosTo) 
  SendMessage_(GadgetID(Gadget), #CB_SETEDITSEL, 0, PosFrom << 16 + PosTo)
EndProcedure  

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ComboBoxGadget(1, 10, 10, 200, 20, #PB_ComboBox_Editable)
  AddGadgetItem(1, -1, "Langer Text Langer Text Langer Text", 0, 0)
  SetGadgetState(1, 0)
  SetActiveGadget(1)
  
  SetCursorX(1, 5, 10)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von Ghosty1967 »

Super, SetCursorX() funktioniert... vielen Dank!
Aber könnte ich auch bei GetCursorX() Hilfe bekommen, die Prozedur zeigt mir nicht etwar wie
gewünscht die aktuelle Position des Textcursors innerhalb der ComboBox an, sondern immer
die Gesamtlänge des Textes innerhalb der ComboBox. :(

Code: Alles auswählen

Procedure GetCursorX()  
  SetActiveGadget(#cmb_Maske)
  SendMessage_(GadgetID(#cmb_Maske), #CB_GETEDITSEL, @Min, @Max)
  ProcedureReturn Max - SendMessage_(GadgetID(#cmb_Maske), #EM_LINEINDEX, SendMessage_(GadgetID(#cmb_Maske), #EM_LINEFROMCHAR, Min, 0), 0)
EndProcedure  
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von Ghosty1967 »

Hallo zusammen...
ich habe dieses Thema nochmal rausgekramt, weil ich wieder einmal vor dem gleichen Problem stehe wie schon
damals, als ich dieses Thema erstellt habe. Damals habe ich das Problem aus dem Auge verloren, aber nun möchte
ich gerne nocheinmal nachfragen, ob jemand eine Lösung für mein "Problemchen" hat. Ich habe bereits im englischen
und sogar im französischen Forum gesucht, finde aber leider keine funktionierende Lösung für das Problem die Cursor-
position in einem editierbaren "ComboboxGadget" auszulesen.
Das setzen des Cursors an eine Position funktioniert gut, ist aber eher uninteressant für mich.
Mein ketzter Stand beim rumprobieren:

Code: Alles auswählen

Procedure SetCursorX(Gadget, PosFrom, PosTo)
  ;Setzen des Cursors im ComboboxGadget an eine bestimmte Position
  SendMessage_(GadgetID(Gadget), #CB_SETEDITSEL, 0, PosFrom << 16 + PosTo)
EndProcedure

Procedure GetCursorX(Gadget) 
  ;Auslesen der Cursorposition innerhalb des Combobox-Textes
  SetActiveGadget(Gadget)
  SendMessage_(GadgetID(Gadget),#CB_GETEDITSEL,@a, @b) ; End.
  Debug a
  Debug b
EndProcedure 
GetCursorX liefert mir aber IMMER nur die Gesamtlänge des aktuellen Textes im ComboboxGadget....
Deswegen frage ich vorsichtig nocheinal, ob jemand eine funktionierende Lösung für mich hat?
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von Bisonte »

Windows API hat geschrieben: DWORD start, end;

// Get the range from [out] parameters.
// hwnd is the handle of the combo box control.
SendMessage(hwnd, CB_GETEDITSEL, (WPARAM)&start, (LPARAM)&end;

// Get the range from the return value.
DWORD range = SendMessage(hwnd, CB_GETEDITSEL, NULL, NULL);
start = LOWORD(range);
end = HIWORD(range);
Da sieht es so aus als müsse noch am Ergebnis gefeilt werden....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von Shardik »

In GetCursorX() darf kein SetActiveGadget() aufgerufen werden, da dadurch der komplette Eintrag markiert wird. So funktioniert es:

Code: Alles auswählen

EnableExplicit

Procedure GetCursorX()
  Protected Range

  Range = SendMessage_(GadgetID(1), #CB_GETEDITSEL, 0, 0)
  Debug "Startposition = " + Str(Range & $FFFF)
  Debug "Endposition = " + Str(Range >> 16)
EndProcedure

Procedure SetCursorX(Gadget, PosFrom, PosTo)
  SendMessage_(GadgetID(Gadget), #CB_SETEDITSEL, 0, PosFrom << 16 + PosTo)
EndProcedure 

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ComboBoxGadget(1, 10, 10, 200, 20, #PB_ComboBox_Editable)
  AddGadgetItem(1, -1, "Langer Text Langer Text Langer Text", 0, 0)
  SetGadgetState(1, 0)
  SetActiveGadget(1)
 
  SetCursorX(1, 5, 10)
  GetCursorX()
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von Ghosty1967 »

WOW... :D :D perfekt!
DANKE!!!
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: ComboBoxGadget() - Wie Cursorposition setzen bzw. ausles

Beitrag von Ghosty1967 »

Also, ich war glaube ich etwas voreilig. Ich habe gemerkt, das die Lösung von Shardik doch nicht so funktioniert,
wie ich das gerne hätte. Das Problem ist glaube ich grundsätzlich, das die aktuelle Cursorposition immer nur dann
richtig ausgegeben wird, wenn das Gadget auch aktiviert ist. Ich verstehe das durchaus, und denke, man müsste
das z.B. über einen Callback realisieren können.
Ich bin bei den Messeges in Callbacks ein absoluter Anfänger und habe es mal mit "#WM_NOTIFY" versucht. So
funtioniert es auch einigermaßen, allerdings muss man immer erst die Maus über ein anderes Gadget bewegen.

Am besten wäre es, wenn die Position des Cursors immer wenn das ComboboxGadget aktiviert ist und der Cursor
bewegt wird in eine Variable geschrieben würde und diese global abzufragen wäre... GEHT DAS...UND WIE...?!

Hier mein erster kläglicher Versuch in einem Beispiel...

Code: Alles auswählen

Procedure WindowCallback(WindowID, Message, wParam, lParam)  
  Select Message
    Case #WM_NOTIFY
      xPos.l = SendMessage_(GadgetID(0), #CB_GETEDITSEL, 0, 0) >> 16
      SetGadgetText(3, "XPos: " + Str(xPos))
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents  
EndProcedure  

Procedure SetCursorX(Gadget, xPos)
  ;Setzt den Cursor an die angegebene Position im Text
  SendMessage_(GadgetID(Gadget), #CB_SETEDITSEL, 0, xPos << 16 + xPos)
EndProcedure


If OpenWindow(0,   0,   0, 300,  65, "ComboBoxTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ComboBoxGadget(0,  10,  10, 280,  22, #PB_ComboBox_Editable)
  ButtonGadget  (1,  10,  35, 100,  22, "Zeit einfügen")
  ButtonGadget  (2, 115,  35, 100,  22, "Datum einfügen")
  TextGadget    (3, 230,  39,  60,  22, "XPos:", #PB_Text_Border)
  SetGadgetText (0, "Dies ist ein Testtext...")
  SetActiveGadget(0)
  SetCursorX(0, 13)
  SetWindowCallback(@WindowCallback())  
EndIf

Repeat
  Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            ;Hier soll an der aktuellen Cursorposition im ComboboxGadget
            ;die aktuelle Uhrzeit eingesetzt und der Cursor neu positioniert werden.
          Case 2
            ;Hier soll an der aktuellen Cursorposition im ComboboxGadget
            ;das aktuelle Datum eingesetzt und der Cursor neu positioniert werden.
        EndSelect
    EndSelect
Until Event = #PB_Event_CloseWindow
Antworten