Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TEdit Cursorposition verwenden (https://www.delphipraxis.net/189832-tedit-cursorposition-verwenden.html)

tcoman 27. Jul 2016 16:13

TEdit Cursorposition verwenden
 
Hallo liebe DP-Gemeinde,

ich kaempfe seit einiger Zeit mit einem wohl nichtigen Problem.
Also, ich habe eine TEdit und eine TListBox Componente auf dem
Formular. Die TListBox wird mit Woertern gefuellt, "Eins ", "Zwei ",
usw.

Das TEdit Feld ist leer.
Nun schreibe ich etwas da hinein, zB. "und ist Drei".
Das TEdit Feld hat den Focus und man sieht den TextCursor am
Ende des Textes blinken.

Jetzt setze ich mit dem Mauszeiger den TextCursor vor dem i
von "ist". Wenn ich nun mit dem Mauszeiger in die TListBox
auf die Zeile "Zwei " klicke, moechte ich, dass dieser Text
in das TEdit Feld an der Position vor dem i eingesetzt wird.
Es muesste jetzt dort "und Zwei ist Drei" stehen.

Leider fuegt mir mein Programm den Text am Ende des Textes an,
so dass nur "und ist DreiZwei " steht.

Meine Frage: Wie kann ich mir die Mauszeiger Position merken,
und den Text dort eintragen?

Jeder Hinweis ist willkommen.
MfG,
Terence

Uwe Raabe 27. Jul 2016 16:19

AW: TEdit Cursorposition verwenden
 
Zitat:

Zitat von tcoman (Beitrag 1343596)
Leider fuegt mir mein Programm den Text am Ende des Textes an,

Zeig mal, was du da machst.

bcvs 27. Jul 2016 18:46

AW: TEdit Cursorposition verwenden
 
Schau dir mal TEdit.Seltext an.

tcoman 31. Jul 2016 14:51

AW: TEdit Cursorposition verwenden
 
Zitat:

Zitat von bcvs (Beitrag 1343624)
Schau dir mal TEdit.Seltext an.

Danke, werde ich probieren.
Sobald ich eine Loesung habe, kommt die hier mit rein.
Ich probiere z.Zt. mit der CursorPosition im TCanvas des
TEdit-Feldes herum, um die Buchstabenstelle zu errechnen,
wo der Text eingefuegt werden soll...

Wahrscheinlich uebersehe ich wieder mal das Naechstliegende
und kompliziere alles nur, aber egal, dabei lernt man auch
was.

@Uwe Raabe : Beispiel kommt, danke Dir.

MfG,
Terence

himitsu 31. Jul 2016 15:00

AW: TEdit Cursorposition verwenden
 
Das Allernaheliegenste übersiehst du immernoch. [edit] Oh, ein Edit. [/edit]

Delphi-Quellcode:
Leider fuegt mir mein Programm den Text am Ende des Textes an,
so dass nur "und ist DreiZwei " steht.
Wie wäre es, wenn du zeigst, wie du das machst, damit man besser sehn kann, was du falsch machst? :roll:


TEdit.SelStart, TEdit.SelLength, TEdit.SelText ...

Uwe Raabe 31. Jul 2016 15:53

AW: TEdit Cursorposition verwenden
 
Zitat:

Zitat von himitsu (Beitrag 1343845)
Wie wäre es, wenn du zeigst, wie du das machst, damit man besser sehn kann, was du falsch machst? :roll:

Ähemm! #2

DeddyH 31. Jul 2016 18:31

AW: TEdit Cursorposition verwenden
 
Andere Posts zu lesen ist in Dresden grundsätzlich out :wink:

himitsu 1. Aug 2016 03:24

AW: TEdit Cursorposition verwenden
 
Pssst, hatte ich gesehn, aber da er geantwortet hatte, ohne darauf einzugehn ....

nja, abgesehn von seinem nachträglichem EDIT :zwinker:

Uwe Raabe 1. Aug 2016 07:58

AW: TEdit Cursorposition verwenden
 
Zitat:

Zitat von tcoman (Beitrag 1343843)
Ich probiere z.Zt. mit der CursorPosition im TCanvas des
TEdit-Feldes herum, um die Buchstabenstelle zu errechnen,
wo der Text eingefuegt werden soll...

Wahrscheinlich uebersehe ich wieder mal das Naechstliegende
und kompliziere alles nur, aber egal, dabei lernt man auch
was.


Wenn der Cursor (eigentlich das Caret) im Edit-Control an der richtigen Stelle steht und kein Text darin markiert ist, dann fügt die Zuweisung

Delphi-Quellcode:
  Edit1.SelText := 'Was auch immer';


den Text an der entsprechenden Stelle ein. Da muss man nichts berechnen oder sonstwas tun.

Wenn im Edit ein Text markiert ist, wird dieser durch den zugewiesenen ersetzt.

tcoman 1. Aug 2016 15:33

AW: TEdit Cursorposition verwenden
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Uwe Raabe (Beitrag 1343597)
Zitat:

Zitat von tcoman (Beitrag 1343596)
Leider fuegt mir mein Programm den Text am Ende des Textes an,

Zeig mal, was du da machst.

Nach reichlich probieren habe ich folgendes produziert.

Scheitert weiterhin daran, dass es mir nicht gelingt
die CursorPosition des TEdit Feldes zu bestimmen...

Delphi-Quellcode:
unit PEnhInpText_Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TPEnhInpText = class(TForm)
    Edit1: TEdit;
    ListBox1: TListBox;
    bExit: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    procedure ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
                                Shift: TShiftState; X, Y: Integer);
    procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
                             Shift: TShiftState; X, Y: Integer);
    procedure bExitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    prvCursorPosition : integer;
  public
    { Public-Deklarationen }
  end;

