如何知道USER何时更改了TMemo/TEdit中的文本?

WeG*_*ars 3 delphi

我总是被TMemo(和其他类似控件)只有OnChange事件的事实所困扰.我想知道USER何时更改了文本,而不是以编程方式更改文本.

我知道两种方法来区分用户更改的文本和以编程方式更改的文本:

  1. 在以编程方式更改文本之前放置OnChange:= NIL.然后恢复OnChange.这很容易出错,因为每次更改代码中的文本时都需要记住这一点(以及要应用此特殊处理的备忘录/编辑).现在我们知道每次调用OnChange时,控件都是由用户编辑的.
  2. 捕获OnKeyPress,MouseDown等事件.确定文本是否实际更改并手动调用用户编辑ext时需要调用的代码.这可能会为已经很大的文件添加大量过程.

有一种更优雅的方式吗?

kob*_*bik 5

您可以编写一个帮助程序来执行选项1,并在您希望确保在设置文本时不触发任何事件时在框架中使用OnChange.例如:

type
  TCustomEditAccess = class(TCustomEdit);

procedure SetEditTextNoEvent(Edit: TCustomEdit; const AText: string);
var
  OldOnChange: TNotifyEvent;
begin
  with TCustomEditAccess(Edit) do
  begin
    OldOnChange := OnChange;
    try
      OnChange := nil;
      Text := AText;
    finally
      OnChange := OldOnChange;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

TMemo还有也Lines触发的属性OnChange,因此您可以创建另一个接受Lines: TStrings参数的类似过程.