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

时间:2017-01-18 12:37:57

标签: delphi

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

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

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

2 个答案:

答案 0 :(得分:5)

您可以编写帮助程序来执行选项1,并在框架中使用,只要您确保在设置文本时不会触发OnChange事件。 e.g:

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;

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

答案 1 :(得分:1)

如何使用Modified属性?

procedure TForm1.MyEditChange(Sender: TObject);
begin
    if MyEdit.Modified then
    begin
        // The user changed the text since it was last reset (i.e. set programmatically)

        // If you want/need to indicate you've "taken care" of the 
        // current modification, you can reset Modified to false manually here.
        // Otherwise it will be reset the next time you assign something to the 
        // Text property programmatically.
        MyEdit.Modified := false;
    end;
end;