【问题标题】:How can I count characters and lines while I am typing on a Memo在备忘录上打字时如何计算字符和行数
【发布时间】:2013-11-06 16:55:04
【问题描述】:

我编写了以下代码来计算用户输入时的行数和字符数。但是它有一个问题,它在用户输入第一个字符后开始计数,当他按下退格键时它会增加计数器然后开始减少它。

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  Text1.Text := 'Lines: ' + IntToStr (Memo1.Lines.Count);
  Text2.Text := 'Characters: ' + IntToStr (Length(Memo1.Text));
end;

【问题讨论】:

  • OnChange 事件开始。
  • 当我在 OnChange 事件中执行此操作时,它不会更新,除非我按下回车键。
  • 感谢马库斯,它有效!
  • 如果您的目标是始终显示当前行和字符数,并且如果这将是一个 VCL 项目(我第一次想到的),那么您还需要处理当用户使用弹出菜单粘贴文本,因为这将更改备忘录文本而无需任何按键。不过对于移动平台我不知道你是否需要关心它。
  • 是的,即使文本已粘贴但未键入,我也想计算字符数,所以我想最好的解决方案是在 OnChangeTracking 事件上编写我的代码。非常感谢 TLama。

标签: delphi firemonkey delphi-xe5


【解决方案1】:

OnChangeTracking 事件编写一个处理程序。我第一次在这里发表评论时错过了您正在编写 FMX 应用程序,因此我建议使用 OnChange 事件是错误的。您可以在 VCL 项目中使用它,但在 FMX 中,OnChange 具有不同的含义。

OnChangeTracking 的引用声明:

在修改备忘录控件中的文本时发生。写一个 OnChangeTracking 事件处理程序可立即响应任何更改 对备忘录控件中的文本进行。备忘录的 Text 属性 控件将已更新以反映任何更改。这个事件 提供了第一个机会来响应修改, 用户通过在备忘录控件中键入来制作。

OnChangeTracking 和 OnChange 的区别在于 OnChangeTracking 发生在每次修改备忘录中的文本时 控制。

因此,如果您将代码移至 OnChangeTracking 事件处理程序,您应该可以让它工作:

procedure TForm1.Memo1ChangeTracking(Sender: TObject);
begin
  Text1.Text := 'Lines: ' + IntToStr (Memo1.Lines.Count);
  Text2.Text := 'Characters: ' + IntToStr (Length(Memo1.Text));
end;

【讨论】:

  • 对于大型内容,评估字符数会受到影响。
  • @David,我不知道它是如何在 FMX 中实现的。
  • 同一个TStrings
  • 这对于大量文本确实变得无法使用。但我不相信 FMX TMemo 可以处理大量文本!并不是说我知道如何做得更好。
  • @David,正如我所说。我不知道它是如何在 XE5 FMX 中实现的。我不知道 OP 在做什么,所以我们只希望它不会成为数十万字符的编辑器(在手机上这样的编辑器会有点不友好)。然而,重点是这里的事件;-)
【解决方案2】:
Text1.Text := 'Lines: ' + Memo1.Lines.Count.ToString;
Text2.Text := 'Characters: ' + Memo1.Lines.Text.Length.ToString;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    相关资源
    最近更新 更多