var
  PEnhInpText: TPEnhInpText;

implementation

{$R *.dfm}

{------------------------------------------------------------------------------}

procedure TPEnhInpText.FormCreate(Sender: TObject);
begin
{-}
KeyPreview:=False;
BorderStyle:=bsSingle;
FormStyle:=fsNormal;
ClientWidth:=600+8;
ClientHeight:=600+8;
Color:=clSkyBlue;
Font.Name:='Tahoma';
Font.Size:=10;
Position:=poDesktopCenter;
Caption:='PEnhInpText - Test Example for wwww.delphipraxis.net';
{-}
Application.Title:='PEnhInpText';
Application.HintHidePause:=30000;
Application.HintPause:=0;
{-}
{-}
prvCursorPosition:=0;
{-}
{-}
ListBox1.SetBounds(4, 4, 300, 600-30);
ListBox1.MultiSelect:=False;
ListBox1.Sorted:=False;
ListBox1.ShowHint:=True;
ListBox1.Hint:='ListBox';
ListBox1.TabOrder:=2;
ListBox1.Color:=clMoneyGreen;
ListBox1.Clear;
ListBox1.Items.Add('One ');
ListBox1.Items.Add('Two ');
ListBox1.Items.Add('Three ');
ListBox1.Items.Add('Four ');
ListBox1.Items.Add('Five ');
{-}
{-}
Label1.SetBounds(300+8, 300-3*26, 300-4, 3*26);
Label1.AutoSize:=False;
Label1.Caption:='CursorPosition: '+IntToStr(prvCursorPosition)+#13+
                'Xmousedown: 0'+#13+
                'Xcanvas: 0';
{-}
{-}
Edit1.SetBounds(300+8, 300, 300-4, 26);
Edit1.ShowHint:=True;
Edit1.Hint:='TEdit';
Edit1.AutoSize:=False;
Edit1.TabOrder:=1;
Edit1.Color:=clMoneyGreen;
Edit1.Text:='and is Three';
{-}
{-}
Label2.SetBounds(300+8, 300+26, 300-4, 300-26-26);
Label2.AutoSize:=False;
Label2.Caption:='Click with mouse into TEdit calculates'+#13+
                'the CursorPosition.'+#13+
                #13+
                'Use Keys Pos1, Left, Right, End'+#13+
                'gives CursorPosition.'+#13+
                #13+
                'Click into TListBox to select'+#13+
                'a line and insert this text into'+#13+
                'text of TEdit at CursorPosition.'+#13+
                #13+
                'Move new CursorPosition after inserted'+#13+
                'text.';
{-}
{-}
bExit.SetBounds(4, 600-22, 64, 26);
bExit.Caption:='E&xit';
bExit.TabOrder:=0;
{-}
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.bExitClick(Sender: TObject);
begin
Close;
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
                                      Shift: TShiftState; X, Y: Integer);
