Bonsoir,
Comment convertir des minutes en milliseconde
ex: dans ma TEdit j'ai 1:30 donc comment les convertir, je bloque.
Cordialement
Bonsoir,
Comment convertir des minutes en milliseconde
ex: dans ma TEdit j'ai 1:30 donc comment les convertir, je bloque.
Cordialement
salut,
tu recherche la position du ':', tu prends le bout de chaine avant cette position, tu converti en integer et tu multiplie par 60000, puis tu prends le bout de chaine après cette position, tu convertie et multiplie par 1000
Enfin, tu additionne les 2 résultats.
Aurais tu un petit exemple de code car je suis un peu perdu?
Quand je dit 1:30 cela peu aussi etre 5:45 ou autre min:sec
Te faire le code, non, ça t'aiderait pas à apprendre.
Mais je peux te donner quelques pistes :
- Pour connaitre la position d'une chaine de caractère (à fortiori, d'un seul caractère) dans une autre, tu peux utiliser l'instruction POS (nota : la position du premier caractère d'une chaine est 1 en Delphi, et non pas 0 comme dans bien d'autres langages)
- Pour récupérer une partie d'une chaine de caractère, tu peux utiliser l'instruction COPY
- Pour convertir une chaine en nombre tu utilisera StrToInt par exemple pour avoir un integer
J'imagine que addition et multiplication tu sais faire.
Un forum sert à aider et a fournir aussi du code tu dois etre radin
Bonjour,
faut pas pousser non plus le bouchon, je trouve même cette remarque limite carton jaune
un peu de recherche ne fait de mal à personne et c'est ainsi que l'on apprend. De plus vous n'indiquez même pas de quelle version de Delphi il s'agit !
il m'a fallu peu de temps pour trouver une fonction déjà existante des versions XE dans DateUtils et même un exemple dans le docwiki
Bonjour,
juste pour info, ces fonctions sont déjà disponibles avec D7il m'a fallu peu de temps pour trouver une fonction déjà existante des versions XE dans DateUtils
Pour faire ce que tu cherches, c'est TRES simple
Tu as 1:30 ou 5:45
Cela tombe bien, le : est géré par Delphi sur un OS Français
comme le format c'est min:sec
* Si min est entre 0 et 59
Phase 1 : Transformer 1:30, 5:45 ou 59:59 en 00:01:30, 00:05:45 ou 00:59:59
Indice, il suffit juste d'utiliser Length et la concaténation par l'opérateur +
Phase 2 : Transformer 00:01:30, 00:05:45 ou 00:59:59 en TDateTime
Indice, StrToTime
Phase 3 : Mutliplier ce TDateTime dont la partie flottante exprime des heures, donc multiplier par SecsPerHour * MSecsPerSec
Indice, la fonction Trunc éliminera la nouvelle partie flottante en µs secondes
* Si min est entre 60 et 1439
Phase 0 : Transformer 500:30 ou 1000:45 en 08:20:30 ou 16:40:45
On retourne donc en Phase 1
*
Si min dépasse 1439, il faut peut-être songer à écrire complètement l'algo !
Et c'est TRES TRES SIMPLE, environ 4 Lignes de code
Indice, la fonction Pos pour trouver le : et Copy pour diviser en deux chaines
Puis StrToInt sur les deux chaines, et un jeu d'addition multiplication ...
Voici l'algo de sevyc64 avec une formulation qui est très proche de la forme qu'aura le code final :
Faut-il juste faire des efforts et APPRENDRE !I = Chercher position de ':' dans S // Indice Pos, S contient min:sec
Min = Découper S depuis le début jusqu'avant le ':' // Indice Copy
Sec = Découper S depuis après le : jusqu'à la fin de S // Indice Copy et MaxInt
MSec := (Min Multiplier par Nombre de Seconde par Minute + Sec) x Multiplier par Nombre de MilliSeconde par Seconde // Indice StrToInt , SecsPerMin et MSecsPerSec
le principe du forum c'est d'aider un développeur en difficulté
Le minimum à fournir, c'est ton propre essai de code, même si il ne fonctionne pas !
A partir de TA tentative de code, on corrige et on t'explique
Te donner un code tout prêt pour un truc aussi c'est simple, ce n'est pas t'aider, c'est faire les choses à ta place ! Cela tient même en une ligne : procedure TForm1.ed1DblClick(Sender: TObject); var I, Sec, Min: Integer; begin I := Pos(':', ed1.Text); Min := StrToIntDef(Copy(ed1.Text, 1, I - 1), 0); Sec := StrToIntDef(Copy(ed1.Text, I + 1, MaxInt), 0); ShowMessage(IntToStr((Min * SecsPerMin + Sec) * MSecsPerSec)); end;
Bravo ShaiLeTroll,
d'avoir pris 10 mn (voir plus) à lui expliquer le principe du forum.
alors qu'on pourrais lui faire sa fonction en 2 lignes de code, et il n'aurait rien appris.
---
Vas-y gars lance toi, et le forum t'aidera.
solilog
Faut-il juste faire des efforts et APPRENDRE !
ben justement un exemple de code pour bien conprende
Bonjour,
et le lien que j'ai indiqué ce n'est pas un exemple de code ?Envoyé par Copain68
et la touche pour rechercher les fonctions proposées ?
vous n'indiquez toujours pas votre version de Delphi et c'est dommage !
encore une autre piste : l'utilisation de DecodeTime qui decompose un temps en Heure,Minutes,Secondes et Millisecondes
vous pouvez :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 // Exemple trouvé dans l'aide de D3 //Cet exemple utilise un bouton et deux étiquettes sur une fiche. //Lorsque l'utilisateur clique sur le bouton, la date et l'heure en cours sont rapportées dans les libellés (propriété Caption) des deux étiquettes. procedure TForm1.Button1Click(Sender: TObject); var Present: TDateTime; Year, Month, Day, Hour, Min, Sec, MSec: Word; begin Present:= Now; .... DecodeTime(Present, Hour, Min, Sec, MSec); Label2.Caption := 'Heure : minute ' + IntToStr(Min) + " de l'heure " + IntToStr(Hour); end;
modifier le type de Present en TTime
l'affectation de Present à une conversion du text via la fonction StrToTime(...) à vous de régler le fait qu'il faille une chaine sous la forme hh:mm:ss
la décomposition étant faite par DecodeTime, il ne vous reste qu'à faire le calcul
Bonsoir tous d'abord je tien a m'excusé.
J'ai finalement un peu compris vos résonnement et j'ai fini par faire ceci :
maintenant je cherche comment faire pour que ce soit une fonction qui me donne directement le résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Procedure convert_min_sectoms(Edit : TEdit;temp:TLabel); var S : string; MinS : string; // Minute en caractère SecS : string; MinI : Integer; // Minute en entier SecI : Integer; MilSec : Integer; // Minute en millisecondes en entier begin //On transfert le string de Edit.Text dans une variable S de type string S := Edit.Text; //On sort de la variable S les minutes que l'on met dans une variable MinS de type string MinS := Copy(S, 0, Pos(':',S)-1); //On sort... SecS := Copy(S, Pos(':',S)+1, Length(S)); //On converti la variable MinS vers une variable MinL de type Integer (Entier) MinI := StrToIntDef(MinS,0); SecI := StrToIntDef(SecS,0); //Pour le calcul (Minutes * 60 + secondes) * 1000 a toi de faire la suite et les corrections MilSec := (MinI * 60 + SecI) * 1000; //Transfert des Minutes en Millisecondes dans l'interval du timer //Transfert de l'entier des minutes transformé en milliseconde dans l'Edit2.Text en string pour te donner un exemple ... temp.Caption := IntToStr(MilSec); end;
que tu utiliseras comme ceci par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part function convert_min_sectoms(aTime: string): integer;
Ceci rendra ta fonction plus "universelle".
Code : Sélectionner tout - Visualiser dans une fenêtre à part Label1.Caption := IntToStr( convert_min_sectoms( Edit1.Text ) );
Voila j'ai ma fonction finalisé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Function convertsectoms(t : string):integer; var S : string; MinS : string; // Minute en caractère SecS : string; MinI : Integer; // Minute en entier SecI : Integer; MilSec : Integer; // Minute en millisecondes en entier begin //On transfert le string de Edit1.Text dans une variable S de type string S := t; //On sort de la variable S les minutes que l'on met dans une variable MinS de type string MinS := Copy(S, 0, Pos(':',S)-1); //On sort... SecS := Copy(S, Pos(':',S)+1, Length(S)); //On converti la variable MinS vers une variable MinL de type Integer (Entier) MinI := StrToIntDef(MinS,0); SecI := StrToIntDef(SecS,0); MilSec := (MinI * 60 + SecI) * 1000; result:=MilSec; end;
Bonjour !
Une petite remarque sur la ligne suivante :
L'écriture exacte est Copy(S, 1, Pos(':',S)-1);.
Code : Sélectionner tout - Visualiser dans une fenêtre à part MinS := Copy(S, 0, Pos(':',S)-1);
Cela fait toujours plaisir de voir un débutant revenir victorieux, fier d'avoir fait son code !
Pour une petite question d'optimisation,
- passer la chaine en paramètre avec le modificateur en const cela évite une allocation,
- stocker le résultat de Pos dans une variable pour balayer le chaine une seule fois
- passer MaxInt comme Count dans Copy ( _UStrCopy ). Copy fait la vérification de longueur, d'ailleurs, on peut même omettre le paramètre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function ConvertMinSecToMsec(const S: string): Integer; var I, Sec, Min: Integer; begin I := Pos(':', S); Min := StrToIntDef(Copy(S, 1, I - 1), 0); Sec := StrToIntDef(Copy(S, I + 1), 0); // omission de count = jusqu'à la fin, le compilateur ajoute lui même MaxInt Result := (Min * SecsPerMin + Sec) * MSecsPerSec; end;
L'allocation d'un pointeur uniquement. Cela évite surtout la gestion du compteur de référence
Regardons tout de même ce que Delphi propose dans DateUtils.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 uses DateUtils; Function convertsectoms(t : string):integer; begin Result := MilliSecondsBetween(0, StrToDateTime(t)); end;
merci pour toutes vos réponse,
mais lorsque j'utilise mon code pour indiqué quand aura lieu
le prochain transfert automatiqu, le Label1 n'ajoute pas ma valeur du Edit il m'affiche toujours le temps actuelle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 var dRegftp : integer; begin dRegftp := convertsectoms(Edit1.Text);//Le temps en min:sec converti en ms Label1.caption :='Prochaine transfert à : '+TimeToStr(now + dRegFtp); end;
Now (un TDateTime) n'est pas un nombre de millisecondes mais un réel représentant la date dans la partie entière et les heures dans la partie fractionnelle.
Toujours dans DateUtils : IncMilliSecond
Code : Sélectionner tout - Visualiser dans une fenêtre à part Label1.caption :='Prochaine transfert à : '+TimeToStr(IncMilliSecond(Time, dRegFtp));
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager