【问题标题】:Send BS (Backspace) to a TMemo发送 BS(退格键)到 TMemo
【发布时间】:2012-08-01 14:50:12
【问题描述】:

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

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

感谢您的帮助。

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

【问题讨论】:

  • 更改Text 是您的解决方案。如果备忘录是只读的,它将忽略您输入它的尝试。如果您只想删除最后一个字符,那么有一些 Windows 消息可以有效地做到这一点。这比重新填充整个文本要好。您想了解如何执行此操作吗?
  • 我知道 SendMessage 但我不知道使用什么参数。样品将不胜感激:)

标签: delphi-7 vcl delphi


【解决方案1】:

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

【讨论】:

  • 看起来不错,谢谢。我不知道为什么,但最后一个字符卡住并留在备忘录中。
  • 我遇到了一个错误。我认为现在的代码很好。这里正在进行一些最终测试......
  • 是的,我现在很满意。使用处理换行符的第三个版本。当然,它确实假设换行符始终是 CR+LF,但无论如何,你在这里有足够的东西让它像你需要的那样健壮。
  • 很抱歉参加聚会,但是您将如何对备忘录执行 VK_RETURN (ENTER) ?另一个问题,TMemo 怎么不响应 WM_KEYUP/DOWN 消息?顺便说一句,而不是使用 SendMessage,你可以只做 Memo1.Perform()
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 2014-11-24
相关资源
最近更新 更多