3

我想向 TMemo 发送一个 BackSpace 控制字符,就像用户实际按下 BackSpace 按钮一样。

我的备忘录是只读的,如果我单击一个按钮,它应该删除备忘录中的最后一个字符。我想在不使用 Memo.Text 的情况下做到这一点:= ...(所以没有重绘或 beginupdate 等)这可能吗,如果可以,怎么做?

感谢您的帮助。

编辑:我试图添加#8但没有运气......

4

1 回答 1

6

将按键发送到只读备忘录将不起作用。按键将被忽略,因为备忘录是只读的。要以有效的方式删除备忘录的最后一个字符,即不替换整个内容,您可以使用EM_SETSELEM_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;
于 2012-08-03T14:36:17.560 回答