如何创建将数据从一个单元发送到另一个单元的回调?

How do I create a callback that sends data from one unit to another?

我有 Unit1.pas 这是我的主要单元文件,还有另一个单元文件 TimerUpdates.pas 以编程方式接收事件,例如 Timer1Timer(Sender: TObject);

我想知道,我如何实现回调,我应该在什么时候使用它们而不是其他方法?

现在我知道我可以用 Unit1.Callback(Timer : TTimer); 响应 Timer1Timer(Sender: TObject); 并调用它,但我更想知道为什么我应该或不应该使用它而不是其他回调方法.

还在学习中。

尝试这样的事情:

Unit1.pas

uses
  ..., TimerUpdates;

procedure TMainForm.Callback(Timer : TTimer);
begin
  ...
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  TimerUpdates.OnTimerCallback := Callback;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  TimerUpdates.OnTimerCallback := nil;
end;

TimerUpdates.pas

interface

uses
 ..., ExtCtrls;

type
  TCallback = procedure(Timer: TTimer) of object;

var
  OnTimerCallback: TCallback;

implementation

...

procedure TSomeClass.Timer1Timer(Sender: TObject);
begin
  if Assigned(OnTimerCallback) then
    OnTimerCallback(TTimer(Sender));
end;

end.

为了分配您的事件过程,您必须使用一些 class 过程来避免 'method pointer and regular procedure' 问题。

你不需要创建一个新的class,你可以使用 TForm 而不是 myClass

Unit1.pas :

unit Unit1;

interface

  procedure CreateTimer;

implementation

uses Vcl.ExtCtrls, TimerUpdates;

type
  TmyClass = class
    procedure onTimer(Sender: TObject);
  end;

var myClass : TmyClass;


procedure CreateTimer;
begin
  Timer := TTimer.Create(nil);
  Timer.Interval := 1000;
  Timer.OnTimer := myClass.onTimer;
  Timer.Enabled := True;
end;

{ TmyClass }

procedure TmyClass.onTimer(Sender: TObject);
begin
  //do what you want
end;

end.

TimerUpdates.pas

unit Unit2;

interface

uses Vcl.ExtCtrls;

var
  Timer: TTimer;

implementation

end.