【发布时间】:2016-12-12 15:10:45
【问题描述】:
我们声明了一种可以用作进度回调的类型(例如从一个巨大的日志文件中每 10,000 行加载一次):
// Declared in some base unit
TProcedureCallback = procedure() of object;
// Declared in the class that loads the events
procedure ReadEvents(callback: TProcedureCallback);
// Implementation of above method
procedure TEvents.ReadEvents(callback: TProcedureCallback);
var
nEvents: Integer;
begin
nEvents := 0;
// Read some events...
Inc(nEvents);
// ...and repeat until end of log file
// Every 10,000 events, let the caller know (so they update
// something like a progress bar)
if ((nEvents mod 10000) = 0) then
callback();
end;
// And the caller uses it like this
public
procedure EventsLoadCallBack();
// Implementation of callback
procedure TfrmLoadEvents.EventsLoadCallBack();
begin
// Update some GUI control...
end;
// And the events are loaded like this
events.ReadEvents(EventsLoadCallBack);
这一切都很好......但我想将它扩展到 TObjectStack 容器,以便我们可以实现自动注销功能。这个想法是,在创建每个表单时,它都会注册一个回调(即将它推送到某个系统范围的堆栈上)。当表单被销毁时,它会从堆栈中弹出回调。如果发生自动注销,您只需展开堆栈并将用户返回到主窗体,然后执行与自动注销相关的其余工作。
但是,我无法让它工作...当我尝试将 TProcedureCallback 对象推送到堆栈上时,我得到编译器错误:
// Using generic containers unit from Delphi 7
uses
Contnrs;
// Declare stack
stackAutoLogOff: TObjectStack;
// Initialise stack
stackAutoLogOff := TObjectStack.Create();
// Attempt to use stack
stackAutoLogOff.Push(callback);
stackAutoLogOff.Push(TObject(callback));
// Clean up...
stackstackAutoLogOff.Free();
第一个返回Incompatible types,第二个返回Invalid typecast。实现函数指针栈的正确方法是什么?
【问题讨论】:
-
好的,所以您的问题是您拥有的堆栈类接受指针。但是你有一个双指针类型。所以你不能使用它。相反,您可以为使用动态数组作为底层存储的双指针类型实现一个足够简单的堆栈类。使用泛型,这很简单,使用内置类。没有它,就会有很多烦人的样板文件。
标签: delphi callback function-pointers delphi-7