Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Caret in TEdit /TComboBox an X/Y - Position setzen (https://www.delphipraxis.net/119999-caret-tedit-tcombobox-x-y-position-setzen.html)

ralfiii 4. Sep 2008 10:37


Caret in TEdit /TComboBox an X/Y - Position setzen
 
Hallo!

Wie kann man das Caret (=den blinkenden Cursor) in einer Combobox an eine bestimmte Stelle setzen?
(ausgehend von Ziel-Koordinaten in Pixel)

Hintergrund: Man kann per Drag&Drop Labels in die Combobox ziehen.
Wenn die Drag-operation auf der Combobox beendet wird, soll an dieser Stelle der entsprechende Text eingefügt werden.
Ich dachte ich setze den Cursor schon jeweils im OnDragOver auf die aktuelle Position. Aber wie?!?

(d.h. ich hab X/Y-Pixel-Koordinaten und weiss noch NICHT an welcher Zeichen-Position das dann währe. SelStart fällt also aus)

Danke,
Ralf

taaktaak 4. Sep 2008 10:49

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
xxxxx << War Unsinn, nicht ganz gelesen, sorry.

DeddyH 4. Sep 2008 10:50

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
Geht das nicht mit MSDN-Library durchsuchenSetCaretPos?

ralfiii 4. Sep 2008 11:02

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
Zitat:

Zitat von DeddyH
Geht das nicht mit MSDN-Library durchsuchenSetCaretPos?

Das könnte schon sein, aber WIE?!?
Ich hab schon vorher eine Zeitlang damit herumprobiert und bin zu keinen vernünftigen Ergebnissen gekommen. :wall:

HILFE!!!
Danke!

DeddyH 4. Sep 2008 11:06

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
Hab mal schnell in der DP gestöbert und bin auf diesen Post gestoßen. Versuch' s mal.

ralfiii 4. Sep 2008 11:51

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
Zitat:

Zitat von DeddyH
Hab mal schnell in der DP gestöbert und bin auf diesen Post gestoßen. Versuch' s mal.

Schöner Mist!
Hab das früher schon mal ausprobiert, hat nicht funktioniert.
Jetzt bin ich draufgekommen, das funktioniert bei TEdit, nicht aber bei TCombobox.

Danke für den Tip, werd' wohl einfach ein verstecktes Dummy-TEdit mit der da beschriebenen Methode verwenden um die Caret-Position zu bestimmen.

taaktaak 4. Sep 2008 11:57

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
Warum hat es nicht funktioniert?
Weil du nicht an das Handle vom Edit herangekommen bist?
Verfolge mal den Source von TComboBox, an das Handle kommst du schon 'ran.

ralfiii 4. Sep 2008 12:06

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
Zitat:

Zitat von taaktaak
Warum hat es nicht funktioniert?

CaretPos:=SendMessage(MyTestControl.Handle, EM_CHARFROMPOS, 0, Integer(@pt));
hat bei mir gar nix getan,
CaretPos:=MyTestControl.Perform(EM_CHARFROMPOS, 0, X);
geht aber. Zumindest bei TEdit.

Ist von hier

taaktaak 4. Sep 2008 20:14

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
Du hast das Handle der Combobox übergeben, du benötigst aber das Handle des eingebetteten Edits. Daher funktioniert das nicht.

Der Vorfahr TCustomCombo kennt dieses Handle, schau mal in den Source - es ist dort allerdings als "protected" deklariert. Deswegen kannst du in TComboBox nicht darauf zugreifen. Du kannst jetzt z. B. eine eigene Combobox ableiten, das EditHandle darin veröffentlichen "public" und dann natürlich benutzen.

Delphi-Quellcode:
type tMyCombo = class(TCustomCombobox)
                  public
                    property EditHandle;
                  end;

procedure Tfo~~.FormShow(Sender:TObject);
var cb :tMyCombo;
begin
  cb:=tMyCombo.Create(Self);
  cb.Parent:=Self;
  cb.Top  :=200;
  cb.Left :=400;
  cb.Text :=IntToStr(cb.EditHandle); // << das ist das Edit-Handle
  // ..
end;
Das ist natürlich nur ein Beispielschema ...

ralfiii 5. Sep 2008 12:04

Re: Caret in TEdit /TComboBox an X/Y - Position setzen
 
Zitat:

Zitat von taaktaak
Du hast das Handle der Combobox übergeben, du benötigst aber das Handle des eingebetteten Edits. Daher funktioniert das nicht.
Der Vorfahr TCustomCombo kennt dieses Handle, schau mal in den Source - es ist dort allerdings als "protected" deklariert
<Snip>

Ok, I see.

Einfachere Lösung: hacken und drübercasten. In der gleichen Unit kommt man ja auch auf die Protected-Teile.

Delphi-Quellcode:
type
  TCrackCombobox = class(TCombobox)
end;
procedure TForm1.Edit1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var i : integer;
begin
     i:=SendMessage(TCrackCombobox(ComboBox1).EditHandle, EM_CHARFROMPOS, 0, x);
     if i>=0 then ...
Danke für den Denkanstoss! :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz