首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TRichEdit颜色问题

TRichEdit颜色问题
EN

Stack Overflow用户
提问于 2010-09-22 02:48:28
回答 1查看 1.6K关注 0票数 2
代码语言:javascript
复制
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字符串中的字母在相同的位置上匹配,则为红色,否则为蓝色。

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

顺便说一句,这不是我刚才简化的实际代码,因为有多个TRichEdits。

TRichEdits是只读的,我用类似于RichEdit1.Text := RichEdit1.Text+Key;的东西分配字母(这样做是因为它是一个多键盘程序,我需要分离用户输入)

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

更新:解决它..。以一种草率的方式(每当有人键入时应用默认颜色),但我将保持这个打开,以防有人想出一个更好的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-24 06:08:45

正如您已经发现的,您必须在完成时重新设置默认颜色,例如:

代码语言:javascript
复制
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;

有更有效的方法来处理这个问题,而不是一次给一个字母着色,例如:

代码语言:javascript
复制
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属性代替,例如:

代码语言:javascript
复制
RichEdit1.SelStart := RichEdit1.GetTextLen;
RichEdit1.SelLength := 0;
RichEdit1.SelAttributes.Color := ...; // optional
RichEdit1.SelText := Key;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3765982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档