将BS(退格)发送到TMemo

Ben*_*iss 3 delphi vcl delphi-7

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

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

谢谢您的帮助.

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

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢包含这些Windows消息的纯VCL版本:

begin
  Memo1.SelStart := Memo1.GetTextLen-1;
  Memo1.SelLength := 1;
  Memo1.SelText := '';
end;
Run Code Online (Sandbox Code Playgroud)

后者可能会发送更多的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;
Run Code Online (Sandbox Code Playgroud)