添加新文本时如何防止 TRichMemo 重置文本属性

How to prevent TRichMemo from resetting text attributes when you add new text

我有一个 TRichMemo 对象,我在运行时创建并填充了文本。

我有一个定时器,每 10 秒触发一个函数。该函数看起来像这样:

procedure TServerSideForm.NewLineTimerTimer(Sender: TObject);
var
  timeForward: TDateTime;

  timerText: wideString;

  startRange, endRange: longInt;
begin
  timeForward := Time;
  timeForward := IncSecond(timeForward, ServerSideForm.NewLineTimer.Interval div 1000);

  //...

  timerText := TimeToStr(Time) + ' - ' + TimeToStr(timeForward);   


  startRange := Length(WindowMemo.Text);

  WindowMemo.Text := WindowMemo.Text + sLineBreak + sLineBreak + timerText + sLineBreak + sLineBreak;

  endRange := Length(WindowMemo.Text) - 1;


  WindowMemo.SetRangeColor(startRange, endRange, clGreen);

  //...
end;    

一切正常,所需范围内的文本变为绿色。

但是,一旦我向 TRichMemo 添加一些新文本,所有内容都会重置为黑色文本。

为什么会这样?有没有办法防止这种重置发生?

P.S 当我使用 SetRangeParams 函数时,同样的情况发生了。

使用 Append 方法而不是访问 type StringText,因为它只保留文字而不保留格式。

改变

WindowMemo.Text := WindowMemo.Text + sLineBreak + sLineBreak + timerText + sLineBreak + sLineBreak;

WindowMemo.Append(sLineBreak + sLineBreak + timerText + sLineBreak + sLineBreak); 

方法 2

如果您决定添加不带换行符的文本,您可以将提到的行替换为

uses RichMemoUtils;
...    
InsertColorStyledText(WindowMemo,timerText,Random($FFFFFF),[],Length(WindowMemo.Text) -1);