AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event
Thema durchsuchen
Ansicht
Themen-Optionen

Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event

Ein Thema von SevenOfNine · begonnen am 8. Nov 2009 · letzter Beitrag vom 8. Nov 2009
Antwort Antwort
SevenOfNine

Registriert seit: 11. Jan 2007
Ort: Giessen, Mittelhessen
41 Beiträge
 
Delphi 7 Professional
 
#1

Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event

  Alt 8. Nov 2009, 09:10
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
Mein Kindheitstraum: Die 32bit Farbpalette als Bundstiftsammlung.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

Re: Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event

  Alt 8. Nov 2009, 09:25
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SevenOfNine

Registriert seit: 11. Jan 2007
Ort: Giessen, Mittelhessen
41 Beiträge
 
Delphi 7 Professional
 
#3

Re: Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event

  Alt 8. Nov 2009, 09:43
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?
Mein Kindheitstraum: Die 32bit Farbpalette als Bundstiftsammlung.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#4

Re: Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event

  Alt 8. Nov 2009, 09:50
In soeinem Fall muß man den Namespace mit angeben.
Length liegt in der Unit System, also System.Length(...)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SevenOfNine

Registriert seit: 11. Jan 2007
Ort: Giessen, Mittelhessen
41 Beiträge
 
Delphi 7 Professional
 
#5

Re: Memo (LMDTools) Zeilennummer mit OnMarginRowPaint Event

  Alt 8. Nov 2009, 10:16
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;
Mein Kindheitstraum: Die 32bit Farbpalette als Bundstiftsammlung.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:51 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