昨天看到群里有人问使用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;