![]() |
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 |
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 ![]() ![]() ![]() |
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:
Beispielaufruf:
procedure SelLine(CM: TCustomMemo; ALine: Integer);
begin CM.SelStart := CM.Perform(EM_LINEINDEX, ALine, 0); CM.SelLength := Length(CM.Lines[ALine]); end;
Delphi-Quellcode:
Hier noch ein Code falls du wissen willst in welcher Zeile du dich befindest:
procedure TForm1.Button1Click(Sender: TObject);
begin SelLine(RichEdit1, Button1.Tag); RichEdit1.SelAttributes.Color := $000099FD; Button1.Tag := Button1.Tag + 1; end;
Delphi-Quellcode:
Beispielaufruf:
function GetCurLine(CM: TCustomMemo): Integer;
begin Result := SendMessage(CM.Handle, EM_LINEFROMCHAR, CM.SelStart, 0); end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin ShowMessage(IntToStr(GetCurLine(RichEdit1))); Button1.Tag := Button1.Tag + 1; end; |
AW: In RichEdit ganze Zeile einfärben
Vielen Dank euch beiden für die Unterstützung!
Ich werde eure Tipps gleich ausprobieren. |
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:
hat Diese vergessen.
noChars := noChars + Length(RichEdit1.Lines[i]);
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