Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TRichEdit (https://www.delphipraxis.net/129865-trichedit.html)

youuu 26. Feb 2009 21:37


TRichEdit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Ich habe eine Frage bezüglich den einfärben in einem TRichEdit Feldes.
Und zwar hier ein Teil meines Quellcodes.

Delphi-Quellcode:
           FormMain.REAErgebnis.lines.Add(Test);
              if StrToFloat(Ergebnis[A]) > 2 then
                Begin
                  with FormMain.REAErgebnis do
                    begin
                      SelStart := Length(FormMain.REAErgebnis.text)-Length(Test);
                      SelLength := Length(Test);
                      SelAttributes.Color := clRed;
                    end;
                End;
Nun soll jedesmal wenn ich im TRich-Feld etwas einfüge das einen höheren Wert als 2 besitzt Rot eingefärbt werden.

nur bei diesem Code den ich mir zusammen gebastelt habe klappt dies nicht.




Auf dem Screenshot kann man genau sehen wie es jedesmal aussieht.

Screenshot hängt bei.

Hat jemand einen Tipp was ich falsch mache?

blink182 26. Feb 2009 21:58

Re: TRichEdit
 
Delphi-Quellcode:
procedure AddColoredText(Text: String; Color: TColor; const
  NewLn: Boolean = true);
begin
  if NewLn then
  begin
    Form1.RIchEdit1.Lines.Add(Text);
  end
    else
  begin
    Form1.RIchEdit1.Lines[Form1.RIchEdit1.Lines.Count -1] := Form1.RIchEdit1.Lines[Form1.RIchEdit1.Lines.Count -1]
      + Text;
  end;
  Form1.RIchEdit1.SelStart := Length(Form1.RIchEdit1.Lines.Text) -2 -Length(Text);
  Form1.RIchEdit1.SelLength := Length(Text);
  Form1.RIchEdit1.SelAttributes.Color := Color;
  Form1.RIchEdit1.SelLength := 0;
  Form1.RIchEdit1.SelStart := Length(Form1.RIchEdit1.Lines.Text);
end;
probier die Prozedur mal, damit kannst du einzelne Teile einer Reihe färben oder halt die ganze Reihe, je nach dem was du der Konstanten zuweißt.
Hier wirds aber auch nochmal genau erklärt http://www.swissdelphicenter.ch/torr...de.php?id=1129

youuu 27. Feb 2009 18:13

Re: TRichEdit
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe dies nun so eingebaut:

Delphi-Quellcode:

procedure AddColoredText(Text: String; Color: TColor; const
  NewLn: Boolean = true);
begin
  begin
    FormMain.REAErgebnis.Lines[FormMain.REAErgebnis.Lines.Count -1] := FormMain.REAErgebnis.Lines[FormMain.REAErgebnis.Lines.Count -1]
      + Text;
  end;
  FormMain.REAErgebnis.SelStart := Length(FormMain.REAErgebnis.Lines.Text) -2 -Length(Text);
  FormMain.REAErgebnis.SelLength := Length(Text);
  FormMain.REAErgebnis.SelAttributes.Color := Color;
  FormMain.REAErgebnis.SelLength := 0;
  FormMain.REAErgebnis.SelStart := Length(FormMain.REAErgebnis.Lines.Text);
end;
Habe mit Absicht den Teil mit Lines.add weggelassen da ich dies woanderst realisiert habe und zwar hier:

Delphi-Quellcode:

      for I := 0 to 4  do
        Begin
          for E := 0 to 4 do
            Begin
              Test:= IntToStr(I) +':' + IntToStr(E) +'   zu   '+(Ergebnis[A])+' %';
              FormMain.REAErgebnis.lines.Add(Test);
              if StrToFloat(Ergebnis[A]) > 2 then
                Begin
                  AddColoredText(Test,clblue);         //    <<<<------
                End;
              A:= A + 1;
            End;
        End;

allerdings auch kein Erfolg siehe Screenshot :( (sogar der Zeilenumbruch klappte danach komischerweise nciht mehr)



Hier ein einmal der Quelltest als ich Die Color procedure rausgenommen habe + Screenshot

Delphi-Quellcode:

      for I := 0 to 4  do
        Begin
          for E := 0 to 4 do
            Begin
              Test:= IntToStr(I) +':' + IntToStr(E) +'   zu   '+(Ergebnis[A])+' %';
              FormMain.REAErgebnis.lines.Add(Test);
              A:= A + 1;
            End;
        End;
Dort klappte der Zeilenumbruch wieder.

Ich bin total Ratlos oder ich mache irgendwo einen dummen Fehler ;)

blink182 27. Feb 2009 18:23

Re: TRichEdit
 
Delphi-Quellcode:
FormMain.REAErgebnis.Lines[FormMain.REAErgebnis.Lines.Count -1] := FormMain.REAErgebnis.Lines[FormMain.REAErgebnis.Lines.Count -1]
      + Text;
das sollte ja auch gemacht werden, wenn keine neue Zeile gewollt ist, d.h. er springt an die letzte position aus der zeile davor und fügt es ein. Ich denke das willst du ja auch nicht. MIt dem lines.add war somit der Zeilenumbruch gegeben, also die Zeile nur aufrufen wenn NewLn=false und bei dir ist es ja standardmässig auf true also fügt der es einfach ans Ende. Also das kannst du weglassen, aber dann lieber FormMain.ReaErgebnis.Lines.add(Text)

Vllt solltest du auch wenn du es nicht mehr färben willst auch den Text irgendwo in schwarz wieder geben.

Delphi-Quellcode:
if StrToFloat(Ergebnis[A]) > 2 then
   AddColoredText(Test,clblue)
else
   AddColoredText(Test,clBlack);
inc(A);
Das RichEdit behält wohl die Farbe dann bei

youuu 27. Feb 2009 18:45

Re: TRichEdit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke erstmal für deine Tipps hab nun

Delphi-Quellcode:

if StrToFloat(Ergebnis[A]) > 2 then
  Begin
    AddColoredText(Test,clblue);
  End
else
  AddColoredText(Test,clBlack);
eingebaut sowie

Delphi-Quellcode:

if NewLn then
  begin
    FormMain.REAErgebnis.Lines.Add(Text);
  end
Nun funktioniert es auch HALBWEGS.

Er färbt nun die richtigen Zeilen ein doch mit ab und zu ein paar Fehlern :/

Ich habe natürlich ein screenshot angehangen ;)

