Afficher heures, minutes, secondes sur l'axe des abscisses

kamga2 Messages postés 5 Date d'inscription vendredi 22 août 2008 Statut Membre Dernière intervention 27 août 2008 - 22 août 2008 à 15:03
kamga2 Messages postés 5 Date d'inscription vendredi 22 août 2008 Statut Membre Dernière intervention 27 août 2008 - 27 août 2008 à 12:35
Bonjour,

pour un programme que je suis en train d'écrire, il me faudrait afficher sur un graphique l'évolution d'une température en fonction du temps. Jusque là, pas trop de problèmes, mais je n'arrive pas à afficher correctement l'heure sur l'axe des abscisses.

En fait, l'heure est stockée dans un StringGrid (tout comme la température), et je transforme cette donnée grâce à la fonction "StrToTime". Pour l'instant, ce qui est affiché sur l'axe des abscisses du graphique est une fraction décimale de la journée (c'est-à-dire qu'à midi, il m'affiche 0,5 en abscisse ; à 18h, il m'affiche 0,75).

J'ai essayé de passer par FormatDateTime, sans succès. J'ai également essayé de transformer la valeur décimale affichée en heures, minutes, secondes, mais je n'ai pas pu réaliser l'affichage correctement à cause de types de variables différentes (notamment à cause du DateTimeFormat...).

Ça fait trois jours que je passe sur ce problème ...

Si quelqu'un a une suggestion, merci d'avance !

16 réponses

kamga2 Messages postés 5 Date d'inscription vendredi 22 août 2008 Statut Membre Dernière intervention 27 août 2008 2
22 août 2008 à 15:55
Bonjour,

et merci de ta réponse rapide.

Voila ce que j'ai essayé :

// Pour la définition de l'heure
S:=FormatDateTime('hh:nn:ss', Now) 

// Pour un affichage sur l'axe des abscisses du graphe
Series1.AddXY(StrToTime(S),StrToFloat(StringGrid1.Cells[...]))

J'ai vu grâce à des messages d'erreur que l'heure est bien formatée, mais l'affichage sur le graphe reste toujours décimal...>_<

Merci !
2
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 août 2008 à 15:38
Bonjour,
sous quel format voudrais-tu que ton heure soit affichée ?
Par exemple : S (ta string).

S := FormatDateTime('hh:nn:ss', MonHeure);

S deviendra alors (pour l'heure actuelle : 15 heures 36 minutes 44 secondes) S deviendra : 15:36:44

Evidemment tu peux découper les différentes parties :

S := FormatDateTime('hh', MonHeure); pour n'avoir que l'heure, pareil pour les minutes et secondes.
Je ne vois pas ou se situe ton problème :/

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 août 2008 à 16:04
Je n'ai jamais touché à un TeeChart (trop compliqué pour moi ^^) donc je ne peux plus t'aider maintenant ...

Cordialement, Bacterius !
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
22 août 2008 à 16:42
les TeeChart j'en utilise pas (comme Bacterius)  mais pas pour les mêmes raisons

cependant une chose me choque dans le code que tu nous donnes ...

// Pour la définition de l'heure
S:= FormatDateTime('hh:nn:ss', Now) 

// Pour un affichage sur l'axe des abscisses du graphe
Series1.AddXY( StrToTime(S) ,StrToFloat(StringGrid1.Cells[...]))

tu convertis l'heure en chaine et à la ligne suivante tu fais l'inverse ... la chaine en heure

ceci me parait pour le moins bizarre !!!!
 
@+
Cirec

<hr siz ="" />
0

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

Posez votre question
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
22 août 2008 à 16:48
Chaque série dispose d'une propriété booléenne DateTime. Celle-ci lorsqu'elle est mise à la valeur TRUE (Series1.XValues.DateTime := TRUE et/ou Series1.YValues.DateTime := TRUE en fonction de tes besoins), permet d'afficher les dates au format DateTime.
Par défaut, elles sont affichées au format numérique.

N.B. Pour ajouter une valeur X au format TDateTime, tu peux utiliser par exemple :
  Series1.AddXY(EncodeTime(0,0,10,0),12345678,'',clTeeColor);
  Series1.AddXY(Now,12345678,'',clTeeColor);

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
kamga2 Messages postés 5 Date d'inscription vendredi 22 août 2008 Statut Membre Dernière intervention 27 août 2008 2
22 août 2008 à 17:11
Bonjour,

J'ai fait les changements que tu m'as indiqués, en ajoutant cette ligne au code :

Series1.XValues.DateTime := TRUE

Maintenant, j'ai les caractères "hh:nn:ss" qui s'affichent sur l'axe des abscisses. Apparemment, le formatage est bien enregistré, mais pas les valeurs... Et ce, alors même que l'heure que je demande est l'actuelle :

Series1.AddXY(Now,StrToFloat(StringGrid1.Cells[...]))

Tu as une idée de l'origine de cet imprévu ?

En tout cas merci de vos réponses, elles donnent toutes à réfléchir !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 août 2008 à 17:31
A mon avis l'erreur ne vient pas de la fonction de formatage, mais d'ailleurs.
Pourquoi pas une série de type "String" et non pas DateTime, et formater l'heure en String ? (Enfin je dis ça je dis rien ^^)

Cordialement, Bacterius ?
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
22 août 2008 à 17:47
N'ayant pas ton source, ni les paramètres de ton TChart, voici une méthode brute à ajouter sur l'évenement OnGetAxisLabel :

procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
Series: TChartSeries; ValueIndex: Integer; var LabelText: String);
var
  TmpTime  : TTime ;
  h,m,s,ms : Word;
