Delphi 在已加载文本的情况下独立更改RichEdit文本颜色
如何逐行更改Rich Edit的文本颜色?这取决于位置。第一行必须是红色,第二行必须是绿色,以此类推。问题是富编辑的文本已加载。因此,必须在文本已经在控件中之后更改它。我正在使用Delphi。最好从一开始就用正确的颜色加载它 但要回答你的问题,一个快速、肮脏且相当丑陋的解决方案是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
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)
啊,真的!我编辑了我的答案以纳入你的正确建议。