Petit souci d’exécution

Résolu
Aklissj5 - 4 sept. 2012 à 03:53
 Caribensila - 10 sept. 2012 à 12:01
Bonjour !
J'ai un petit souci avec ce code, je voudrais obtenir une sorte de chronomètre(h/m/s)point de départ d'une application censé gérer les postes d'un Cybercafé. Je me suis "comme qui dirait" frotté au composant Ttimer ( mes trois ans passé sans toucher une ligne de code y sont aussi pour quelque chose )

Bref voila le topo



Procedure Onstart;
Begin
 min:=0;
 sec:=0;
 heur:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);

//Secondes,minutes,heures
begin
If sec < 59 then
 sec:=sec+1
else
 begin
 sec:=0;
 min:=min+1;
 if min < 59 then
  min :=min+1
 else
  min:=0;
  heur:=heur+1;
 end;

//Changement du caption des labels
Label3.caption:= inttostr(sec);
Label2.caption:= inttostr(min);
Label1.caption:= inttostr (heur);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled :=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.enabled:=false;
end;




Le problème ce situe au moment d’incrémenter la variable min (minutes), au lieu d'ajouter +1 acelle-ci après la 59 eme seconde il me fait +2 et par dessus le marché il incrémente également la variable heure de +1


J'ignore d'où ça peut bien venir et pourtant j'ai essayé pas mal de combines (me connaissant cela doit être un truc tout bête ><)... je sens déjà ma raison vaciller

Merci de votre aide :)

27 réponses

Merci Beckerich, cela fonctionne a merveille je suis également heureux de constater que la fonction Format gère aussi la conversion des nombres en chaines de caractères, dans ce cas plus besoin d'inttostr


Je viens de rencontrer un autre soucis majeur au niveau du code gérant la tarification et l'affichage du prix, je ne comprend pas pourquoi mais le label qui censé afficher le prix ne bouge pas d'un yota (certainement une erreur d’inattention, dure dure la reprise lol)

var
  Form1: TForm1;
  min:integer;
  sec:integer;
  heur:integer;
  tarifbase:integer;
  tempsbase:integer;
  tempstotal:integer;
  Prix:integer;
  Monai:string;

implementation

{$R *.dfm}

Procedure Onstart;
Begin
 min:=0;
 sec:=0;
 heur:=0;
 //Variables relatives a la tarification (valeurs test en attendant d'effectuer
 //la liaison avec le serveur + enregistrement
 tarifbase:=5;
 tempsbase:=5;
 tempstotal:=0;
 Prix:=tarifbase;
 Monai:='Coins';
end;
procedure TForm1.Timer1Timer(Sender: TObject);

//Calcul total minutes (sur la base d'une tarification à la minute)
Tempstotal:= min+(heur*60);
//Calcul du prix
begin
If tempstotal >= tempsbase then
Prix:=prix+tarifbase;
tempstotal:=tempstotal-tempsbase;
end;
//affichage du prix sur le caption du label
Label7.Caption:=inttostr(prix);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled :=True;
 Button1.enabled:=false;
 Label7.Caption:=inttostr(tarifbase);
end;

end.



Merci encore
0
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
5 sept. 2012 à 16:00
Bonjour,

Le code ci-dessous ne peut pas compiler !!!

procedure TForm1.Timer1Timer(Sender: TObject);

//Calcul total minutes (sur la base d'une tarification à la minute)
Tempstotal:= min+(heur*60);
//Calcul du prix
begin
If tempstotal >= tempsbase then
Prix:=prix+tarifbase;
tempstotal:=tempstotal-tempsbase;
end;
//affichage du prix sur le caption du label
Label7.Caption:=inttostr(prix);
end;


plutôt

procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Calcul total minutes (sur la base d'une tarification à la minute)
Tempstotal:= min+(heur*60);
//Calcul du prix
If tempstotal >= tempsbase then
Prix:=prix+tarifbase;
tempstotal:=tempstotal-tempsbase;
//affichage du prix sur le caption du label
Label7.Caption:=inttostr(prix);
end;


ensuite, le click du bouton active le timer. Dans le timer1.timer, label7.caption est mis à jour, mais ensuite tu le changes de nouveau avec label7.caption := inttostr(tarifbase). Un des 2 est de trop je pense.

Luc.
0
Merci pour ta réponse :)

Petit éclaircissement concernant la dite "redondance" de mise à jour du label :

Label7.Caption:=inttostr(prix);


Au click (début de la tarification) la variable "prix" reçoit immédiatement la valeur "tarifbase" (somme de départ) cf à l'initialisation antérieur Prix:=tarifbase sur la procédure OnStart. Le label doit donc théoriquement afficher "5 Coins" dès le dépars (cf à l'exemple).

