IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Calcul en fonction de l'heure courante


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut Calcul en fonction de l'heure courante
    salut a tous,

    Dans un projet, j'ai des TEdits dans lequel des resultats de calcul sont obtenuset pour la saisie de données
    Dans la meme From, j'ai un TTimer, deux TDateTimePicker (un pour afficher la date courante et l'autre pour afficher l'heure courante.

    Dans un TEdit je saisi une date sous la forme JJ/MM/AAAA je voudrais savoir si c'est possible calculer la difference de jours entre les 2 dates puis le resultats le transformer en heure.

    Je me suis rapprocher du tuto qui avais etais mis dans un post Difference entre 2 date mais j'ai une erreur de type
    Argument incorrect pour l'encodage de date.

    je essayer d'utiliser DateToStr mais toujours le meme refrain

    Quelles sont ses arguments incorrect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      Date1, Date2 : TDateTime; 
      Diff : Extended; 
      Jour1, Mois1, Annee1 : Word; 
      Jour2, Mois2, Annee2 : Word; 
    begin 
      Date1 := EncodeDate(Annee1, Mois1, Jour1); 
      Date2 := EncodeDate(Annee2, Mois2, Jour2); 
      Diff := DaysBetween(Date2, Date1); 
      Edit1:=DateToStr(Diff); 
    end;
    Je pense qu'apres avoir la valeur de Diff il faudra que je la multiplie par 24 pour l'exprimer en heure mais là aussi j'ai un message d'incompatibilité entre TDate et String .

    J'ai rechercher dans l'aide F1, mais je n'ai pas trouver la solution

    merci pour votre coup de main

  2. #2
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Salut,

    Personnellement pour soustraire 2 dates j'utilise juste:
    Ensuite ton DateToStr(Diff) devrait passer.

    @+.

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par stefano
    s
    Dans un TEdit je saisi une date sous la forme JJ/MM/AAAA je voudrais savoir si c'est possible calculer la difference de jours entre les 2 dates puis le resultats le transformer en heure.
    Pourquoi récupérer le nombre de jours puis le transformer en heure, alors qeu tu peux avoir directement le résultat en heures avec HoursBetween ?


    Citation Envoyé par Aide Delphi
    HoursBetween Routine

    Renvoie le nombre d'heures entières séparant deux valeurs TDateTime spécifiées.

    Unité
    DateUtils

    Syntaxe


    [Delphi] function HoursBetween(const ANow: TDateTime, const AThen: TDateTime): Int64;

    Description
    Appelez HoursBetween pour obtenir la différence, en heures, entre deux valeurs TDateTime. HoursBetween ne compte que les heures entières. Ainsi, HoursBetween renvoie 0 pour la différence entre 9h00 et 9h59mn59s car il manque une seconde pour que la différence soit d'une heure.

    Rubriques associées

    HourSpan
    DaysBetween
    MillisecondsBetween
    MinutesBetween
    MonthsBetween
    SecondsBetween
    WeeksBetween
    YearsBetween
    WithinPastHours

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ce qui m'interpelle dans ton code c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Diff : Extended;
    ...
    Edit1:=DateToStr(Diff);
    TDateTime est un double, donc DateToStr devrait en toute logique accepter un double (codé sur 8 octets) sans trop sourcilier, mais pas un extended (codé sur 10 octets, donc trop "gros").

    Et encore... si si ta différence (donc la valeur de DIff) est comprise entre 0 et -1, tu risque d'avoir un souci :
    Citation Envoyé par la rubrique TDateTime de l'aide delphi
    Il n'existe pas de valeur TDateTime entre –1 et 0
    Au mieux, tu rajoutes une valeur absolue
    mais là encore ton résultat sera faussé puisqu'en fait :
    une valeur de 0 pour ton Diff sigifiera 30/12/1899 12:00 am pour la fonction DateToStr.

    En fait, ce que tu dois comprendre, c'est que TDateTime est un réel, la partie entière représente un nombre de jours et la partie réelle une fraction de jour.

    Du coup, le calcul est facile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Nombre de secondes entre de dates=Diff*24*3600;
    Nombre d'heures entre de dates=Diff*24;//24 heures par Jours
    etc...

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    En plus il y a une autre erreur dans son code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
    Date1, Date2 : TDateTime;
    Diff : Extended;
    Jour1, Mois1, Annee1 : Word;
    Jour2, Mois2, Annee2 : Word;
    begin
    Date1 := EncodeDate(Annee1, Mois1, Jour1);
    Date2 := EncodeDate(Annee2, Mois2, Jour2);
    Diff := DaysBetween(Date2, Date1);
    Edit1.text:=DateToStr(Diff);
    end;

  6. #6
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Malatar
    En plus il y a une autre erreur dans son code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Edit1.text:=DateToStr(Diff);
    end;
    Et en plus nous sommes tous passés à côté comme des nouilles !
    Bravo Malatar !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    merci a tous pour c'est info,

    je vais tester ça voir si je m'en sort avec toutes ses infos

    Pour ce qui est aussi de l'erreur pour Edit1.text c'est un oubli de ma part lors de la redaction du post. Mais bon je vais quand meme verifier dans le code source pouvoir si je n'ai pas fait l'erreur.

    Merci encore une fois a tous et je vous tiens au courant

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    Salut,

    J'ai tenu compte de vos remarques mais ça fonctionne toujours pas et j'ai toujours le meme message d'erreur.

    Qu'est qui ne vas pas ?
    Est-ce pour retranscrire le resultat dans le Tedit que ça coince ?


    merci pour votre aide

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Tu utilises quoi comme dates pour tester ?
    Quel est ton code ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    salut,

    mon code est celui là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      Date1, Date2 : TDateTime;
      Diff : Double;
      Jour1, Mois1, Annee1 : Word;
      Jour2, Mois2, Annee2 : Word;
    begin
      Date1 := EncodeDate(Annee1, Mois1, Jour1);
      Date2 := EncodeDate(Annee2, Mois2, Jour2);
      Diff := DaysBetween(Date2, Date1);
      Edit1.text:=DateToStr(Diff);
    end;
    Pour la date courante j'utilise TDateTimerPicker avec un TTimer
    Pour la date a saisir j'utilise un TEdit
    Le TDateTimerPicker a pour proprieter en kind de dtkDate
    Pour recuperer l'heure systeme le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      DateActuel.Date:=now;
    end;
    Pour la saisie de la date dans le TEdit, je l'ecris de la meme façon que dans le TDateTimePicker c'est a dire JJ/MM/AAAA
    A l'execution du programme j'ai un message d'erreur du type
    [Erreur] Unit1.pas(171): Identificateur non déclaré : 'DaysBetween'
    Je suis sous delphi6 j'ai tester avec la version 2005 Personelle mais j'ai toujours ce meme message.
    Si je change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Diff := DaysBetween(Date2, Date1);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Diff:= Date2 - Date1 ;
    le programme se lance mais lorsque je clic sur le bouton pour effectuer le calcul j'ai le message d'erreur suivant
    Argument incorrect pour l'encodage de date.
    Je ne sais pas du tout où ça coince, est dans les proprietes des different element que je me suis planté ?
    Est que c'est le code qui est pas bon ?
    Je suis vraiment perdu et je ne trouve aucune solution

    Merci pour votre aide

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Pour la saisie de la date dans le TEdit, je l'ecris de la meme façon que dans le TDateTimePicker c'est a dire JJ/MM/AAAA
    A l'execution du programme j'ai un message d'erreur du type

    Citation:
    [Erreur] Unit1.pas(171): Identificateur non déclaré : 'DaysBetween'
    Est-ce que tu as ajouter l'unité DateUtils?

    Autrement Diff n'est pas une date mais une différence : entre le 1er janvier et le 31 janvier tu as 30 jours. Ce que tu essaies de faire c'est date(30) ce qui ne va pas dire grand chose... sinon utilises Hoursbetwwen pour avoir directement le nombre d'heure comme indiqué précédemment.

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Button1Click(Sender: TObject);
    var Date1, Date2 : TDateTime;
    Diff : Double;
    begin
    Date1 := EncodeDate(2007, 01,16 );
    Date2 := EncodeDate(2007, 01, 18);
    Diff :=Date2-Date1;
    Edit1.text:=FloatToStr(Diff)+ 'Jours';
    Edit2.text:=FloatToStr(Diff*24)+ 'Heures';
    end;
    ça marche à tous les coups

    Si tu cherches le nombre de jour entre deux dates, tu fais Diff:=Date2-Date1 (rien à cirer de DaysBetween)
    pour avoir le nombre d'heure que celà représente, tu multiplies par 24 : hop, hop...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    Salut,

    J'ai rajouter dans la zone Uses DateUtils mais ça ne fonctionne toujours pas C'est bien là qu'il faut le mettre ce DateUtils ?
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ComCtrls, ExtCtrls, Buttons, DB, DBTables, Grids,
    DBGrids,DateUtils;
    merci pour ton aide

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    T'occupes pas de date utils, n'utilise pas DaysBetween et fait ce que je t'ai dit

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    Salut, Waskol.

    Ca marche mais je ne peux pas faire varier les dates a partir des zones de saisie situer dans mon appli

    merci pour ton aide c'est sympa

  16. #16
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par stefano
    Salut, Waskol.

    Ca marche mais je ne peux pas faire varier les dates a partir des zones de saisie situer dans mon appli

    merci pour ton aide c'est sympa
    Là, le problême est différent, donc tu as une partie ici et un autre thread à ouvrir concernant ce nouveau problème

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    salut Waskol,

    Pourquoi ouvrir une nouvelle discution, alors que c'etais le but de mon premier post ??

  18. #18
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par stefano
    salut,

    mon code est celui là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      Date1, Date2 : TDateTime;
      Diff : Double;
      Jour1, Mois1, Annee1 : Word;
      Jour2, Mois2, Annee2 : Word;
    begin
      Date1 := EncodeDate(Annee1, Mois1, Jour1);
      Date2 := EncodeDate(Annee2, Mois2, Jour2);
      Diff := DaysBetween(Date2, Date1);
      Edit1.text:=DateToStr(Diff);
    end;
    Salut, le code ci-dessus ne pourras jamais fonctionner correctement...

    En effet, tu déclares des variables de type 'word' (ce qui est correct pour l'appel à la fonction EncodeDate), mais tu utilises celles-ci sans jamais avoir assigner leurs valeurs (ce qui signifie qu'elles sont à 0, valeur par défaut sous Delphi)

    Pour ma part, de mémoire, je tenterais un truc du genre là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      Date1, Date2 : TDate;  // Autant utiliser le type TDate...
      Diff : Double;
    begin
      Date1 := StrToDate(Edit1.Text);
      Date2 := StrToDate(Edit2.Text);
      Diff := Abs(Date2 - Date1);
      Edit3.text:= FloatToStr(Diff);
    A charge de vérifier que les deux contrôles représentent bien des dates, le top étant de passer par une fonction intermédiaire qui va faire cette vérification...

    Edit: code testé et fonctionnel.. Après, j'ai pas testé dans tous les sens non plus, mais la date peut être codée soit JJ/MM/AA ou JJ/MM/AAA

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 420
    Points : 116
    Points
    116
    Par défaut
    Salut,

    Merci pour ton idée ça marche bien mais uniquement avec des TEdits mais pas avec des TDateTimePicker

    J'obtiens 2,20263919833943E-307 quelque soit la date de selectionner dans Date2
    C'est du a quoi ??


    merci pour ton aide

  20. #20
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Je commence à comprendre...
    Si tu n'alimente pas tes variables en disant à Delphi où il doit aller chercher ses données, c'est sur que ça ne fonctionnera pas.
    Ton Delphi n'est pas censé aller chercher ni savoir que les dates qui se trouvent dans tes TDateTimePicker sont celles à utiliser pour faire le calcul.

    Donc, pour que ça marche, c'est aussi simple que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Date1 := DateTimePicker1.DateTime;
    Date2 := DateTimePicker2.DateTime;
    Les propriétés DateTime , Date et Time du TDateTimePicker contiennent les valeurs choisies par l'utilisateur.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Dates] Fonction calcule le nombre de demi-heures
    Par bigltnt dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2007, 15h31
  2. [Formule]Probleme Fonction Rang et heure calculée
    Par fredouf dans le forum Excel
    Réponses: 1
    Dernier message: 18/04/2007, 12h26
  3. [XML-XSLT-PHP] Récupération de l'heure courante dans xml
    Par mamat- dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 05/08/2005, 16h02
  4. Action en fonction de l'heure
    Par combattant dans le forum ASP
    Réponses: 3
    Dernier message: 17/12/2003, 17h22
  5. requete en fonction de l'heure
    Par matberry dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/06/2003, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo