AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

In RichEdit ganze Zeile einfärben

Ein Thema von hebeyer · begonnen am 15. Jun 2014 · letzter Beitrag vom 15. Jun 2014
Antwort Antwort
hebeyer

Registriert seit: 15. Jun 2014
2 Beiträge
 
Delphi 6 Personal
 
#1

In RichEdit ganze Zeile einfärben

  Alt 15. Jun 2014, 09:25
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: In RichEdit ganze Zeile einfärben

  Alt 15. Jun 2014, 12:23
Hallo und Willkommen in der 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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: In RichEdit ganze Zeile einfärben

  Alt 15. Jun 2014, 12:27
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;
  Mit Zitat antworten Zitat
hebeyer

Registriert seit: 15. Jun 2014
2 Beiträge
 
Delphi 6 Personal
 
#4

AW: In RichEdit ganze Zeile einfärben

  Alt 15. Jun 2014, 13:27
Vielen Dank euch beiden für die Unterstützung!
Ich werde eure Tipps gleich ausprobieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: In RichEdit ganze Zeile einfärben

  Alt 15. Jun 2014, 14:56
PS: Dein Code hatte auch nie das gemacht, was du scheinbar wolltest.

Erstmal werden die Zeilenumbrüche mitgezählt und dein 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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Jun 2014 um 15:19 Uhr)
  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 09:12 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