2010-09-22 109 views
2
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; 

如果ans信在相同的位置correct串的字母对应的字母相匹配,它是红色,否则,它是蓝色的。TRichEdit颜色问题

我的问题是,当我再次键入整个RichEdit1文本使用相同的第一个字母(如果RichEdit1的第一个字母是蓝色的,那么整个文字变成蓝色)。

顺便说一下,这不是我简化它的实际代码,因为有多个TRichEdits。
的TRichEdits是只读的,我通过类似RichEdit1.Text := RichEdit1.Text+Key; 分配字母(这样做是因为它是一个多键盘程序,我需要单独的用户输入)

这是正确的行为?如何阻止我的颜色更改覆盖默认颜色?

更新:解决它...以马虎的方式(应用默认颜色,每当有人键入),但我保持这个打开,以防有人提出更好的解决方案。

+0

首先,你的代码甚至不编译...第二,当你调用这个子程序?我根据你的代码做了一个小例子,增加了更正和改进,对我来说它非常有用。 – jachguate 2010-09-22 03:09:29

+0

RichEdit1..SelAttributes.Color:= clBlue;(你已经在richedit1和selattributes.color之间加了一个额外的东西) – 2010-09-22 05:12:28

+0

@jachguate:那不是整个代码,只是一小段顺便说一句。我把它称为onkeypress。 – Dian 2010-09-22 05:22:09

回答

4

正如你已经发现了,你必须重新设置默认的颜色,当你完成,如:

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; 

有更有效的方式来处理这不是每次着色一个字母,例如:

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; 

此外,使用Text属性追加单个Char是非常低效的。使用SelText属性代替,如:

RichEdit1.SelStart := RichEdit1.GetTextLen; 
RichEdit1.SelLength := 0; 
RichEdit1.SelAttributes.Color := ...; // optional 
RichEdit1.SelText := Key; 
+0

你真棒。谢谢! :d – Dian 2010-09-24 06:21:47