Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在已加载文本的情况下独立更改RichEdit文本颜色_Delphi_Colors_Richedit - Fatal编程技术网

Delphi 在已加载文本的情况下独立更改RichEdit文本颜色

Delphi 在已加载文本的情况下独立更改RichEdit文本颜色,delphi,colors,richedit,Delphi,Colors,Richedit,如何逐行更改Rich Edit的文本颜色?这取决于位置。第一行必须是红色,第二行必须是绿色,以此类推。问题是富编辑的文本已加载。因此,必须在文本已经在控件中之后更改它。我正在使用Delphi。最好从一开始就用正确的颜色加载它 但要回答你的问题,一个快速、肮脏且相当丑陋的解决方案是 function RandomColor: TColor; begin Result := RGB(Random(256), Random(256), Random(256)) end; procedure TF

如何逐行更改Rich Edit的文本颜色?这取决于位置。第一行必须是红色,第二行必须是绿色,以此类推。问题是富编辑的文本已加载。因此,必须在文本已经在控件中之后更改它。我正在使用Delphi。

最好从一开始就用正确的颜色加载它

但要回答你的问题,一个快速、肮脏且相当丑陋的解决方案是

function RandomColor: TColor;
begin
  Result := RGB(Random(256), Random(256), Random(256))
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to RichEdit1.Lines.Count - 1 do
  begin
    RichEdit1.CaretPos := Point(0, i);
    RichEdit1.SelLength := RichEdit1.Lines[i].Length;
    RichEdit1.SelAttributes.Color := RandomColor;
  end;
end;

如果richedit控件的内容不分为行,而是根据控件的大小(可能在窗体调整大小时更改),则可以使用此过程在红色、绿色和蓝色之间交替为行着色:

procedure TForm1.Button1Click(Sender: TObject);
const
  ColorWheel: array[0..2] of TColor = (clRed, clGreen, clBlue);
var
  RowNr, RowStartPos, RowEndPos, C: Integer;
  HasReachedEnd: Boolean;
begin
  HasReachedEnd := False;
  RowStartPos := 0;
  C := 0;
  RowNr := 1;
  repeat
    RowEndPos := RichEdit1.Perform(EM_LINEINDEX, RowNr, 0);
    if RowEndPos = -1 then
    begin
      // Last row reached
      HasReachedEnd := True;
      RowEndPos := RichEdit1.GetTextLen;
    end;
    // Select text
    RichEdit1.SelStart := RowStartPos;
    RichEdit1.SelLength := RowEndPos - RowStartPos;
    // Change selected text colour
    RichEdit1.SelAttributes.Color := ColorWheel[C];
    C := (C + 1) mod 3;
    // Prepare for next row
    RowStartPos := RowEndPos;
    Inc(RowNr);
  until HasReachedEnd;
end;

注意,您可以使用
EM_exsetel
消息同时设置选择的开始和结束(
CaretPos
在内部执行此操作,将开始和结束设置为相同的值)。此外,您应该使用
EM_LINELENGTH
消息,而不是
RichEdit1.Lines[i].Length
。此外,在操作选择时,应使用
EM_SETEVENTMASK
消息禁用
EN_SELCHANGE
通知(触发
TRichEdit.OnSelectionChange
事件)。然后将整个代码包装在
WM_SETREDRAW
中,以在更改颜色时禁用屏幕更新。@RemyLebeau:我知道。这就是为什么我强调解决方案是“快速、肮脏和相当丑陋的”。(我没有时间研究RichEdit API的细节。在许多实际情况下,这个解决方案已经足够好了。)请随意发布一个改进的版本作为答案,我会删除这个。看,是的,我已经看到了那个页面。但使用丰富的编辑控件作为语法高亮显示程序员的编辑器并不理想,是吗,即使这是可能的?:)不,RichEdit不是语法高亮显示编辑器的理想选择。但是对于一个简单的基于行的记录器,它就足够了。这必须解决语法高亮显示在插入文本后处理着色时必须解决的类似问题。您应该使用
RichEdit1.GetTextLen()
而不是
Length(RichEdit1.Lines.text)
啊,真的!我编辑了我的答案以纳入你的正确建议。