以编程方式写入富编辑后,EM_UNDO不起作用

时间:2016-02-12 16:43:09

标签: winapi sendmessage c++builder-10-seattle

在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?或者还有其他我需要做的事情吗?

1 个答案:

答案 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()的发送,这样做完全相同。