2

在 Win7-64 上使用 C++ Builder 10 Seattle。

我有一个 TRichEdit 控件,我可以从按钮单击事件中写入:

MyRichEdit->SelText = t_string;

我希望能够撤消该更改,因此我有一个带有快捷键 Ctrl+Z 的菜单项来执行此操作:

SendMessage(MyRichEdit->Handle, EM_UNDO, 0, 0);

如果我输入了丰富的编辑,撤消按预期工作,但不撤消以编程方式分配的“粘贴”。

我在一个用 Borland C++ Builder v6 构建的旧应用程序中有类似的代码,它在那里工作。

那么我的问题是:上面的代码是否应该撤消 write-to-SelText?或者还有什么我需要做的吗?

4

1 回答 1

3

setter的实现SelText如下所示:

procedure TCustomEdit.SetSelText(const Value: string);
begin
  SendTextMessage(Handle, EM_REPLACESEL, 0, Value);
end;

的文档EM_REPLACESEL说:

参数

参数

指定是否可以撤消替换操作。如果这是 TRUE,则可以撤消操作。如果这是 FALSE ,则无法撤消操作。

参数

指向包含替换文本的以 null 结尾的字符串的指针。

VCL 正在发送0FALSE因此该操作无法撤消。您将需要避免使用SelText,而是EM_REPLACESEL直接发送,传递TRUEwParam.

我检查了 Delphi 6 VCL 的源代码,在发送此消息时它也总是通过0wParam所以我希望旧版本的 VCL 以相同的方式运行。尽管如此,您现在知道如何解决该问题。

顺便说一句,您可以将 send of 替换为执行相同操作EM_UNDO的调用。MyRichEdit->Undo()

于 2016-02-12T16:52:07.323 回答