Gambas France BETA


Pas de compte ? Incription

Calcul d'une durée

1
AuteurMessages
Foromus#1 Posté le 7/6/2017 à 13:14:17
Bonjour à tous,

Voilà, je veux calculer, et afficher, une durée.
Je clique sur le bouton Départ au début de l’événement, ensuite, je clique sur le bouton Arrêt lorsque l'événement est terminé. Entre-deux, j'affiche la progression du temps qui s'écoule, style hh:mn::ss.
Ma première idée était de prendre l'heure de début, l'heure courante, de soustraire l'heure de début de celle courante, vu que cette dernière augmente tout le temps (évidemment, si je démarre à minuit moins cinq, je vais avoir des soucis...).
Ensuite, je me suis dit que l'utilisation d'un Timer ferait l'affaire, en mettant dedans une variable de comptage :
1
lblAffiche.text = Format$(comptage, "hh:nn:ss").

Mais ça ne marche pas...
Je suis donc revenu à mon idée de départ en utilisant Time, celui du début, dans une variable appropriée, type float ou date, mais ça ne marche pas non plus, la formule est refusée. J'ai tenté Now au lieu de Time, même souci.
Donc, là, je cale...
Je pourrais aussi prendre deux variables de type Date et les soustraire, mais là je ne sais pas faire la soustraction. Dommage, ça serait peut-être le plus simple et le plus efficace...
vuott#2 Posté le 7/6/2017 à 15:20:55
Ne cedere ineluctabili possimus
Je pourrais aussi prendre deux variables de type Date et les soustraire, mais là je ne sais pas faire la soustraction.

...et si tu utilisais la fonction " DateDiff( ) " ? :|
« Vita non suavis esse potest, nec Mors amara. »
Foromus#3 Posté le 7/6/2017 à 20:22:17
Bonjour à tous,

Effectivement, j'ai du voir cette fonction dans une vie antérieure, mais je l'avais totalement oubliée. Car jamais utilisée !
J'ai tenté, mais la syntaxe ne passe pas, le troisième élément, un integer, semble poser souci. Et par ailleurs, je me dis que ce ne doit pas être la bonne voie, car je suppose que, si ça marche, je vais récolter une valeur en jours, or, ce n'est pas ce que je cherche, je souhaite une durée en minutes et secondes, voire en heures si les minutes excèdent soixante.
Donc, il me semble que je doive partir, ou de Time, ou de Now, mais pas de date.
Si je ne trouve aucune solution, je vais revenir à mon Timer, quitte à bidouiller une extraction des minutes et des heures, ce qui me semble faisable. Mais c'est vrai que la soustraction me paraissait plus intéressante, plus juste aussi, je ne suis pas certain que le Timer bascule bien au temps donné, et par ailleurs, si je le calibre à 1000, c-à-d à la seconde, je ne suis pas certain que le temps qu'il prendra pour exécuter les commandes concernées seront ou non prises en compte dans la durée du cycle.
Flachy Joe#4 Posté le 7/6/2017 à 21:22:50
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSalut,
DateDiff permet d'obtenir l'intervalle dans une unité définie : http://gambaswiki.org/wiki/lang/datediff?l=fr

Mais on peux soustraire des variables de type Date pour obtenir une Date puis utiliser la fonction Time pour ne récupérer que la partie horaire :
1
2
3
4
5
6
DIM d1 AS DATE, d2 AS DATE
d1 = Now()
SLEEP 5
d2 = Now()

Message(Time(d2 - d1))

On obtient bien 00:00:05

;) Flachy Joe ;)
vuott#5 Posté le 8/6/2017 à 01:26:36
Ne cedere ineluctabili possimus
DateDiff permet d'obtenir l'intervalle dans une unité définie

Oui, alors dans ce cas nous pouvons écrire:
1
2
3
4
5
6
7
8
9
10
11
PUBLIC SUB Main()

DIM d1 AS DATE, d2 AS DATE

d1 = Now()
SLEEP 5.123
d2 = Now()

PRINT Time(d2 - d1), CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(d1, d2, gb.Millisecond)))

END
« Vita non suavis esse potest, nec Mors amara. »
Foromus#6 Posté le 8/6/2017 à 10:48:04
Bonjour à tous,

Et grand merci pour votre aide.

Suite aux infos, j'ai tenté diverses syntaxes.
Ça marcherait presque...

Si je fais :

1
lblComptage.Text = CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(TpsInitial, TpsFinal, gb.Millisecond)))


ça fonctionne, mais l'affichage est invivable, les dixièmes s'affichent après les secondes suivies d'un point, et comme il n'y a pas forcément les 3 décimales, l'affichage se ballade latéralement.
J'ai tenté de tripler le dernier zéro, mais sans résultat concret.

Si je fais :

1
lblComptage.Text = CStr(Date(0, 0, 0, 0, 0, DateDiff(TpsInitial, TpsFinal, gb.Second)))


ça marche impec, mais .... 59 secondes seulement, après quoi, GB me dit qu'il y a erreur de date....

Pas possible d'aller au-delà d'une minute, dommage, ça me plaisait bien....

Par contre, la formule :

1
lblComptage.Text = Time(TpsFinal - TpsInitial), CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(TpsInitial, TpsFinal, gb.Second))))


ça, c'est refusé d'emblée, GB me dit qu'il manque une virgule ou encore, qu'il y en a une en trop, je ne sais plus.

Par contre :

1
lblComptage.Text = Time(TpsFinal - TpsInitial)

m'affiche la même chose que la première ligne.

J'ai bien trouvé l'exemple dans la bibliothèque de Gambas, mais c'est juste un compteur, par un chronomètre comme mentionné par erreur.

Flachy Joe#7 Posté le 8/6/2017 à 22:54:48
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSi tu ne veux pas afficher les millisecondes, tu peux utiliser
1
lblComptage.Text = Format(Time(TpsFinal - TpsInitial), gb.LongTime)


Il y a une virgule au milieu de la ligne
1
PRINT Time(d2 - d1), CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(d1, d2, gb.Millisecond)))
car c'est un séparateur pour le mot-clef PRINT.
;) Flachy Joe ;)
vuott#8 Posté le 9/6/2017 à 01:46:46
Ne cedere ineluctabili possimusEhmmm... évidemment j'ai écrit cette ligne:
1
PRINT Time(d2 - d1), CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(d1, d2, gb.Millisecond)))

seulement pour faire une comparaison entre les deux instructions. :|
« Vita non suavis esse potest, nec Mors amara. »
Foromus#9 Posté le 9/6/2017 à 18:13:43
Merci à tous,

Finalement, j'ai opté pour une solution simple et efficace, à partir d'un Timer, et en plus, j'ai l'affichage que je veux !
Bon, pour l'exactitude, c'est assez approximatif, mais il y a toujours la possibilité de modifier très légèrement le délai du Timer,j'aurais pu mettre un réglage, mais après tout, ce n'est pas destiné à mesurer une compétition olympique !
1