實現函數指針的堆棧我們已經宣佈它可以作爲一個進度回調類型(如一個巨大的日誌文件中每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
。什麼是實現一堆函數指針的正確方法?
好的,所以你的問題是你有堆棧類接受指針。但是你有一個雙指針類型。所以你不能使用它。相反,您可以爲使用動態數組作爲基礎存儲的雙指針類型實現一個足夠簡單的堆棧類。對於泛型,這是微不足道的,使用內置的類。沒有它,這是很多惱人的樣板。 –