Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何知道用户何时更改了TMemo/TEdit中的文本?_Delphi - Fatal编程技术网

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

Delphi 如何知道用户何时更改了TMemo/TEdit中的文本?,delphi,Delphi,TMemo(和其他类似的控件)只有OnChange事件,这一事实一直困扰着我。我想知道用户何时更改文本,而不是何时以编程方式更改文本 我知道有两种方法可以区分用户更改的文本和程序更改的文本: 在以编程方式更改文本之前,Put OnChange:=NIL。然后恢复OnChange。这很容易出错,因为您需要记住每次更改代码中的文本时都要这样做(并且需要对哪些备忘录/编辑应用这种特殊处理)。现在我们知道,每次调用OnChange时,控件都是由用户编辑的 捕获OnKeyPress、MouseDown等事

TMemo(和其他类似的控件)只有OnChange事件,这一事实一直困扰着我。我想知道用户何时更改文本,而不是何时以编程方式更改文本

我知道有两种方法可以区分用户更改的文本和程序更改的文本:

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

  • 有一种更优雅的方法吗?

    您可以编写一个帮助程序来执行选项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
    ,因此您可以执行另一个类似的过程来接受
    行:TStrings
    参数。

    如何使用该属性

    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;
    

    如果更改来自粘贴,该怎么办?还是来自自动化?除了打字或应用程序代码,还有很多东西可以改变内容。这就引出了一个问题——为什么这很重要?也许你试图解决错误的问题。