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

时间:2017-11-10 03:24:34

标签: user-interface lazarus richtext

我有一个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函数时会发生同样的情况。

1 个答案:

答案 0 :(得分:2)

使用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);