Voici ce à quoi je suis arrivé et qui marche!
type TTimerPlus= class(TTimer)
public
pPlayer: pointer;
procedure Tasks(Sender: TObject);
constructor create(AOwner: Tcomponent); override;
End;
Type TPlayer: class(Tobject)
....
...
Public
constructor create(Requete: Trequete; AllocatedTimer: TTimerPlus);
End;
Constructor TTimerPlus.create(AOwner: TComponent);
Begin
inherited create(AOwner);
OnTimer:= Tasks;
Enabled:= false;
End;
Constructor TPlayer.create(Requete: Trequete; AllocatedTimer: TTimerPlus);
VAR
....
Begin
...
...
AllocatedTimer.pPlayer:= pointer(self);
AllocatedTimer.Enabled:= true;
End;
destructor Tplayer.destroy;
Begin
...
...
AllocatedTimer.free;
End;
procedure TTimerPlus.tasks(Sender: Tobject);
VAR
Player: TPlayer;
Begin
Enabled:= false;
Player:= TPlayer(pPlayer);
With Player do
try
...
Finally
Enabled:= true;
End;
End;
--
Maintenant pour allouer un timer au joueur, j'ai utilisé un tableau dynamique:
Var
Timers: Array of TTimerPlus;
Et lors de la première connexion d'un joueur on lui crée un timer au besoin et on le lui alloue:
N:=0;
While N< Length(Timers) do
Begin
If Timers[N]= nil then break;
Inc(N);
end;
if N>= Length(Timers) then SetLength(Timers,N+1);
Timers[N]:= TTimerPlus.create(Form1);
player:= Tplayer.create(Requete,Timers[N]);
Requete étant un objet qui permet d'identifier le joueur.
Lors de la destruction du joueur, le timer est libéré, ce qui fait qu'un autre joueur arrivant après peut le reprendre.
Ça marche! Merci!
2 avril 2014 à 09:38