我有 Unit1.pas
是我的主要单元文件,我还有另一个单元文件 TimerUpdates.pas
以编程方式接收事件,例如 Timer1Timer(Sender: TObject);
我想知道,如何实现回调,以及何时应该使用它们而不是其他方法?
现在我知道我可以用 Timer1Timer(Sender: TObject);
响应 Unit1.Callback(Timer : TTimer);
并调用它,但我更想知道为什么我应该或不应该使用它而不是其他回调方法。< /p>
还在学习中。
答案 0 :(得分:1)
尝试这样的事情:
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.
答案 1 :(得分:-1)
为了分配你的事件过程,你必须使用一些类过程来避免“方法指针和常规过程”问题。
你不需要创建一个新的类,你可以使用 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.