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 Cursorposition im Memo festlegen (https://www.delphipraxis.net/90091-cursorposition-im-memo-festlegen.html)

moperswings 11. Apr 2007 14:52


Cursorposition im Memo festlegen
 
Hallo,

ich probiere es schon den ganzen Tag :-(
Wenn in einem Memo die Enter-Taste gedrückt wird, sollen die zwei Tags eingefügt werden und der Cursor soll zwischen diesen beiden Tags stehen. Der Cursor springt aber immer zwei Zeilen tiefer unter das Abschluss </p>. Hoffe Ihr könnt mir helfen, dass der Cursor nach Tastendruck um zwei Zeilen wieder nach oben springt.
Viele Grüsse, moperswings
Delphi-Quellcode:
procedure TForm1.Memo1OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
        if key = VK_RETURN then Memo1.Lines.Add('

');
        //cursor position
        if key = VK_RETURN then Memo1.Lines.Add('</p>');
end;

semike 11. Apr 2007 15:19

Re: Cursorposition im Memo festlegen
 
Das sollte funktionieren:

Delphi-Quellcode:
procedure TForm3.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  SelStart: Integer;
  TempStr: PChar;
begin
  if Key = VK_RETURN then
  begin
    TempStr := '

</p>';

    SendMessage(Memo1.Handle, EM_GETSEL, Longint(@SelStart), 0);
    SendMessage(Memo1.Handle, EM_REPLACESEL, 0, LongInt(TempStr));
    SendMessage(Memo1.Handle, EM_SETSEL, SelStart+3, SelStart+3);
    Key := 0; // wichtig !
  end;
end;
Wichtig ist dabei den Key auf 0 zu setzen, da er sonst weiter behandelt wird! Das +3 steht für die dritte Position im einzufügenden Text.

Grüße
Michael

moperswings 11. Apr 2007 16:03

Re: Cursorposition im Memo festlegen
 
Vielen Dank dass Du mich auf den richtigen Weg gebracht hast. Den Rest habe ich mir so hingebastelt wie ich es gebraucht habe.

Viele Grüsse, moperswings

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
        Memo1.SelStart := 3;
end;

procedure TForm1.Memo1OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
        selstart: integer;
        TempStr2: PChar;
begin
        if key = VK_RETURN then
        begin
        tempStr2 := '</p>';

        SendMessage(Memo1.Handle, EM_Getsel, longint(@selstart), 0);
        SendMessage(Memo1.Handle, EM_Replacesel, 0, LongInt(TempStr2));
        SendMessage(Memo1.Handle, EM_Setsel, selstart + 4, Selstart + 4);
        key := 0;
        end;
end;

procedure TForm1.Memo1OnKeyUP(Sender: TObject; var Key: Word; Shift: TShiftState);
var
        selstart: integer;
        TempStr1: PChar;

begin
        if key = VK_RETURN then
        begin
        tempStr1 := '

';

        SendMessage(Memo1.Handle, EM_Getsel, longint(@selstart), 0);
        SendMessage(Memo1.Handle, EM_Replacesel, 0, LongInt(TempStr1));
        SendMessage(Memo1.Handle, EM_Setsel, selstart + 4, Selstart + 3);
        key := 0;
        end;
end;
        // Das letzte

 löschen:
        // Memo1.Lines.Delete(Memo1.Lines.Count - 1);
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz