我已经用谷歌搜索并检查了很多地方来寻找解决方案,但我发现的所有情况都不同或涉及比简单地添加或删除行更高级的东西。基本上,我想进行一种滚动丰富的编辑(替代方法是将插入符号移动到底部,我已经找到了解决方案)。
我正在向其中添加行并检查Lines.Count
与OnChange
丰富编辑的事件,一旦它达到大于 15 的值,我想打电话Lines.Delete(0)
,但是我收到错误:
RichEdit line insertion error
有人可以告诉我我在这里做错了什么吗?
你正在得到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 事件中的行进行操作(更好地说,只有当您知道会发生什么时)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)