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;
  • 相关阅读:
    记录一次电话面试
    记录一次git合并
    HTML通用属性与常见标签
    位运算的应用
    HTML总结
    前端MVC
    常用软件
    docker常用命令
    composer install(update)时出现killed
    优化小技巧:该怎么识别百度蜘蛛呢
  • 原文地址:https://www.cnblogs.com/lzl_17948876/p/3371588.html
Copyright © 2011-2022 走看看