ced55957
Messages postés108Date d'inscriptiondimanche 2 mars 2003StatutMembreDernière intervention19 juin 2012
-
20 févr. 2005 à 21:16
rozg
Messages postés8Date d'inscriptionvendredi 12 décembre 2008StatutMembreDernière intervention11 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
rozg
Messages postés8Date d'inscriptionvendredi 12 décembre 2008StatutMembreDernière intervention11 juin 20141 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...
dugy
Messages postés1Date d'inscriptionmardi 16 juin 2009StatutMembreDerniè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..