Comment imbriquer des action timer les unes dans les autres ? [Résolu]

littlemogwai 4 Messages postés jeudi 27 mai 2004Date d'inscription 23 mars 2006 Dernière intervention - 22 mars 2006 à 18:18 - Dernière réponse : DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention
- 24 mars 2006 à 22:54
Bonjour,

Je cherche une solution pour imbriquer plusieurs action de timer.
un algo qui ressemble à ça
Affichage fenetre
Frappe de Touche
Timer1
Actions Timer1 :
Jouer un son
Timer2
Action Timer2 : Affichage image
Timer3
Action Timer3 : Cacher Image
Reprise suite du code
....

Je me dépatouille bien avec le premier bloc mais je n'arrive pas à voir comment faire pour déclencher le timer 2.
J'ai bien essayé d'activer dans l'action du timer1 le lancement du timer2 mais je n'y arrive pas.
Si quelqu'un a un tuyau... merci d'avance.
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 22 mars 2006 à 19:24
3
Merci
Salut,
Dans le l'évenement OnTimer du premier Timer tu écris

Begin
Timer1.Enable := Flase;
// Jouer un son
Timer2.Enable := True;
End ;

Dans le l'évenement OnTimer du deuxième Timer tu écris

Begin
Timer2.Enable : = Flase;
// Affichage Image
Timer3.Enable := True;
End ;

Dans le l'évenement OnTimer du troisième Timer tu écris

Begin
Timer3.Enable : = Flase;
// Cacher Image
// et si tu veux recommencer tu écris la ligne suivante
Timer1.Enable := True;
End;

@+
Cirec

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de Cirec
Meilleure réponse
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 22 mars 2006 à 20:02
3
Merci
salut,

moins classique avec un seul timer:

tu déclares autant d'actions que tu as besoin en tu réaffectes l'évènement on timer

procedure TForm1.action1(Sender: TObject);

begin

label1.caption:='Action1';

timer.interval:=2000;

timer1.OnTimer:=action2;

end;



procedure TForm1.Button1Click(Sender: TObject);

begin

timer1.OnTimer:=action1;

timer.interval:=1000;

timer1.Enabled:=true

end;



procedure TForm1.action2(Sender: TObject);

begin

label1.caption:='Action2';

timer1.Enabled:=false;

//

end;

@+

jlen

Merci jlen100 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de jlen100
Meilleure réponse
vaughan 207 Messages postés mardi 6 août 2002Date d'inscription 29 octobre 2008 Dernière intervention - 23 mars 2006 à 08:43
3
Merci
Est-ce que un sleep() dans ton timer1 ne peut pas te convenir ?

vaughan

Merci vaughan 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de vaughan
littlemogwai 4 Messages postés jeudi 27 mai 2004Date d'inscription 23 mars 2006 Dernière intervention - 23 mars 2006 à 14:31
0
Merci
En fait ces trois approches font un tout assez complet de mon souci :

La première solution est la plus classique : efficace par nature. Elle permet de prendre le bon chemin...
La deuxième est vraiment séduisante surtout quand on a beaucoup de conditions à gérer. Elle offre une grande souplesse mais réclame à mon avis une bonne rigueur pour ne pas "se perdre".
La troisième est, comme c'est souvent le cas, le truc le plus simple. On passe donc bien trop souvent à côté en cherchant à se compliquer la vie (ça devrait être l'inverse...). Pas la peine de prendre de l'artillerie "lourde" quand il ne s'agit que de figer l'appli : idéal quand on doit gérer une durée, une latence - comme pour mon histoire de délai entre son et image.

Génial d'avoir fait un tour aussi complet en si peu de temps. Merci à tous les trois, vous m'avez ouvert de nouveaux horizons .
Commenter la réponse de littlemogwai
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 23 mars 2006 à 16:12
0
Merci
Juste une petite précision sur l'utilisation de Sleep() :
Si vous utilisez un Sleep dans votre application elle sera figé pendant toute la durée du Sleep. Les messages windows ne sont pas traités par votre application (ce qui est normal mais on oublie souvent ce détail).

Un teste tout simple :
Une application avec un bouton, dans le OnClick de ce dernier y mette un Sleep(5000).
Lancer l'application cliquer sur le bouton et de suite sur la croix pour fermer.
Si vous avez été rapide vous devrez attendre 4 secondes encore avant que votre application n'exécute la commande de fermeture.

Et si tu en met deux dans la même procedure il faudra attendre la somme des deux Sleep à moins d'y intercaler un "Application.ProcessMessage" entre les deux.

A utiliser en connaissance de cause

@+
Cirec
Commenter la réponse de Cirec
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 24 mars 2006 à 13:12
0
Merci
Et donc, faut pas utiliser un sleep (l'appli dort trop profondément) tel quel, mais plutot un Snooze( tm, copyrighted toussa....) :p

et au cas par cas, adapter "step" en fonction de la réactivité souhaitée pour le reste du systeme.

procedure Snooze(Duration,Step:integer);
var i:integer;
begin
for i:=0 to (Duration div Step) do
begin
sleep(Step);
Application.ProcessMessages;
end;
end;
Commenter la réponse de DeltaFX
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 24 mars 2006 à 13:40
0
Merci
Non mais franchement il y en a un qui a osé mettre un Copyright sur ce code

@+
Cirec
Commenter la réponse de Cirec
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 24 mars 2006 à 14:05
0
Merci
quite à faire une fonction non bloquante autan utiliser un vrai timer en dynamique:

procedure TForm1.chronosleep(Sender: TObject);

begin

with sender as TTimer do enabled:= false;

label1.Caption:='ok'

end;



procedure Tform1.delay(duree:integer);

var chrono:TTimer;

begin

chrono: =Ttimer.Create(self);

chrono.interval:= duree;

chrono.ontimer:=chronosleep;

chrono.enabled:=true;

while chrono.Enabled do application.ProcessMessages;

chrono.Free;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

label1.Caption: ='';

delay (1000);

label1.Caption:='ok'



end;



@+

jlen
Commenter la réponse de jlen100
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 24 mars 2006 à 15:17
0
Merci
j'ai oublié d'enlever un morceau du test:

rocedure TForm1.chronosleep(Sender: TObject);
begin
with sender as TTimer do enabled:= false;

//label1.Caption:='ok'enlever cette ligne

end;

procedure Tform1.delay(duree:integer);

var chrono:TTimer;

begin

chrono: =Ttimer.Create(self);

chrono.interval:= duree;

chrono.ontimer:=chronosleep;

chrono.enabled:=true;

while chrono.Enabled do application.ProcessMessages;

chrono.Free;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

label1.Caption: ='';

delay (1000);

label1.Caption:='ok'



end;



@+

jlen
Commenter la réponse de jlen100
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 24 mars 2006 à 22:54
0
Merci
Bah ouais Copyrighted, registred toussa, le nom "Snooze" est de moi, nananèreuh, preums !
Commenter la réponse de DeltaFX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.