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 Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event (https://www.delphipraxis.net/143022-memo-lmdtools-zeilennummer-mit-onmarginrowpaint-event.html)

SevenOfNine 8. Nov 2009 09:10


Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event
 
Hallo zusammen,

vielleicht kann mir hier jemand ja weiterhelfen ...

Ich möchte in dem Margin-Bereich eines LMDMemo die Zeilennummer ausgeben. Es soll im Prinzip so aussehen, wie in einem Sourcecode-Editor.

Zum "malen" im Margin-Bereich nutze ich OnMarginRowPaint-Event.

Delphi-Quellcode:
procedure TForm1.LMDMemo_TextPackageMarginRowPaint(Sender: TObject;
  Canvas: TCanvas; aRect: TRect; firstChar, length: Integer);
firstChar gibt mir anscheinend für jede Zeile die aktuelle Position des ersten Zeichens unter Berücksichtigung aller Zeilenumrüche (2Bytes?!) zurück.
length ist die Anzahl der Zeichen in der Zeile, in der sich der Cursor befindet.

Ich "male" folgendermaßen auf den Canvas:

Delphi-Quellcode:
procedure TForm1.LMDMemo_TextPackageMarginRowPaint(Sender: TObject;
  Canvas: TCanvas; aRect: TRect; firstChar, length: Integer);
var
  s: string;
begin

   s :=  inttostr( firstChar );

   DrawText(Canvas.Handle, PAnsiChar(AnsiString(s)), strlen(PAnsiChar(AnsiString(s))),
      aRect, DT_SINGLELINE or DT_RIGHT);

end;
Die Ausgabe von firstChar ist hier nur zum Testen.

Vielleicht hat ja jemand mal einen Tipp für mich parat.

Schöne Grüße,
seven

himitsu 8. Nov 2009 09:25

Re: Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event
 
Du hast do den Gesamt-Text und weißt der erste Zeichen.
Da kannst du doch auch einfach nachsehn, in welcher Zeile dieses steckt?

notfalls einfach zählen
Delphi-Quellcode:
line := 0;
pos := 0;
while pos < firstChar do begin
  inc(pos, length(memo.lines[line]));
  inc(pos, sLineBreak);
  inc(line);
end;
oder mal dieses probieren MSDN-Library durchsuchenEM_LINEFROMCHAR



Du hast do den Gesamt-Text und weißt der erste Zeichen.
Da kannst du doch auch einfach nachsehn, in welcher Zeile dieses steckt?

notfalls einfach zählen
Delphi-Quellcode:
line := 0;
pos := 0;
while pos < firstChar do begin
  inc(pos, length(memo.lines[line]));
  inc(pos, sLineBreak);
  inc(line);
end;
oder mal dieses probieren MSDN-Library durchsuchenEM_LINEFROMCHAR


PS:
Delphi-Quellcode:
var
  s: AnsiString;
begin
   s := IntToStr(firstChar);
   DrawTextA(Canvas.Handle, PAnsiChar(s), Length(s), aRect, DT_SINGLELINE or DT_RIGHT);
aber eigentlich müsste es auch so gehn
Delphi-Quellcode:
var
  s: String;
begin
   s := IntToStr(firstChar);
   DrawText(Canvas.Handle, PChar(s), Length(s), aRect, DT_SINGLELINE or DT_RIGHT);
und warum nicht Canvas.TextOut bzw. Canvas.TextRect?

SevenOfNine 8. Nov 2009 09:43

Re: Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event
 
Hallo Himitsu,

danke für die schnelle Antwort!

Ich werde das gleich mal ausprobieren.

Aber nocheinmal eine kurze Frage:

Was mache ich denn, wenn ich innerhalb der Routine die Routine length() verwenden möchte. length wird ja hier als Integer der MarginRowPaint-Routine übergeben und Delphi beschwert sich, wenn ich length() verwende?

seven

EDIT:
In der Definition der Procedure einfach umbenennen?

himitsu 8. Nov 2009 09:50

Re: Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event
 
In soeinem Fall muß man den Namespace mit angeben.
Length liegt in der Unit System, also System.Length(...)

SevenOfNine 8. Nov 2009 10:16

Re: Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event
 
Super, es funktioniert.

Nochmals schönen Dank für deine Hilfe!

seven

Delphi-Quellcode:
procedure TForm1.LMDMemo_TextPackageMarginRowPaint(Sender: TObject;
  Canvas: TCanvas; aRect: TRect; firstChar, length: Integer);
var
  s: AnsiString;
  line, pos: integer;
begin

  line := 0;
  pos := 0;

  while pos < firstChar do begin
    inc(pos, System.Length(LMDMemo_TextPackage.lines[line]));
    inc(pos, 2); // 2 = System.Length(sLineBreak)
    inc(line);
  end;

  s :=  IntToStr( line );

  DrawTextA(Canvas.Handle, PAnsiChar(s), System.Length(s), aRect, DT_SINGLELINE or DT_RIGHT);

end;


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