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.
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;