zoukankan      html  css  js  c++  java
  • 关于Memo或者Edit之类控件, 直接设置Text无法撤销的解决方案

    昨天看到群里有人问使用Memo1.Text := '11111';来设置内容的代码无法使用Memo1.Undo的方式来撤销

    测试了一下果然如此, 跟踪了VCL代码, 发现Text := '11111'的方式使用的是WM_SETTEXT消息来设置内容, 而撤销似乎是需要类似"键入"之类的操作才能有效(猜测, 未实践)

    所以猜想了一下, 如果是使用类似选择然后键入文字的方式应该是允许撤销的

    然后查找了一遍Edit可以使用的消息发现了一个EM_REPLACESEL的消息, 是使用参数字符替换所选字符, 其参数的WParam为1表示可以撤销

    测了一下果然成功, 测试代码如下:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      nPC: PChar;
    begin
      Memo1.SelectAll; {选择所有内容}
      GetMem(nPC, 5);
      StrPCopy(nPC, '11111');
      SendMessage(Memo1.Handle, EM_REPLACESEL, 1, Integer(nPC)); {替换所选内容, WParam为1代表可以撤销, 0为不可撤销}
      FreeMem(nPC, 5);
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Memo1.Undo;
    end;
  • 相关阅读:
    分布式架构总汇【转】
    spring注解
    lombok安装和使用
    dubbo配置
    关于dubbo的负载均衡
    maven工作的过程
    android基础---->子线程更新UI
    JavaScript中有时候需要获取当前的时间戳
    Ubuntu 安装mysql
    nodejs 语法很特别的地方
  • 原文地址:https://www.cnblogs.com/lzl_17948876/p/3371588.html
Copyright © 2011-2022 走看看