Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - RichEdit - Problem


mambo - Mo 22.03.04 14:51
Titel: RichEdit - Problem
Ich füge in meinem Programm in einen RichEdit eine Textzeile ein und möchte diesen Text z.B. in rot schreiben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
var
  iSize: Integer;
  cColor: TColor;
begin

 // ... Color und Size festlegen

  with RichEdit do
  begin

    // Zeile hinzufügen
    Lines.Add(strText);

    pLine := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0);
    SelStart := Perform(EM_LINEINDEX, pLine - 10);

    // alles auswählen und Farbe und Größe einstellen
    SelStart := Perform(EM_LINEINDEX, pLine - 10);
    SelLength := Length(strText);
    SelAttributes.Color := cColor;
    SelAttributes.Size := iSize;

    Perform(EM_SCROLLCARET, 00);

  end;


So weit, so gut. Nur, wenn der Text so lang ist, dass er umgebrochen wird (WordWrap=True), d.h. also teilweise im RichEdit in eine neue Zeile kommt, dann funktioniert meine Prozedur nicht mehr. Nur die letzte Zeile wird dann rot geschrieben. Wie kann ich z.B. auf das SelStart kommen, indem ich die letzte Stelle MINUS die Länge des strText nehme ? Wäre doch einfacher als mit dem ganzen EM_LINEINDEX-Zeug, oder ? Ich weiß nur nicht wie ?
Oder hat jemand sonst noch eine Idee ?

Danke inzwischen
Heinz

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Udontknow - Di 23.03.04 12:13

Hallo!

Schmeiss das mit dem Perform raus; Setze doch einfach Selstart auf die Anzahl der im Richedit enthaltenen Zeichen vor dem Einfügen der Linie.

Cu,
Udontknow


SuperS - Mi 24.03.04 20:21

Ich hab da ne Idee, aber weiß nicht ob sie dir gefällt:
also
du erstellst ein Memo und tippst deinen Text in das memo ein.
Dann stellst du im Objektinspektor Visible auf false.
Erstelle eine ColorBox und stelle (ich weiß nicht genau wie das heißt) standartColor auf die gewünschte Farbe sodass sie angezeigt wird.
Den Wert True von Visible der ColorBox stellst du auf false.
Jetzt erstelle einen Button und mach ein OnClick-Ereigniss:

procedure TForm1.Button...
begin
Memo1.Text.Color:=ColorBox1.selected;
end;


Wenn was nicht stimmt sags mir.