var i, xcanvas : integer;

begin
{-}
{-!!! here are my troubles. Need an idea, how to calculate-}
{-!!! the correct CursorPosition. Work with Canvas formular-}
{-}
for i:=1 to Length(Edit1.Text)+1 do begin
    xcanvas:=Canvas.TextWidth(copy(Edit1.Text+' ', 1, i));
    if (X < xcanvas) then begin
       prvCursorPosition:=i-1;
       break;
    end;
end;
{-}
Label1.Caption:='CursorPosition: '+IntToStr(prvCursorPosition)+#13+
                'Xmousedown: '+IntToStr(X)+#13+
                'Xcanvas: '+IntToStr(Xcanvas);
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.Edit1KeyUp(Sender: TObject; var Key: Word;
                                  Shift: TShiftState);
begin
{-}
if (Key = VK_HOME) then begin
   Key:=0;
   prvCursorPosition:=0;
   Label1.Caption:='CursorPosition: '+IntToStr(prvCursorPosition);
end;
{-}
if ((Key = VK_LEFT) or (Key = VK_BACK)) then begin
   Key:=0;
   dec(prvCursorPosition);
   if (prvCursorPosition < 0) then prvCursorPosition:=0;
   Label1.Caption:='CursorPosition: '+IntToStr(prvCursorPosition);
end;
{-}
if (Key = VK_RIGHT) then begin
   Key:=0;
   inc(prvCursorPosition);
   if (prvCursorPosition > Length(Edit1.Text)) then prvCursorPosition:=Length(Edit1.Text);
   Label1.Caption:='CursorPosition: '+IntToStr(prvCursorPosition);
end;
{-}
if (Key = VK_END) then begin
   Key:=0;
   prvCursorPosition:=Length(Edit1.Text);
   Label1.Caption:='CursorPosition: '+IntToStr(prvCursorPosition);
end;
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var sListBox,
    sEdit : string;
begin
{-}
sListBox:=ListBox1.Items.Strings[ListBox1.ItemIndex];
sEdit:=Edit1.Text;
Insert(sListBox, sEdit, prvCursorPosition);
Edit1.Text:=sEdit;
inc(prvCursorPosition, Length(sListBox));
Label1.Caption:='CursorPosition: '+IntToStr(prvCursorPosition);
{-}
end;

{------------------------------------------------------------------------------}

end.
MfG,
Terence

Luckie 1. Aug 2016 17:15

AW: TEdit Cursorposition verwenden
 
Und warum nimmst du nicht, wie schon vorgeschlagen, TEdit.SelStart, TEdit.SelLength, TEdit.SelText? Damit kann man das Problem mit einer Zeile lösen.

himitsu 1. Aug 2016 18:04

AW: TEdit Cursorposition verwenden
 
Das wäre doch viel zu Einfach, wenn es ein Property gäbe, mit dem man direkt vom Edit erfahren würde, wo der Cursor/Caret gerade steht.
Ich hätte mir ja auch fast den kompletten Code von FormCreate erspart. :angle:

Man muß nur bissl aufpassen, denn SelStart ist 0-basiert und Delphi-Strings fangen bei 1 ein.

PS: Klicken+MausVerschieben, VK_UP, VK_DOWN, Strg+A, Strg+V, Strg+X, die Punkte im Edit-ContextMenü usw. = massig weitere Varianten, wie sich der Cursor verschieben kann, die alle vergessen wurde zu behandeln.

Uwe Raabe 1. Aug 2016 20:13

AW: TEdit Cursorposition verwenden
 
Wie schon gesagt, ist weder
Delphi-Quellcode:
SelStart
noch
Delphi-Quellcode:
SelLength
relevant, sondern man muss lediglich
Delphi-Quellcode:
SelText
setzen.

Zitat:

Das TEdit Feld ist leer.
Nun schreibe ich etwas da hinein, zB. "und ist Drei".
Das TEdit Feld hat den Focus und man sieht den TextCursor am
Ende des Textes blinken.

