在Win7-64上使用C ++ Builder 10 Seattle。
我有一个TRichEdit控件可以从按钮单击事件中写入:
MyRichEdit->SelText = t_string;
我希望能够撤消该更改,因此我有一个快捷键Ctrl + Z的菜单项,可以执行此操作:
SendMessage(MyRichEdit->Handle, EM_UNDO, 0, 0);
如果我将键入加入到富编辑中,则撤消按预期工作,但不撤消以编程方式分配的"粘贴"。
我在使用Borland C ++ Builder v6构建的旧应用程序中有类似的代码,它在那里工作。
我的问题是:应该上面的代码撤消写入到SelText?或者还有其他我需要做的事情吗?
答案 0 :(得分:3)
SelText
setter的实现如下所示:
procedure TCustomEdit.SetSelText(const Value: string);
begin
SendTextMessage(Handle, EM_REPLACESEL, 0, Value);
end;
EM_REPLACESEL
的文档说:
<强>参数强>
wParam中
指定是否可以撤消替换操作。如果是这样的话 是的,操作可以撤消。如果这是FALSE,则操作 无法撤消。
lParam的
指向包含替换文本的以null结尾的字符串的指针。
VCL正在发送0
FALSE
,因此操作无法撤消。您需要避免使用SelText
,而是直接发送EM_REPLACESEL
,将TRUE
作为wParam
传递。
我检查了Delphi 6 VCL的源代码,并且在发送此消息时它总是传递0
wParam
,所以我原本期望VCL的旧版本表现相同办法。同样,您现在知道如何解决问题。
顺便说一句,您可以通过调用EM_UNDO
替换MyRichEdit->Undo()
的发送,这样做完全相同。