Delphi 在备忘录上打字时,如何计算字符和行数

Delphi 在备忘录上打字时,如何计算字符和行数,delphi,firemonkey,delphi-xe5,Delphi,Firemonkey,Delphi Xe5,我编写了以下代码来计算用户键入时的行数和字符数。但它有一个问题,在用户输入第一个字符后,它开始计数,当用户按backspace时,它会增加计数器,然后开始减少计数器 procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin Text1.Text := 'Lines: ' + IntToStr (Memo1.Lines.Count);

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

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;
为事件编写处理程序。第一次在这里留下评论时,我错过了您正在编写FMX应用程序,因此我建议使用
OnChange
事件是错误的。您可以在VCL项目中使用它,但在FMX中,它有不同的含义

缔约国的参考:

在修改备注控件中的文本时发生。写一篇 OnChangeTracking事件处理程序立即响应任何更改 对备忘录控件中的文本进行修改。备忘录的文本属性 控件将已更新以反映任何更改。这件事 提供了第一次响应 用户通过在memo控件中键入来进行编辑

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

因此,如果您将代码移动到事件处理程序,您应该让它工作:

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

OnChange
事件中执行此操作。当我在OnChange事件中执行此操作时,它不会更新,除非我按enter键。谢谢Marcus,它可以工作!如果您的目标是始终显示当前行数和字符数,并且这是一个VCL项目(我第一次想到的),那么您还需要处理用户使用弹出菜单粘贴文本的情况,因为这将在不按任何键的情况下更改备忘录文本。对于移动平台,我不知道您是否需要关心它。是的,即使文本已粘贴且未键入,我也要计算字符数,因此我认为最好的解决方案是在OnChangeTracking事件上编写代码。非常感谢TLama。对于大的内容,计算字符数会带来伤害。@David,我不知道它是如何在FMX中实现的。这和Tstrings是一样的。对于大量的文本,这确实变得不可用。但是我不相信FMX TMemo可以处理大量的文本!!并不是说我知道如何做得更好。我不知道它是如何在XE5 FMX中实现的。我不知道OP在做什么,所以我们只希望它不会成为数十万个字符的编辑(在手机上,这样的编辑会有点不友好)。然而,主要的一点是这里的事件;-)
Text1.Text := 'Lines: ' + Memo1.Lines.Count.ToString;
Text2.Text := 'Characters: ' + Memo1.Lines.Text.Length.ToString;