Jetzt setze ich mit dem Mauszeiger den TextCursor vor dem i
von "ist". Wenn ich nun mit dem Mauszeiger in die TListBox
auf die Zeile "Zwei " klicke, moechte ich, dass dieser Text
in das TEdit Feld an der Position vor dem i eingesetzt wird.
Es muesste jetzt dort "und Zwei ist Drei" stehen.
Genau dies erreichts du mit einem simplen:

Delphi-Quellcode:
procedure TPEnhInpText.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Edit1.SelText := ListBox1.Items.Strings[ListBox1.ItemIndex];
end;

himitsu 2. Aug 2016 09:31

AW: TEdit Cursorposition verwenden
 
Will er selber ein INSERT machen, dann wäre SelStart schon relevant. (Inhalt auslesen, einfügen und wieder zuweisen)
Mit SelText kann man den selektierten Text an der Cursorposition ersetzen, also vorher noch ein SelLength:=0, da man sonst eventuell ersetzt und nicht einfügt.

Uwe Raabe 2. Aug 2016 09:39

AW: TEdit Cursorposition verwenden
 
Zitat:

Zitat von himitsu (Beitrag 1343956)
Will er selber ein INSERT machen, dann wäre SelStart schon relevant. (Inhalt auslesen, einfügen und wieder zuweisen)
Mit SelText kann man den selektierten Text an der Cursorposition ersetzen, also vorher noch ein SelLength:=0, da man sonst eventuell ersetzt und nicht einfügt.

So wie er das Vorgehen im ersten Post beschrieben hat (Caret im Edit an Einfügeposition setzen, dann auf ListBox klicken), muss nichts weiter geschehen. Das Standardverhalten beim Schreiben von TEdit.SelText ohne selektierten Text ist das Einfügen an die Caret-Position, was genau dem gewünschten Verhalten entspricht.

Sollte allerdings ein Text im Edit markiert sein, wird dieser ersetzt - ich vermute, das ist dann aber auch so erwünscht.

Diese ganze Rumrechnerei und der Code in EditMouseDown und EditKeyUp sind vollkommen überflüssig und lenken nur von der eigentlich sehr simplen Lösung ab.

tcoman 2. Aug 2016 16:11

AW: TEdit Cursorposition verwenden
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1343940)

Genau dies erreichts du mit einem simplen:

Delphi-Quellcode:
procedure TPEnhInpText.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Edit1.SelText := ListBox1.Items.Strings[ListBox1.ItemIndex];
end;

Genau das konnte ich selber nicht finden, weil mir die
Methode des Edit1.SelText nicht bewusst war. Haette die
Methode Edit1.AddText oder Edit1.InsText geheissen, waere
es leichter gewesen dahinter zu kommen.

@Himitsu:
Hast recht, vieles im FormCreate() ist reduntant, weil es ja die
DFM Datei gibt. Aber so wichtige Einstellungen wie
ListBox1.MultiSelect:=False habe ich gerne greifbar
hinzugefuegt, auch wenn die Default Einstellung in D2005
schon False ist. Ob das bei einer anderen/neueren Version
von Delphi ebenso ist... und dann geht das Gesuche los,
wenn das neu compilierte Programm ein Fehlverhalten zeigt.

Upload der nun funktionierenden Version meines Beispieles
folgt. Vielen Dank an alle...

Werden laut Himitsu es aber so machen:

Delphi-Quellcode:
procedure TPEnhInpText.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Edit1.SelLength:=0;
  Edit1.SelText := ListBox1.Items.Strings[ListBox1.ItemIndex];
end;
MfG,
Terence

himitsu 2. Aug 2016 16:24

AW: TEdit Cursorposition verwenden
 
Man könnte aber auch OnClick verwenden :angle:

tcoman 3. Aug 2016 14:51

AW: TEdit Cursorposition verwenden
 
Liste der Anhänge anzeigen (Anzahl: 2)
Final version of this problem.
Thanks to you all for minimize my time.
Delphi-Quellcode:
unit PEnhInpText_Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TPEnhInpText = class(TForm)
    Edit1: TEdit;
    ListBox1: TListBox;
    bExit: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    procedure ListBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Edit2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Edit2KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
                                Shift: TShiftState; X, Y: Integer);
    procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
                             Shift: TShiftState; X, Y: Integer);
    procedure bExitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    prvCaretPosition1, prvCaretPosition2 : integer;
    prvEdit1Focused : boolean;
  public
    { Public-Deklarationen }
  end;

