当我在OnChange事件中调用Delete时,为什么会出现RichEdit行插入错误?

时间:2012-05-06 22:40:02

标签: delphi delphi-xe2 richedit

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

我正在为其添加行,并使用富编辑的Lines.Count事件检查OnChange,一旦达到更高的值15,我想调用Lines.Delete(0),但是我得到错误:

RichEdit line insertion error

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

1 个答案:

答案 0 :(得分:4)

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

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事件中的线条进行操作(更好地说,只有当你知道会发生什么时)。