Créer une temporisation

Résolu
ced55957 Messages postés 108 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 19 juin 2012 - 20 févr. 2005 à 21:16
rozg Messages postés 8 Date d'inscription vendredi 12 décembre 2008 Statut Membre Dernière intervention 11 juin 2014 - 10 sept. 2009 à 15:09
bonjour
je voudrais savoir comment fait t'on pour créer une tempo avec un Tedit(ou on mais la valeur en seconde) un Timer un bouton et un label
Sachant que :
quand on mais par exemple 10seconde dans le Tedit et qu'on appuye sur le button le label s'affiche pendant 10 seconde et au bout de 10 seconde le label disparait

Je vous remercie d'avance pour m'aider!!

3 réponses

retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
20 févr. 2005 à 22:18
dans le form create, ou dans l'éditeur de form, tu mets ton la propriété enabled de ton timer false.

ensuite pour faire apparaître fait comme ça :p

label1.visible := true;

timer1.interval := strtoint(Edit1.text);

timer1.enabled := true;



et dans le timer:



procedure TForm1.Timer1Timer(Sender: TObject);

begin

label1.visible := false;

timer1.Enabled := false;

end;



voila!
3
rozg Messages postés 8 Date d'inscription vendredi 12 décembre 2008 Statut Membre Dernière intervention 11 juin 2014 1
10 sept. 2009 à 15:09
Il y a une solution un peu plus complexe mais qui offre beaucoup plus de souplesse dans certains cas.

1/ Tu crée une procédure et un Thread de préférence dans une unité séparée :
INTERFACE
USES WINDOWS;
PROCEDURE PostDelayedMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM; delais: LONGWORD);

implementation

USES Classes;

TYPE
Thdelais = class(TThread)
private
FHw: THandle;
FMsg: UINT;
FwParam: WPARAM;
FlParam:LPARAM;
Fdelais: LONGWORD;
protected
procedure Execute; override;
public
end;

PROCEDURE PostDelayedMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM; delais: LONGWORD);
VAR t: ThDelais;
BEGIN
t:=ThDelais.Create(TRUE); // On créé le Thread à l'état suspendu
WITH t DO BEGIN
FreeOnTerminate:=TRUE; // Pour qu'il s'autodétruise à la fin
FHw:=hWnd; // La fenêtre de destination du message
FMsg:=Msg; // Le message à envoyer
FwParam:=wParam; FlParam:=lParam; // Paramètres facultatifs
Fdelais:=delais; // Le délais d'attente
Resume; // Ceci lance le Thread (-> sa procédure Execute)
END;
END;

{ Thdelais }

procedure Thdelais.Execute;
begin
Sleep(fDelais); // Le Tread va dormir pendant la durée voulue
// Puis il enverra le message voulu à la fenêtre voulue.
PostMessage(FhW,FMsg,FwParam,FlParam);
Terminate; // Il se termine et s'autodétruit
end;


2/ Ensuite tu utilise cela dans ta forme (principale ou non) comme ceci

INTERFACE

CONST WM_TEMPO = WM_APP+$01; // Message de temporisation

type
TFMain = Class(TForm)
....
private
PROCEDURE WMTempo(var msg: TMessage); MESSAGE WM_TEMPO;
....
public
PROCEDURE QuiFaitApparaitreLeLabel;
end;

IMPLEMENTATION

PROCEDURE TFMain.QuiFaitApparaitreLeLabel;
BEGIN
...
Label1.visible:=TRUE;
PostDelayedMessage(self.handle,WM_TEMPO,0,0,500);
.... // On peu faire autre chose, le label s'éteindra au bout de 500 ms
.....
END;

PROCEDURE TFmain.WMTempo(var msg: TMessage);
BEGIN
Label1.visible:=FALSE;
END;


Le premier avantage c'est que l'on peu continuer l'exécution après avoir poster la tempo d'extinction du label.
Le second avantage est que ça ne consomme que très peu de ressources.
Le troisième c'est que l'on peu demander l'envoi différé de n'importe quel message, y compris donc des messages Windows comme de fermer une fiche etc...
1
dugy Messages postés 1 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 9 septembre 2009
9 sept. 2009 à 20:21
bjr
jai essayer de créer une fonction de temporisation.
et je l"utiliz dan mes programs
private sub retard(temps as integer)
debut = timer
while timer < debut + temps
wend
lorsq j"en ai besoin par expl pour 10s; retard(10) et sa marche..
0
Rejoignez-nous