var
  PEnhInpText: TPEnhInpText;

implementation

{$R *.dfm}

{------------------------------------------------------------------------------}

procedure TPEnhInpText.FormCreate(Sender: TObject);
begin
{-}
KeyPreview:=False;
BorderStyle:=bsSingle;
FormStyle:=fsNormal;
ClientWidth:=600+8;
ClientHeight:=600+8;
Color:=clSkyBlue;
Font.Name:='Tahoma';
Font.Size:=10;
Position:=poDesktopCenter;
Caption:='PEnhInpText - Working Test Example for wwww.delphipraxis.net';
{-}
Application.Title:='PEnhInpText';
Application.HintHidePause:=30000;
Application.HintPause:=0;
{-}
{-}
prvCaretPosition1:=0;
prvCaretPosition2:=0;
prvEdit1Focused:=True;
{-}
{-}
ListBox1.SetBounds(4, 4, 300, 600-30);
ListBox1.MultiSelect:=False;
ListBox1.Sorted:=False;
ListBox1.ShowHint:=True;
ListBox1.Hint:='ListBox';
ListBox1.TabOrder:=3;
ListBox1.Color:=clMoneyGreen;
ListBox1.Clear;
ListBox1.Items.Add('One ');
ListBox1.Items.Add('Two ');
ListBox1.Items.Add('Three ');
ListBox1.Items.Add('Four ');
ListBox1.Items.Add('Five ');
{-}
{-}
Label1.SetBounds(300+8, 300-6*26, 300-4, 26);
Label1.AutoSize:=False;
Label1.Caption:='CaretPosition of Edit1: 0';
{-}
{-}
Edit1.SetBounds(300+8, 300-5*26, 300-4, 26);
Edit1.ShowHint:=True;
Edit1.Hint:='Edit1';
Edit1.AutoSize:=False;
Edit1.TabOrder:=1;
Edit1.Color:=clSilver;
Edit1.Text:='and is Three';
Edit1.SelStart:=0;
Edit1.SelLength:=0;
Edit1.SelText:='';
{-}
{-}
Label2.SetBounds(300+8, 300-4*26, 300-4, 26);
Label2.AutoSize:=False;
Label2.Caption:='CaretPosition of Edit2: 0';
{-}
{-}
Edit2.SetBounds(300+8, 300-3*26, 300-4, 26);
Edit2.ShowHint:=True;
Edit2.Hint:='Edit2';
Edit2.AutoSize:=False;
Edit2.TabOrder:=2;
Edit2.Color:=clMoneyGreen;
Edit2.Text:='and is Three';
Edit2.SelStart:=0;
Edit2.SelLength:=0;
Edit2.SelText:='';
{-}
{-}
Label3.SetBounds(300+8, 300-26, 300-4, 300);
Label3.AutoSize:=False;
Label3.Color:=clGreen;
Label3.Caption:='Focused Edit is Silver else MoneyGreen.'+#13+
                #13+
                'Click with mouse into Edit calculates'+#13+
                'the CaretPosition and sets Focus.'+#13+
                #13+
                'Use Keys Pos1, Left, Right, End'+#13+
                'gives CaretPosition.'+#13+
                #13+
                'Use Keys Up, Down swaps between Edit1 + 2.'+#13+
                #13+ 
                'Click into ListBox to select'+#13+
                'a line and insert this text into'+#13+
                'text of focused Edit at CaretPosition.'+#13+
                'Enter ListBox line does the same.'+#13+
                #13+
                'Move new CaretPosition after inserted'+#13+
                'text.';
{-}
{-}
bExit.SetBounds(4, 600-22, 64, 26);
bExit.Caption:='E&xit';
bExit.TabOrder:=0;
{-}
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.bExitClick(Sender: TObject);
begin
Close;
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
                                      Shift: TShiftState; X, Y: Integer);
begin
{-}
prvEdit1Focused:=True;
Edit1.Color:=clSilver;
Edit2.Color:=clMoneyGreen;
prvCaretPosition1:=Edit1.SelStart;
Label1.Caption:='CaretPosition of Edit1: '+IntToStr(Edit1.SelStart);
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.Edit1KeyDown(Sender: TObject; var Key: Word;
                                    Shift: TShiftState);
