如何创建将数据从一个单元发送到另一个单元的回调?
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.
我有 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.