关于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;

 

posted on 2013-10-16 10:02  黑暗煎饼果子  阅读(439)  评论(0编辑  收藏  举报