Frage

ans:= RichEdit1.Text     
for i:=1 to Length(ans) do
begin
   RichEdit1.SelStart :=  i-1;
   RichEdit1.SelLength:= 1;
   if ans[i] = correct[i] then
      RichEdit1.SelAttributes.Color := clRed
   else
      RichEdit1.SelAttributes.Color := clBlue;  

Wenn der Brief in ans stimmt mit dem Brief in der gleichen Position wie der Brief in correct string, ist es sonst rot gefärbt, es ist blau.

Mein Problem ist, wenn ich wieder geben Sie die ganze RichEdit1 Text als das gleiche wie der erste Buchstabe gefärbt ist (wenn der erste Buchstabe RichEdit1 blau ist dann der gesamte Text wird blau).

By the way, ist dies nicht der der eigentliche Code ich es nur vereinfacht, weil es mutiple TRichEdits.
Die TRichEdits sind schreibgeschützt und ich ordnen Sie die Buchstaben durch so etwas wie RichEdit1.Text := RichEdit1.Text+Key; (Tun dies, weil es sich um eine mehrere Tastatur-Programm ist und ich brauche, um Benutzereingaben zu trennen)

Ist das das richtige Verhalten? Wie kann ich meine Farbänderungen überschreiben die Standardfarbe stoppen?

Update: Gelöst es ... in eine schlampige Art und Weise (unter Anwendung der Standard-Farbe, wenn jemand Arten), aber ich halte diese offen, falls jemand mit einer besseren Lösung kommt.

War es hilfreich?

Lösung

Wie Sie bereits entdeckt, müssen Sie die Standardfarbe zurückzusetzen, wenn Sie fertig sind, zum Beispiel:

ans := RichEdit1.Text;
for i := 1 to Length(ans) do 
begin 
  RichEdit1.SelStart := i-1; 
  RichEdit1.SelLength := 1; 
  if ans[i] = correct[i] then 
    RichEdit1.SelAttributes.Color := clRed 
  else 
    RichEdit1.SelAttributes.Color := clBlue;
end;
RichEdit1.SelStart := RichEdit1.GetTextLen;
RichEdit1.SelLength := 0;
RichEdit1.SelAttributes.Color := RichEdit1.Font.Color;

Es gibt effizientere Möglichkeiten, dies zu handhaben als einen Buchstaben zu einem Zeitpunkt, Färben, zum Beispiel:

const
  colors: array[Boolean] of TColor = (clRed, clBlue);
var
  ans: string;
  start, len: Integer;
  cur_state: Boolean;

  procedure ColorRange(AStart, ALength: Integer; AColor: TColor);
  begin
    RichEdit1.SelStart := AStart;
    RichEdit1.SelLength := ALength;
    RichEdit1.SelAttributes.Color := AColor;
  end;

begin
  RichEdit1.Lines.BeginUpdate;
  try
    ans := RichEdit1.Text;
    start := 0;
    len := 0;
    cur_start := False;

    for i := 1 to Length(ans) do 
    begin 
      if (ans[i] = correct[i]) = cur_state then
        Inc(len)
      else begin
        if len > 0 then
          ColorRange(start, len, colors[cur_state]);
        start := i-1;
        len := 1;
        cur_state := not cur_state;
      end;
    end;
    if len > 0 then
      ColorRange(start, len, colors[cur_state]);
    ColorRange(RichEdit1.GetTextLen, 0, RichEdit1.Font.Color);
  finally
    RichEdit1.Lines.EndUpdate;
  end;
end;

Auch die Text-Eigenschaft mit einem einzigen Char anzuhängen ist sehr ineffizient. Verwenden Sie die Eigenschaft SelText statt, zum Beispiel:

RichEdit1.SelStart := RichEdit1.GetTextLen;
RichEdit1.SelLength := 0;
RichEdit1.SelAttributes.Color := ...; // optional
RichEdit1.SelText := Key;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top