Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Eine Zeile (nicht Absatz) in RichEdit hervorheben


Popov - Mo 14.07.03 14:33
Titel: Eine Zeile (nicht Absatz) in RichEdit hervorheben
Für ein Programm will ich in meinem RichEdit-Fenster eine bestimmte Zeile markieren. Das sollte in der Art von Delphi und z.B. Haltepunkt sein. Dabei ist die Zeile (bei mir) rot hinterlegt. Ok, sowas kompliziertes muß es nicht sein, auch will ich nicht eine andere Komponente als RichEdit nutzen, aber in irgendeiner Form will ich eine bestimmte Zeile hervorheben. Das es da Möglichkeiten gibt ist mir klar, nur wollte ich mal fragen welche ihr kennt, die nicht so viel Zeit benötigen. Sonderliche Erfahrungen hab ich mit RichEdit bis jetzt nicht gehabt, d.h die besonderen Funktionen hab ich nie angewendet. Für den Fall, daß einer eine feine Funktion hat, würde ich mich freuen. Ansonsten natürlich über jeden Tip wie ich sowas schnell hinkriege. Ich fange schon mal an zu progen. Falls einer mir mit Tip oder Code aushelfen kann, bitte melden.


StefanH - Mo 14.07.03 15:14

Hallo!
Wenn du das meinst(hab jetzt einfach die Farbe ändern lassen, kannst ja noch Ändern :wink:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure HighLight(zeile: integer; farbe: TColor; edit: TRichEdit);
var Start, Ende, OldSelStart:integer;
begin
zeile:= zeile-1;                            //damit Zeile 1 auch Zeile 1 ist
OldSelStart:= edit.SelStart;                //um später wieder zurückzugehen
Start:= Pos(edit.Lines[zeile],edit.text) -1;//Anfang der Zeile
Ende:= Length(edit.Lines[zeile]);           //Ende der Zeile

edit.SelStart:= Start;                      //ANFANG Setzen
edit.SelLength:=Ende;                       //Bis wohin
edit.SelAttributes.Color:= farbe;           //Färben

edit.SelLength:=0;                         //wieder-
edit.SelStart:= OldSelStart;               //herstellen
edit.SetFocus;                             //des Normals


end;


Und Aufgerufen wirds mit:

Delphi-Quelltext
1:
HighLight(2,clBlue,RichEdit1);                    

Färbt die zweite Zeile im RichEdit RichEdit1 blau.

Hoffe konte helfen
Stefan


Popov - Mo 14.07.03 15:20

Ok, hat sich erledigt. Hab mir selbst was geschrieben. Wem was besseres einfällt, der kann sich melden. Wen's interresiert, hier der Code um eine Zeile zu markieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure RichEdit_SelectLine(RichEdit: TRichEdit; LineNr: Word);
begin
  with Richedit do begin
    if (LineNr = 0or (LineNr > Lines.Count) then begin
      SetFocus;
      Exit;
    end;
    LineNr := LineNr - 1;

    SelStart := Perform(EM_LINEINDEX, LineNr, 0); //CursorPosition setzen
    SelLength := Length(Lines[LineNr]); //Länge festlegen
    SetFocus;
    //Application.ProcessMessages; //Individuell einsätzen
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  RichEdit_SelectLine(RichEdit1, 1);
end;


Popov - Mo 14.07.03 15:27

Hallo StefanH, auch nicht schlecht. Hab es gerade ausprobiert. Mal gucken was ich nehme. Auf jeden Fall Danke erstmal.


StefanH - Di 15.07.03 21:16

Mir fällt grad ein, dass wenn es zwei gleiche Zeilen gibt, dass dann nur die immer die erste Gefärbt wird :oops:


bayou - Di 14.06.05 21:10

Genau das habe ich seit Tagen gesucht.

Vielen Dank

Ich hab da aber noch ein Problem. Habe erst angefangen mit Delphi zu arbeiten. Wie kann ich denn zur Laufzeit eine (Lines) erstellen?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 begin
  if k.line[1] <> '' then begin
     RichEdit_SelectLine(m, 1);
     m.Lines[0]:=k.line[1];
  end;
  if k.line[2] <> '' then begin
     RichEdit_SelectLine(m, 2);
     m.Lines[1]:=k.line[2];
  end;
  if k.line[3] <> '' then begin
    RichEdit_SelectLine(m, 3);
    m.Lines[2]:=k.line[3];
  end;

usw.

Wenn ich den Text nicht vorher mit der Anzahl der Lines gespeichert habe, wird nur die erste Zeile angezeigt.

Gehört nicht hier her, ich schreibs mal in einen neuen Beitrag. :oops:

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.