![]() |
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:
firstChar gibt mir anscheinend für jede Zeile die aktuelle Position des ersten Zeichens unter Berücksichtigung aller Zeilenumrüche (2Bytes?!) zurück.
procedure TForm1.LMDMemo_TextPackageMarginRowPaint(Sender: TObject;
Canvas: TCanvas; aRect: TRect; firstChar, length: Integer); length ist die Anzahl der Zeichen in der Zeile, in der sich der Cursor befindet. Ich "male" folgendermaßen auf den Canvas:
Delphi-Quellcode:
Die Ausgabe von firstChar ist hier nur zum Testen.
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; Vielleicht hat ja jemand mal einen Tipp für mich parat. Schöne Grüße, seven |
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:
oder mal dieses probieren
line := 0;
pos := 0; while pos < firstChar do begin inc(pos, length(memo.lines[line])); inc(pos, sLineBreak); inc(line); end; ![]() 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:
oder mal dieses probieren
line := 0;
pos := 0; while pos < firstChar do begin inc(pos, length(memo.lines[line])); inc(pos, sLineBreak); inc(line); end; ![]() PS:
Delphi-Quellcode:
aber eigentlich müsste es auch so gehn
var
s: AnsiString; begin s := IntToStr(firstChar); DrawTextA(Canvas.Handle, PAnsiChar(s), Length(s), aRect, DT_SINGLELINE or DT_RIGHT);
Delphi-Quellcode:
und warum nicht Canvas.TextOut bzw. Canvas.TextRect?
var
s: String; begin s := IntToStr(firstChar); DrawText(Canvas.Handle, PChar(s), Length(s), aRect, DT_SINGLELINE or DT_RIGHT); |
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? |
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(...) |
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 06:50 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