将BS(退格)发送到TMemo

时间:2012-08-03 14:28:13

标签: delphi-7 vcl delphi

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

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

感谢您的帮助。

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

1 个答案:

答案 0 :(得分: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;