begin
{-}
if ((Key = VK_UP) or (Key = VK_DOWN)) then begin
   Key:=0;
   prvEdit1Focused:=False;
   Edit2.SetFocus;
   Edit2.SelLength:=0;
   Edit2.SelStart:=prvCaretPosition2;
   Edit1.Color:=clMoneyGreen;
   Edit2.Color:=clSilver;
end;
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.Edit1KeyUp(Sender: TObject; var Key: Word;
                                  Shift: TShiftState);
begin
{-}
if ((Key = VK_HOME) or (Key = VK_LEFT) or (Key = VK_BACK) or
    (Key = VK_RIGHT) or (Key = VK_END)) then begin
   Key:=0;
end;
{-}
prvCaretPosition1:=Edit1.SelStart;
Label1.Caption:='CaretPosition of Edit1: '+IntToStr(Edit1.SelStart);
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.Edit2KeyDown(Sender: TObject; var Key: Word;
                                    Shift: TShiftState);
begin
{-}
if ((Key = VK_UP) or (Key = VK_DOWN)) then begin
   Key:=0;
   prvEdit1Focused:=True;
   Edit1.SetFocus;
   Edit1.SelLength:=0;
   Edit1.SelStart:=prvCaretPosition1;
   Edit1.Color:=clSilver;
   Edit2.Color:=clMoneyGreen;
end;
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.Edit2KeyUp(Sender: TObject; var Key: Word;
                                  Shift: TShiftState);
begin
{-}
if ((Key = VK_HOME) or (Key = VK_LEFT) or (Key = VK_BACK) or
    (Key = VK_RIGHT) or (Key = VK_END)) then begin
   Key:=0;
end;
{-}
prvCaretPosition2:=Edit2.SelStart;
Label2.Caption:='CaretPosition of Edit2: '+IntToStr(Edit2.SelStart);
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.Edit2MouseDown(Sender: TObject; Button: TMouseButton;
                                      Shift: TShiftState; X, Y: Integer);
begin
{-}
prvEdit1Focused:=False;
Edit1.Color:=clMoneyGreen;
Edit2.Color:=clSilver;
prvCaretPosition2:=Edit2.SelStart;
Label2.Caption:='CaretPosition of Edit2: '+IntToStr(Edit2.SelStart);
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.ListBox1KeyDown(Sender: TObject; var Key: Word;
                                       Shift: TShiftState);
begin
{-}
if (Key = VK_RETURN) then begin
   Key:=0;
   if prvEdit1Focused then begin
      Edit1.SelLength:=0;
      Edit1.SelText:=ListBox1.Items.Strings[ListBox1.ItemIndex];
      Label1.Caption:='CaretPosition of Edit1: '+IntToStr(Edit1.SelStart);
   end else begin
      Edit2.SelLength:=0;
      Edit2.SelText:=ListBox1.Items.Strings[ListBox1.ItemIndex];
      Label2.Caption:='CaretPosition of Edit2: '+IntToStr(Edit2.SelStart);
   end;
end;
{-}
end;

{------------------------------------------------------------------------------}

procedure TPEnhInpText.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
                                         Shift: TShiftState; X, Y: Integer);
begin
{-}
if prvEdit1Focused then begin
   Edit1.SelLength:=0;
   Edit1.SelText:=ListBox1.Items.Strings[ListBox1.ItemIndex];
   Label1.Caption:='CaretPosition of Edit1: '+IntToStr(Edit1.SelStart);
end else begin
   Edit2.SelLength:=0;
   Edit2.SelText:=ListBox1.Items.Strings[ListBox1.ItemIndex];
   Label2.Caption:='CaretPosition of Edit2: '+IntToStr(Edit2.SelStart);
end;
{-}
end;

{------------------------------------------------------------------------------}

end.
Wbw,
Terence

tcoman 3. Aug 2016 14:54

AW: TEdit Cursorposition verwenden
 
Zitat:

Zitat von himitsu (Beitrag 1344011)
Man könnte aber auch OnClick verwenden :angle:

Bei OnClick in der ListBox wird jedesmal die selektierte Zeile
ins TEdit Feld kopiert. Auch beim benutzen der Arrow Keys.

Habe ich alles schon durchprobiert, Danke Himitsu.

MfG,
Terence


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 Uhr.

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