5

我已经搜索并检查了许多地方的解决方案,但我发现的所有案例都不同或涉及比简单添加或删除行更高级的东西。基本上,我想做一种滚动富编辑(替代方法是将插入符号移到底部,我已经找到了解决方案)。

我正在向它添加行并检查富编辑Lines.CountOnChange事件,一旦它达到大于 15 的值我想调用Lines.Delete(0),但是我收到错误:

RichEdit line insertion error

有人可以告诉我我在这里做错了什么吗?

4

1 回答 1

5

你得到了RichEdit line insertion error因为检查添加到 Delphi 2009 版本。此检查验证新行的插入是否成功,并且此检查使用选择位置。不幸的是,对于以下代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.Clear;
  RichEdit1.Lines.Add('1');
end;

procedure TForm1.RichEdit1Change(Sender: TObject);
begin
  if RichEdit1.Lines.Count > 0 then
    RichEdit1.Lines.Delete(0);
end;

工作流程如下所示:

1. - TRichEdit.Lines.Add → TRichEdit.Lines.Insert

获取将插入字符串的行的第一个字符的位置,将换行符添加到该字符串,设置选择(0 长度,从行首开始)并通过执行 EM_REPLACESEL 消息插入字符串,除了文本插入,也会改变选择位置。上述检查尚未执行,同时文本插入会触发 OnChange 事件,其中调用 TRichEdit.Lines.Delete。

2. - TRichEdit.Lines.Delete

删除做类似的事情。它获取已删除行的第一个字符索引,设置选择,现在在整个行长度中,并使用空字符串执行 EM_REPLACESEL 消息。但它当然也改变了选择位置。这就是问题所在,因为我们现在要回到 TRichEdit.Lines.Insert 函数的最后一行。

3. - TRichEdit.Lines.Add → TRichEdit.Lines.Insert

现在,之前调用 TRichEdit.Lines.Insert 函数的最后一件事还有待完成,邪恶检查仅基于选择位置。由于同时删除位置已更改,因此与预期结果不匹配,您会收到错误消息。

另外,在有人修复这个问题之前,不要使用这个,它会导致同样的错误:

procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.Lines.Add('1');
end;

procedure TForm1.RichEdit1Change(Sender: TObject);
begin
  RichEdit1.SelStart := 0;
end;

如果您没有从这个无聊的故事中睡着,那么我建议您尽可能避免对 OnChange 事件中的行进行操作(最好说,只有当您知道会发生什么时)。

于 2012-05-07T00:55:57.063 回答