blink182 27. Feb 2009 19:05

Re: TRichEdit
 
so einen ähnlichen fehler hatte ich auch mal, hatte da "Pfeile" --> schwarz färben wollen, aber diese Pfeile haben die Farbe von dem Zeichen davor angenommen, da konnte ich noch so viele schwarze-Farbe-Befehle anwenden, es hat nicht funktioniert, das liegt wohl irgendwie am RichEdit an sich, frag mich nicht warum und wieso. Abhilfe wirst du wahrscheinlich bekommen, wenn du erst später die Zeilen färbst, d.h. wenn alle Linien gefüllt sind. Aber kA ob das bei deinem Programm möglich ist also ob dann noch der Sinn gewahrt bleibt.
MfG blink182

youuu 27. Feb 2009 19:19

Re: TRichEdit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Machbar und Sinn würde es noch machen, nur wie realisier ich das dann?
mit den gleichen Befehlen?

Hättest du da einen kleinen code schnipsel zur verfügung?

Edit:

Ich habe es grad auch probiert nur mit dem Prozentwert ohne Prozent Zeichen oder anderen Schnick Schnack also nur die Zahl an sich.

Selbst dann bleibt der Fehler bestehen ;/


Edit2:
Ich meine da ist sehr gut sogar ein Muster zu erkennen
Screenshot angehangen ;)

blink182 27. Feb 2009 20:27

Re: TRichEdit
 
Die Schweizer helfen^-^ http://www.swissdelphicenter.ch/torr...de.php?id=1129

Delphi-Quellcode:
procedure RE_ColorLine(ARichEdit: TRichEdit; ARow: Integer; AColor: TColor);
begin
  with ARichEdit do
  begin
    SelStart := SendMessage(Handle, EM_LINEINDEX, ARow - 1, 0);
    SelLength := Length(Lines[ARow -1]);
    SelAttributes.Color := AColor;
    SelLength := 0;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;  s:string;
begin
for i:=0 to RichEdit1.lines.count-1 do
begin
s:=strtoint(RichEdit1.lines[i]);
s:=copy(s,Pos('   zu   ',s)+length('   zu   ')+1,length(s));
s:=copy(s,1,Pos('%',s)-1); // hier bin ich mir nicht sicher ob die -1 dahin gehört, glaub aber schon, sollte soweit dann an deine Zeile angepasst sein
//s:=Stringreplace(s,'.',#40,[]); hab gerade nochmal geschaut, dass ist ja schon ein Komma ;)
if strtofloat(s)>2 then
begin
 RE_ColorLine(RichEdit1,i+1,clred);
 richEdit1.selattributes.color:=clblack; // das hier braucht man glaub ich auch nicht
end
end

end;
hoffe das klappt :)

youuu 27. Feb 2009 21:18

Re: TRichEdit
 
Zitat:

Zitat von blink182
Die Schweizer helfen^-^ http://www.swissdelphicenter.ch/torr...de.php?id=1129

Delphi-Quellcode:
procedure RE_ColorLine(ARichEdit: TRichEdit; ARow: Integer; AColor: TColor);
begin
  with ARichEdit do
  begin
    SelStart := SendMessage(Handle, EM_LINEINDEX, ARow - 1, 0);
    SelLength := Length(Lines[ARow -1]);
    SelAttributes.Color := AColor;
    SelLength := 0;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;  s:string;
begin
for i:=0 to RichEdit1.lines.count-1 do
begin
s:=strtoint(RichEdit1.lines[i]);
s:=copy(s,Pos('   zu   ',s)+length('   zu   ')+1,length(s));
s:=copy(s,1,Pos('%',s)-1); // hier bin ich mir nicht sicher ob die -1 dahin gehört, glaub aber schon, sollte soweit dann an deine Zeile angepasst sein
//s:=Stringreplace(s,'.',#40,[]); hab gerade nochmal geschaut, dass ist ja schon ein Komma ;)
if strtofloat(s)>2 then
begin
 RE_ColorLine(RichEdit1,i+1,clred);
 richEdit1.selattributes.color:=clblack; // das hier braucht man glaub ich auch nicht
end
end

end;


hoffe das klappt :)


Es hat perfekt geklappt ;) Danke hast allerdings einen kleinen Fehler gehabt und zwar hier

s:=strtoint(RichEdit1.lines[i]); s ist doch ein string und du wolltest ein integer Wert zuweisen. :)

Ich danke dir abe rnochmal für deine nette Hilfe


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