begin
  If Sender=Chart1.BottomAxis then
  begin
    // On retransforme la chaine en TTime
    tmpTime:=StrToFloat(LabelText);
    // On extrait chacun des éléments
    DecodeTime(tmpTime,h,m,s,ms);
    // On reformate le label selon nos désirs
    LabelText:=IntToStr(h)+':'+IntToStr(m)+':'+IntToStr(s)+':'+IntToStr(ms);
  end;
end;

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
kamga2 Messages postés 5 Date d'inscription vendredi 22 août 2008 Statut Membre Dernière intervention 27 août 2008 2
22 août 2008 à 17:56
Bon, je vais essayer ca lundi matin...

Merci beaucoup, et bon week-end à tous !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 août 2008 à 17:58
@WhiteHippo : "LabelText:=IntToStr(h)+':'+IntToStr(m)+':'+IntToStr(s)+':'+IntToStr(ms);"

Pas terrible ... mieux vaut utiliser Format !

LabelText := Format('%d:%d:%d:%d', [h, m, s, ms]);

Avec ta méthode tu fais appel 4 fois à IntToStr
Avec la mienne on fait appel 1 fois à Format
Je reviens dans quelques minutes avant les tests de chronométrage lol.

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 août 2008 à 18:15
Héhé WhiteHippo je vais t'incendier :

Bon pour le materiel tant qu'a faire je t'envoie le rapport de mon logiciel de récuperation d'informations système (pas en entier, juste les parties processeurs, util. cpu, etc ...)

[Rapport]
Date_Heure=22/08/2008 18:09:23



[Processeur]
Marque=Intel(R) Celeron(R) M processor 1.50GHz
Vendeur=Intel
Type=Pentium
Num._modèle=13
Num._famille=6
Num._coeurs=1
Num._Aux._Processeurs=0
Num._sérial=[Serial non trouvé]
Cap._HTT=Non
Cap._3DNow=Non
Cap._3DNow2=Non
Cap._SSE=Oui
Cap._SSE2=Oui
Cap._SSE3=Non
Cap._SSE4=Non
Cap._SSSE3=Non
Cap._64 bits=Non
Cap._MMX=Oui


[Mémoire]
Mémoire_physique_totale=514480 Ko, soit 502 Mo.
Mémoire_physique_disponible=65024 Ko, soit 63 Mo.
Mémoire_paginée_totale=1257208 Ko, soit 1227 Mo.
Mémoire_paginée_disponible=849076 Ko, soit 829 Mo.
Mémoire_virtuelle_totale=2047 Mo.
Mémoire_virtuelle_disponible=2017 Mo.


[Processus]
Processus n. 1=[System Process], 0, 1, 0
Processus n. 2=System, 4, 54, 8
Processus n. 3=smss.exe, 460, 3, 11
Processus n. 4=csrss.exe, 516, 12, 13
Processus n. 5=winlogon.exe, 540, 18, 13
Processus n. 6=services.exe, 592, 15, 9
Processus n. 7=lsass.exe, 604, 20, 9
Processus n. 8=svchost.exe, 788, 21, 8
Processus n. 9=svchost.exe, 832, 11, 8
Processus n. 10=svchost.exe, 872, 72, 8
Processus n. 11=svchost.exe, 956, 5, 8
Processus n. 12=svchost.exe, 1032, 14, 8
Processus n. 13=WLTRYSVC.EXE, 1264, 2, 8
Processus n. 14=BCMWLTRY.EXE, 1292, 4, 8
Processus n. 15=spoolsv.exe, 1356, 10, 8
Processus n. 16=explorer.exe, 1456, 16, 8
Processus n. 17=acs.exe, 1464, 15, 8
Processus n. 18=avgwdsvc.exe, 1640, 47, 8
Processus n. 19=admServ.exe, 1584, 9, 8
Processus n. 20=WLTRAY.EXE, 1140, 4, 8
Processus n. 21=ACU.exe, 1152, 3, 8
Processus n. 22=soundman.exe, 1184, 2, 8
Processus n. 23=avgtray.exe, 1200, 6, 8
Processus n. 24=admtray.exe, 1768, 3, 8
Processus n. 25=epm-dm.exe, 1760, 3, 8
Processus n. 26=hkcmd.exe, 820, 2, 8
Processus n. 27=igfxpers.exe, 1752, 3, 8
Processus n. 28=eDSloader.exe, 164, 1, 8
Processus n. 29=ctfmon.exe, 204, 1, 8
Processus n. 30=avgemc.exe, 2376, 10, 8
Processus n. 31=alg.exe, 1500, 5, 8
Processus n. 32=avgrsx.exe, 988, 12, 8
Processus n. 33=IEXPLORE.EXE, 2820, 15, 8
Processus n. 34=svchost.exe, 2900, 5, 8
Processus n. 35=igfxsrvc.exe, 1832, 3, 8
Processus n. 36=mshta.exe, 1968, 4, 8
Processus n. 37=Install.exe, 3256, 1, 8
Processus n. 38=dllhost.exe, 1192, 18, 8
Processus n. 39=msdtc.exe, 1916, 14, 8
Processus n. 40=IEXPLORE.EXE, 2512, 19, 8
Processus n. 41=delphi32.exe, 948, 6, 8
Processus n. 42=setup.exe, 1900, 1, 8
Processus n. 43=Project1.exe, 1176, 1, 8
Processus n. 44=Install.exe, 2680, 6, 8
Processus n. 45=msiexec.exe, 2172, 6, 8
Processus n. 46=msiexec.exe, 1628, 5, 8
Processus n. 47=SystemInfo.exe, 1888, 1, 8
Nb._Processus=47 processus.
Nb._Threads=509 threads.
Util._Processeur=Utilisation du processeur : 70,17 %



