Rai*_*ith 5 delphi richedit delphi-xe2
我已经用谷歌搜索并检查了许多地方的解决方案,但我发现的所有案例都不同或涉及比简单地添加或删除行更高级的东西。基本上,我想做一种滚动丰富的编辑(另一种方法是将插入符号移到底部,我已经找到了解决方案)。
我正在向它添加行并检查富编辑Lines.Count的OnChange事件,一旦它达到大于 15 我想调用的值Lines.Delete(0),但是我收到错误:
RichEdit line insertion error
Run Code Online (Sandbox Code Playgroud)
有人能告诉我我在这里做错了什么吗?
您将收到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;
Run Code Online (Sandbox Code Playgroud)
工作流程如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
如果你没有从这个无聊的故事中睡着,那么我可以建议你尽可能地避免对 OnChange 事件中的行进行操作(最好说,只有当你知道会发生什么时)。