Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   In RichEdit ganze Zeile einfärben (https://www.delphipraxis.net/180752-richedit-ganze-zeile-einfaerben.html)

hebeyer 15. Jun 2014 09:25

In RichEdit ganze Zeile einfärben
 
Hallo,

ich verwende folgende Prozedur in meinem aktuellen Projekt, welche grundsätzlich auch funktioniert:

Delphi-Quellcode:
procedure Tsignalwort.FormActivate(Sender: TObject);
var
i, CharPos, CharPos2, noChars: Integer;  

begin  
  CharPos := 0;
  noChars := 0;
  for i := 0 to Pred(RichEdit1.Lines.Count) do
  noChars := noChars + Length(RichEdit1.Lines[i]);
   repeat
     CharPos2 := RichEdit1.FindText('HALLO', CharPos, noChars, [stWholeWord]);
     CharPos := CharPos2+1;
     RichEdit1.SelStart := CharPos2;
     RichEdit1.SelLength := Length('HALLO');
     RichEdit1.SelAttributes.Color := $000099FD;
   until charpos = 0;
end;

Zur Aufgabenstellung:
1. Eine schon mit Text gefüllte RichEdit-Komponente soll komplett nach dem Signalwort "HALLO" durchsucht werden.
2. An jeder Fundstelle soll die gesamte Zeile eingefärbt werden.

Das Ergebnis:
Das RichEdit wird korrekt durchsucht. Es werden sämtliche Stellen mit dem Signalwort "HALLO" gefunden. Dieses wird jeweils farbig verändert.

Nun frage ich mich/euch, wie man statt der Einfärbung der einzelnen Worte immer die gesamte Zeile, in der sich das jeweilige Signalwort befindet einfärben kann.
Wie müsste der oben stehende Code abgeändert werden, so dass immer die ganze Zeile eingefärbt wird?

Leider habe ich dazu im Netz nichts Passendes gefunden und so hoffe ich auf euch :)

Viele Grüße
Henning

DeddyH 15. Jun 2014 12:23

AW: In RichEdit ganze Zeile einfärben
 
Hallo und Willkommen in der DP :dp:,

spontan würde ich auf die Windows-API zurückgreifen, und zwar auf MSDN-Library durchsuchenEM_LINEFROMCHAR, MSDN-Library durchsuchenEM_LINEINDEX und MSDN-Library durchsuchenEM_LINELENGTH. Das erste liefert Dir den Index der Zeile, das zweite den Index des ersten Zeichens der Zeile und das dritte die Länge der Zeile. Diese Infos sollten nach meinem Dafürhalten genügen, das Gewünschte umzusetzen.

Popov 15. Jun 2014 12:27

AW: In RichEdit ganze Zeile einfärben
 
Du müßtest nur die Zeile markieren, statt das Wort.

Das sollte der Code sein der die Zeile markiert. Danach nur noch einfärben:

Delphi-Quellcode:
procedure SelLine(CM: TCustomMemo; ALine: Integer);
begin
  CM.SelStart := CM.Perform(EM_LINEINDEX, ALine, 0);
  CM.SelLength := Length(CM.Lines[ALine]);
end;
Beispielaufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SelLine(RichEdit1, Button1.Tag);
  RichEdit1.SelAttributes.Color := $000099FD;
  Button1.Tag := Button1.Tag + 1;
end;
Hier noch ein Code falls du wissen willst in welcher Zeile du dich befindest:
Delphi-Quellcode:
function GetCurLine(CM: TCustomMemo): Integer;
begin
  Result := SendMessage(CM.Handle, EM_LINEFROMCHAR, CM.SelStart, 0);
end;
Beispielaufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(GetCurLine(RichEdit1)));
  Button1.Tag := Button1.Tag + 1;
end;

hebeyer 15. Jun 2014 13:27

AW: In RichEdit ganze Zeile einfärben
 
Vielen Dank euch beiden für die Unterstützung!
Ich werde eure Tipps gleich ausprobieren.

himitsu 15. Jun 2014 14:56

AW: In RichEdit ganze Zeile einfärben
 
PS: Dein Code hatte auch nie das gemacht, was du scheinbar wolltest.

Erstmal werden die Zeilenumbrüche mitgezählt und dein
Delphi-Quellcode:
noChars := noChars + Length(RichEdit1.Lines[i]);
hat Diese vergessen.

Wenn es kein HALLO gibt, dann wird dennoch etwas markiert, denn die Repeat-Schleife prüft ja erst am Ende. Stattdessen ein While am Anfang währe bestimmt besser.



Also, entweder suchst du wirklich in der Zeile, welche grade behandelt werden soll (EM_LINEINDEX),
oder du suchst alle Texte (FindText, so ähnlich, wie du es mit Repeat+CharPos schon gemacht hast), und markierst die zugehörige Zeile (EM_LINEFROMCHAR).


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