[Système]
Système_exploitation=Windows XP Home Edition
Version_OS=5.1
Service_Pack=2.0
Numéro_de_Build=2600
Nom_Ordinateur=LBS-T
Nom_Utilisateur=Thomas
Resolution_écran=1280 pixels / 800 pixels.
Nb._Couleurs_Ecran=32 bits (2^32 couleurs)




[Resultats du test Format Versus IntToStr]
* Je tiens à noter que IntToStr est appelé 4 fois

Format, test 1 : 0,017600 ms
IntToStr*4 test 1 : 0,018438 ms

Round 1 : Format Wins !

Format, test 2 : 0,016203 ms
IntToStr*4 test 2 : 0,017600 ms

Round 2 : Format Wins !

Format, test 3 : 0,015644 ms
IntToStr*4 test 3 : 0,065651 ms

Round 3 : Format Wins !

Résultat du match :

======================
FORMAT == IntToStr ==
== 3 ======== 0 =======

Je déclare Format vainqueur !

xD
J'adore les tests de performance

Cordialement, Bacterius !
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
22 août 2008 à 19:13
Et alors ??? 

Comme précisé lors de mon précédent message, la solution proposée était basique et "brute de decoffrage"; et son but était simplement d'essayer de trouver une solution pour kagma2...

Donc, pour continuer ton troll :
   Optimisation d'une solution bancale = ( Optimisation obsolète + Temps perdu )
Car au final, le code sera, de toute façon, à réécrire.

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 août 2008 à 19:23
Autant donner une solution optimisée plutôt que une solution "basique" comme tu dis !

Si tu avais directement donné une solution optimisée il n'y aurait aucune optimisation obsolète (car elle aurait servi à kagma2 pour le code à réécrire) + aucun temps perdu.

Et chuis pas un troll !

Et ... ne boudes pas :]

Cordialement, Bacterius !
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
22 août 2008 à 19:53
>> Autant donner une solution optimisée plutôt que une solution "basique" comme tu dis !
Ok, ça fait un bout de temps que je n'ai pas posté, mais si on est passé de "j'aiguille vers la solution" à "je donne un exemple de code" à "je code entièrement une solution" pour arriver à présent à " je code entièrement LA solution optimisée" alors ce forum n'est définitivement plus pour moi.
 
>> Aucun temps perdu
Si le mien !!

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 août 2008 à 12:51
ben moi j'dirai que vous avez raison tous les deux

mais le plus important c'est de mettre le demandeur sur la bonne voie et si on a le temps et/ou l'envie on peut aussi fournir un code plus optimisé ... Mais en aucun cas ce n'est une obligation.

Et pour finir je dois dire que je suis quand même plus de l'avis de WhiteHippo .. pourquoi ?
ben pour moi, le fait de donner un code optimisé de suite empêchera le demandeur de se faire ses propres expériences et découvertes ce qui n'est pas forcément une bonne chose.

@Bacterius: on a fait la même chose avec toi !!! on t'a mis sur la voie et petit à petit tu t'es fait tes propres expériences et tu as progressé ...
et crois moi quand je te dis que tu as progressé bien plus vite que si l'on avait "fait" le travaille à ta place

 
@+
Cirec

<hr siz="" />
0
kamga2 Messages postés 5 Date d'inscription vendredi 22 août 2008 Statut Membre Dernière intervention 27 août 2008 2
27 août 2008 à 12:35
Je viens d'essayer les solutions que vous me proposiez, et... problème résolu !

Ça marche parfaitement maintenant.

Merci infiniment à tous pour votre aide ! Continuez comme ca !
0
Rejoignez-nous