我想向 TMemo 发送一个 BackSpace 控制字符,就像用户实际按下 BackSpace 按钮一样。
我的备忘录是只读的,如果我单击一个按钮,它应该删除备忘录中的最后一个字符。我想在不使用 Memo.Text 的情况下做到这一点:= ...(所以没有重绘或 beginupdate 等)这可能吗,如果可以,怎么做?
感谢您的帮助。
编辑:我试图添加#8但没有运气......
将按键发送到只读备忘录将不起作用。按键将被忽略,因为备忘录是只读的。要以有效的方式删除备忘录的最后一个字符,即不替换整个内容,您可以使用EM_SETSEL
和EM_REPLACESEL
。
var
Len: Integer;
begin
Len := Memo1.GetTextLen;
SendMessage(Memo1.Handle, EM_SETSEL, Len-1, Len);
SendMessage(Memo1.Handle, EM_REPLACESEL, 0, LPARAM(PChar('')));
end;
或者,如果您更喜欢包含这些 Windows 消息的纯 VCL 版本:
begin
Memo1.SelStart := Memo1.GetTextLen-1;
Memo1.SelLength := 1;
Memo1.SelText := '';
end;
后者可能会发送更多的 Windows 消息,但更容易阅读。我更喜欢后一种选择。
我可以看到的一个可能的问题是,它可能无法通过换行符执行您想要的操作。由于 Windows 换行符是两个字符 (CR+LF),如果备忘录中的最后一个字符是 LF,则需要删除两个字符。要处理它,您可能可以这样做:
begin
Memo1.SelStart := Memo1.GetTextLen-1;
Memo1.SelLength := 1;
if Memo1.SelText=#10 then
begin
Memo1.SelStart := Memo1.SelStart-1;
Memo1.SelLength := 2;
end;
Memo1.SelText := '';
end;