实现函数指针的堆栈我们已经宣布它可以作为一个进度回调类型(如一个巨大的日志文件中每10,000行加载):在Delphi
// 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
。什么是实现一堆函数指针的正确方法?
好的,所以你的问题是你有堆栈类接受指针。但是你有一个双指针类型。所以你不能使用它。相反,您可以为使用动态数组作为基础存储的双指针类型实现一个足够简单的堆栈类。对于泛型,这是微不足道的,使用内置的类。没有它,这是很多恼人的样板。 –