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 Zeilen einer Auswahl unter SynEdit erhalten (https://www.delphipraxis.net/14938-zeilen-einer-auswahl-unter-synedit-erhalten.html)

frankg 18. Jan 2004 16:39


Zeilen einer Auswahl unter SynEdit erhalten
 
Hallo Leute!

Heute habe ich mal eine Frage zu SynEdit. Eigentlich sollte das ganz einfach sein (ich habe auch schon verschiedene Lösungen im Internet gefunden), aber es klappt bei mir einfach nicht. Das Problem ist, ich würde gerne die Anfangs- und Endzeile einer Auswahl unter SynEdit ermitteln. Im Prinzip sollte folgender Code funktionieren:

Delphi-Quellcode:
var
  StartLine : Integer;
  EndLine : Integer;

begin
  ...
  if mySynEd.SelStart = mySynEd.SelEnd then exit;
  StartLine := mySynEd.Perform(EM_LINEFROMCHAR,mySynEd.SelStart,0);
  EndLine := mySynEd.Perform(EM_LINEFROMCHAR,mySynEd.SelEnd,0);
  MessageDlg ('StartLine: '+Inttostr(StartLine)+' - Endline: '+IntToStr(EndLine), mtWarning, [mbOK], 0);;
  ...
end;
Leider funktioniert der Code aber nicht. StartLine und EndLine sind beide 0. Weiss zufällig jemand, was ich hier falsch gemacht habe?

Viele Grüsse und vielen Dank

Frank

MrKnogge 18. Jan 2004 17:15

Re: Zeilen einer Auswahl unter SynEdit erhalten
 
Wo issn der Code drinn ? Ich mein wann wird er ausgeführt ?

Und was machst du da mit dem perform ?

Wenn ich mich recht erinnere müsste doch gehen:
Delphi-Quellcode:
anfang := SynEdit1.SelStart;
ende := SynEdit.SelEnd;

frankg 18. Jan 2004 19:59

Re: Zeilen einer Auswahl unter SynEdit erhalten
 
Zitat:

Zitat von MrKnogge
Wo issn der Code drinn ? Ich mein wann wird er ausgeführt ?

Und was machst du da mit dem perform ?

Wenn ich mich recht erinnere müsste doch gehen:
Delphi-Quellcode:
anfang := SynEdit1.SelStart;
ende := SynEdit.SelEnd;

Hallo Knogge!

Erstmal vielen Dank für Deine Antwort. Also der Code wird einfach über ein Kontextmenü aufgerufen. Ist aber auch eigentlich egal, dass einzige, was hier gewährleistet sein muss ist, dass irgendwas im SynEdit markiert ist, so dass SelStart und SelEnd einen sinnvollen Wert besitzen. Der Code, den Du geschrieben hast liefert mir einfach die Anfangs- bzw. Endposition der Markierung im Buffer zurück, d.h. er liefert die Zeichenposition im Puffer. Ich hätte aber gerne die Zeile, in der die Markierung beginnt und die Zeile in der die Markierung endet. Es gibt unter der Windows API die Message EM_LINEFROMCHAR (für Memos oder RichText-Edits glaube ich...), die eigentlich, wenn man eine Position im Buffer übergibt (geschieht in meinem Beispielcode durch mySynEdit.SelStart bzw SelEnd) die entsprechend Zeile zurückliefern soll. Alternativ zu Perform kann man auch SendMessage verwenden. Hier benötigt man allerdings das Handle des Objektes, an das man eine Nachricht schicken möchte.

Delphi-Quellcode:
StartLine := SendMessage (mySynEdit.Handle, EM_LINEFROMCHAR, mySynEdit.SelStart,0);
Das funzt aber leider auch nicht.

Trotzdem vielen Dank

Frank

Robert_G 18. Jan 2004 21:19

Re: Zeilen einer Auswahl unter SynEdit erhalten
 
So geht's einfacher:
Delphi-Quellcode:
Var
  XY : TBufferCoord;
Begin
  XY := SynEdit.CharIndexToRowCol(SynEdit.SelStart);
  showmessage('Column: ' + IntToStr(XY.Char) + #13#10+
              'Row: ' + IntToStr(XY.Line));
In die Uses-clause deiner Unit musst du dazu noch SynEditTypes hinzufügen.

Robert_G 18. Jan 2004 21:24

Re: Zeilen einer Auswahl unter SynEdit erhalten
 
Funktioniert natürlich genauso mit "SynEdit.SelEnd"...

frankg 20. Jan 2004 19:35

Re: Zeilen einer Auswahl unter SynEdit erhalten
 
Hi GeorgeWNewbie!

Ich bin's noch mal. Natürlich bin ich offensichtlich wirklich zu blöd. Tut mir leid... :wall: diese Fuktion gibt es auch unter meiner SynEdit Version. Allerdings ist der Rückgabetyp nicht TBufferCoord sondern TPoint. Hier ist mein Code, der funktioniert:

Delphi-Quellcode:
var
  myLine : Integer;
  XY : TPoint;
begin
  if mySynEd.SelStart = mySynEd.SelEnd then exit;
  XY := mySynEd.CharIndexToRowCol(mySynEd.SelStart);
  myLine := XY.Y;
  MessageDlg (Inttostr(myLine), mtWarning, [mbOK], 0);;
end;
Die zweite Frage habe ich allerdings noch nicht gelöst... :-D

Viele Grüsse und vielen Dank

Frank

Benedikt 20. Jan 2004 20:01

Re: Zeilen einer Auswahl unter SynEdit erhalten
 
Hi,

das liegt daran das du wahrscheinlich eine ältere Version hast.
Die Umstellung von TPoint auf TBufferCoord und TDisplayCoord fand erst in der letzten CVS-Version statt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 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