Timer / mettre une temporisation a une action...

Signaler
Messages postés
31
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 mai 2010
-
Messages postés
31
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 mai 2010
-
bonjour ! je voudrai temporiser une action, c.a.d, avec un bouton, qui active ou désactive l'option, qu'il éxecute une action toutes les minutes ( a peu près ) du moins a interval régulier.... comment faire ?

8 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Première étape : le code dans l'évènement OnClick du bouton :
procedure TForm1.Button1Click(Sender: TObject);
begin
  //Bazscule l'état actif/inactif du timer
  Timer1.Enabled := not Timer1.Enabled;
  //changer l'intitulé du bouton
  if Timer1.Enabled then
    Button1.Caption := 'Timer Activé'
  else
    Button1.Caption := 'Timer désactivé';
end;


Deuxième étape : vien ensuite le code à exécuter quand le timer est actif :
procedure TForm1.Timer1Timer(Sender: TObject);
var
  WinDir: array[0..Max_Path] of char;
begin
  //Recher le chemin de Windows 
  GetWindowsDirectory(@Windir, Max_Path);
  //Repeindre la fiche pour effacer le texte inscrit
  // précédemment sur la canvas de la fiche
   Repaint;
  //démarrer l'action et tester la valeur de 
  //retour de ShellExecute 
  if ShellExecute(0, nil, PChar(Windir+'\system32\cmd.exe'), PChar('/c net send /users '+Message_Edit.text), nil, SW_HIDE) > 32 then
     Canvas.Textout(10, 10 , 'Le Message à Bien été envoyé aux personnes accédant a vos dossiers partagés')
   else
     Canvas.TextOut(10, 10, 'Echec à l''envoi du message');

end;


En regardant le code que tu m'as communiqué, j'ai deux remarques à faire :
1- Utiliser le registre pour connaitre le chemin de windows n'est pas une bonne idée. Sur mon système, je n'avais aucune entrée portant ce nom à l'endroit recherché. J'ai donc remplacé par un appel à GetWindowsDirectory qui renverra toujours la valeur correcte, quelle que soit la version de Windows.

2- Un appel à la fonction ShowMessage est formellement déconseillé dans un évènement qui s'exécute aussi fréquemment (1 seconde) car le programme est bloqué tant que l'utilisateur n'a pas appuyé sur le bouton ok. Il finira par se lasser très vite. %-6

Bonne chance pour la suite.
Messages postés
31
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 mai 2010

Merci beaucoup, mais pour modifier la fréquence du timer ? comment faire ?
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Modifier la propriété Interval du composant TTimer.
Messages postés
31
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 mai 2010

Par ailleur, Canvas.TextOut ne marche pas ... pk ?
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Canvas fait implicitement référence à Form1.Canvas.
As-tu mis le code dans une méthode de la fiche ou dans une procédure à part ?
Quand tu écris que ça ne marche pas, pourrais-tu être plus précis ?
Est-ce un problème avec les coordonnées que tu as mises et qui seraient en dehors de la surface de dessin ?
Messages postés
31
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 mai 2010

pour les coordonées je ne sais pas, je débute alors bon mais sinon j'ai incsrit ca sachant que Form1 a pour nom Menu:

procedure TMenu.Timer1Timer(Sender: TObject);
var
WinDir: array[0..Max_Path] of char;
begin
//Recher le chemin de Windows 
GetWindowsDirectory(@Windir, Max_Path);
//Repeindre la fiche pour effacer le texte inscrit
// précédemment sur la canvas de la fiche
Repaint;
//démarrer l'action et tester la valeur de 
//retour de ShellExecute 
if ShellExecute(0, nil, PChar(Windir+'\system32\cmd.exe'), PChar('/c net send /users '+Edit1.text), nil, SW_HIDE) > 32 then
Canvas.Textout(10, 10 , 'Le Message à Bien été envoyé aux personnes accédant a vos dossiers partagés')
else
Canvas.TextOut(10, 10, 'Echec à l''envoi du message');

end;

end.


Ps: les valeurs a entrer ds le timer pour la durée sont exprimée en quel unitée ?
j'ai mis interval : 100000 mais je ne connai pas l'unité, cependant, cette valeur me convient.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Un appui sur la touche F1 quand un composant est sélectionné te donnerait les réponses plus rapidement.

La propriété Interval est exprimée en millisecondes.

Le texte écrit par CanvasTextOut est situé en haut à gauche de la surface cliente de la fiche. Mais si tu as mis un composant à cet endroit là, évidemment tu ne peux pas le voir.
Allez hop, le curseur sur "TextOut", appui sur la touche F1 et tu auras toutes les précisions utiles.
C'est une habitude qu'il faut prendre dès le départ. Attendre les réponses à des questions pour lesquelles tu as la réponse à un clic de souris ne va pas t'aider à progresser rapidement.
Comment faisait-on avant quand il n'y avait pas d'internet ni de forum ? :approve)
Messages postés
31
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 mai 2010

LoL ca devait etre la misère sans le web ni forum ! :big)
Encore un grand merci