//Calcul total minutes (sur la base d'une tarification à la minute)
Tempstotal:= min+(heur*60);
//Calcul du prix
If tempstotal >= tempsbase then
Prix:=prix+tarifbase;
tempstotal:=tempstotal-tempsbase;
//affichage du prix sur le caption du label
Label7.Caption:=inttostr(prix);


La par contre, si le temps de base est atteint ou dépassé (dans cet exemple 5 minutes) j'effectue le calcul "Prix"+"tarifbase" et ainsi de suite chaque fois que le temps de base est a nouveau atteint (en gros dans l'exemple je rajoute 5 unités toutes les 5 minutes)Le label est ensuite de nouveau mis à jour


Ce qui me chiffonne c'est que ni l'affichage du tarif de base au départ de la tarification(Prix:=tarifbase), ni l’incrémentation "prix"+"tarifbase" a chaque fois que le "tempsbase" est atteint devant par la suite mettre a jour le Label.caption ne se réalisent ???

Pas facile de passer de la théorie à la pratique

Merci encore
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
6 sept. 2012 à 11:50
Salut,
question con : dans ton Button1Click tu lances la procedure OnStart ?
@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut Yanb,
Non je ne lance pas la procédure OnStart dans Button1Click. C'est une procédure à part que j'ai crée au début du programme pour initialiser mes variables

Procedure Onstart;
Begin
 min:=0;
 sec:=0;
 heur:=0;
 //Variables relatives a la tarification (valeurs test en attendant d'effectuer
 //la liaison avec le serveur + enregistrement
 tarifbase:=5;
 tempsbase:=5;
 tempstotal:=0;
 Prix:=tarifbase;
 Monai:='Coins';
end;


Toujours pas d'idées concernant l'origine du problème ?


Merci
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
7 sept. 2012 à 12:05
re,
pourquoi cette idée
Ben tu nous as jamais montré l'endroit du lancement de la procedure OnStart,
oui elle existe, mais si la procedure n'est jamais executé les variables ne seront jamais initialisées...
@+
0
Salut Yanb, Merci pour ta réponse

En effet, ton idée étais la bonne
J'ai déplacé l'initialisation de certaines variables sur le Button1click

procedure TForm1.Button1Click(Sender: TObject);
begin
 //Initialisation variales temps
 tempsbase:=0;
 tempstotal:=0;
 //Monai
 Monai:='DA';
 //Initialisation du Compteur
 Ix:=1;
 //valeurs test (tarifbase et tempsbase) en attendant d'effectuer
 //la liaison avec le serveur + enregistrement
 tarifbase:=5;
 tempsbase:=5;
 Timer1.Enabled :=True;
 Button1.enabled:=false;
 Prix:=tarifbase;
 Label7.Caption:=inttostr(prix);
end;


Et ça marche :D

J'ai crée la procédure Onstart en pensant qu'elle allait être exécuté au démarrage du programme ce n'est pas le cas ? (vagues souvenirs ...)

J'ai tout de même laissé trois variables sur la procédure Onstart, jusqu'ici elles ne m'ont posé aucun problème

Procedure Onstart;
Begin
 min:=0;
 sec:=0;
 heur:=0;
end;


J'ai également modifié le code régissant le calcul de la tarification, l'ancien s’emballait après la 5 eme minute J'ai donc ajouté un ti compteur à l’intérieur de la procédure Ttimer

//Calcul du prix
If Ix=(tempsbase*60)then
  begin
  Prix:=prix+tarifbase;
  Ix:=1;
  //affichage du prix sur le caption du label
  Label7.Caption:=inttostr(prix);
  end
else
 ix:=ix+1;


Voila une affaire rondement menée comme dirait l'autre

Maintenant (avant de m'attaquer au composant Indy) je souhaiterais que le bouton servant a débuter la tarification se retrouve sur une autre forme (ex forme 1), au click cette forme deviendras "invisible" et activera la forme 2 content le reste des composant dont le Ttimer.
Et bien evidemment la Forme 2 céderas la place à la forme 1 lorsque l'utilisateur mettras fin à ça session (arrêt de la tarification + affichage du prix sur la forma 1)

Je souhaiterais également adapter la taille de la forme 1 à celle de l'écran de façon a ce qu'elle s'affiche en mode "Full screen" (elle devras tout recouvrir, barre d'outils y compris)

Et si possible j'aimerais interdire la fermeture de l'application, et par la même occasion imposer un certain nombre de restriction à l'utilisateur du poste client comme ; ne pas accéder au gestionnaire des taches, interdire l'accès au registre, à l'msconfig etc... (la non plus je n'ai pas la moindre idée de la manière dont je doit m'y prendre

Merci encore
0
Rejoignez-nous