Her er der et lille demo program, der vist gør det du efter spørger.
Selve programmet har en Timer, en spinedit og en 2-3 knapper - ikke noget specielt.
Du kan se hele dynen på:
http://home1.inet.tele.dk/nip/temp/actionlist.zip (~180 kBytes)
Type
ProcedureAction = Procedure;
TListObject = class
Public
InsetTime: LongInt;
NoOfSec : LongInt;
Action : ProcedureAction;
Constructor Create(DelayTime : LongInt; aAction : ProcedureAction);
End;
{ TListObject }
constructor TListObject.Create(DelayTime: Integer; aAction: ProcedureAction);
begin
InsetTime:= GetTickCount;
NoOfSec := DelayTime;
Action := aAction;
end;
// Bemærk: Hvis Foo og Bar procedurene er meget tidskrævende, bør de
// Indeholde et eller flere Application.ProcessMessages kald for ikke at
// blokere for Windows eventstyringen - blandt andet også timeren der
// styre gennemløbet af listen.
// Det har selvfølgelig den effekt, at man risikere at procedurene kaldes
// flere gang "parallelt". De skal derfor være lavet, således at de
// ikke ubeskyttede globale variable (se: Multi programering, semaphores,
// Atoms etc...)
Procedure Foo;
Begin
ShowMessage('Foo Action fired');
End;
Procedure Bar;
Begin
ShowMessage('Bar Action fired');
End;
{ TForm }
procedure TForm1.FormCreate(Sender: TObject);
begin
// ProcList (ProcedureList eller ActionList) indeholder alle de
// actions der skal affyres på et eller andet tidspunkt.
ProcList := TStringList.Create;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
Var
CurTime: LongInt;
Index: Integer;
TempObj: TListObject;
begin
CurTime := GetTickCount;
For Index := 0 to ProcList.Count-1 Do
Begin
TempObj := (ProcList.Objects[Index]) As TListObject;
// Time to do the ding-thing?
If ((CurTime - TempObj.InsetTime) Div 1000) > TempObj.NoOfSec Then
Begin
// Remove the action from the list
ProcList.Delete(Index);
// Trigger the action
If Assigned(TempObj.Action) Then
TempObj.Action;
End;
End;
end;
procedure TForm1.buAddFooClick(Sender: TObject);
begin
ProcList.AddObject('', TListObject.Create(seDelayTime.Value, Foo));
end;
procedure TForm1.buAddBarClick(Sender: TObject);
begin
ProcList.AddObject('', TListObject.Create(seDelayTime.Value, Bar));
end;
procedure TForm1.buCloseClick(Sender: TObject);
begin
Close;
end;
end.
NiP/Delphi