Мы объявили тип, который может быть использован в качестве ходе обратного вызова (например, загрузка каждые 10000 строк из гигантского файла журнала):Реализовать стек указателей на функции в 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();
1-ые возвращается Incompatible types
и 2-й Invalid typecast
. Каков правильный способ реализации стека указателей на функции?
ОК, поэтому ваша проблема в том, что класс стека у вас есть указатели. Но у вас есть тип двойного указателя. Поэтому вы не можете его использовать. Вместо этого вы можете реализовать достаточно простой класс стека для ваших типов двойного указателя, который использует динамический массив в качестве основного хранилища. С generics это тривиально, используя встроенные классы. Без этого много раздражающего шаблона. –