【问题标题】:EM_UNDO does not work after programmatically writing to rich edit以编程方式写入富编辑后,EM_UNDO 不起作用
【发布时间】:2016-02-12 16:43:09
【问题描述】:

在 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 吗?或者我还有什么需要做的吗?

【问题讨论】:

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


    【解决方案1】:

    SelText setter 的实现如下所示:

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

    EM_REPLACESEL 的文档说:

    参数

    wParam

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

    lParam

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

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

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

    顺便说一句,您可以将发送EM_UNDO 替换为调用MyRichEdit->Undo(),它的作用完全相同。

    【讨论】:

    • 谢谢!这很完美。我应该自己深入研究代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多