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 :

DecodeDateTime, utilisation ?


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut DecodeDateTime, utilisation ?
    Bonjour à tous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.AvecTdateTime;
    var
        dateInput : TDateTime;
    begin
        dateInput := StrToDate(L_EdNbresSecondes.Text);
        RichEdit1.Lines.Add(DecodeDateTime(dateInput)); //bloque ici !
    end;
    Quand je veux compiler, j'obtiens un message d'erreur :
    [Error] uForm1.pas(141): Not enough actual parameters

    Quand je vais voir dans l'aide, je lis ceci:

    procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);

    Je pensais que je devais juste mettre la valeur TDateTime comme paramètre... mais manifestement j'ai un doigt dans l'oeil car cela ne fonctionne pas tel quel !

    Si vous pouviez m'aider, ce serait sympa !
    A+
    EricStib

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Comme le dit si bien la déclaration de DecodeDateTime:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);
    out signifie, en gros, que la fonction va "remplir" les variables. En l'occurrence, ici, des Word.
    Si tu veux récupérer tout ça, tu dois faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var Year, Month, Day, Hour, Minute, Second: Word;
    begin
      DecodeDateTime(dateInput, Year, Month, Day, Hour, Minute, Second);
      ...
    end;
    Ensuite, à toi de te débrouiller pour afficher les valeurs qu'il a renvoyées
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    C'est presque ça ! ... il y juste le message d'erreur qui a changé :+)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.AvecTdateTime;
    var
      dateInput : TDateTime;
      Year, Month, Day, Hour, Minute, Second, MilliSecond : word;
     
     
    begin
        dateInput := StrToDate(L_EdNbresSecondes.text);
        RichEdit1.Lines.Add(DateToStr(DecodeDateTime(dateInput,year,month,day,hour,minute,second,millisecond));
    end;
    Cette fois, le message d'erreur est le suivant:

    [Error] uForm1.pas(142): There is no overloaded version of 'DateToStr' that can be called with these arguments

    Bon, manifestement, je passe encore à côté de qq chose...
    a+
    EricStib

  4. #4
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    ?? t'as un pb avec dateToStr ou strToDate ??

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    Ben, comme la sortie se fait en word, j'ai essayé aussi un IntToStr (puisque le Richedit1 attend un string)... mais cela donne le même genre de message:

    [Error] uForm1.pas(141): There is no overloaded version of 'IntToStr' that can be called with these arguments

    Je comprend plus rien ! Je laisse tomber pour ce soir et je reverrai cela demain !

    a+
    EricStib

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 607
    Billets dans le blog
    65
    Par défaut
    Utilise pour formater ta date directement en string et selon ce que tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FormatDateTime('dd/mm/yyyy hh:nn:ss',DateInput)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    En fait, ce que je voudrais c'est pouvoir introduire un grand nombre quelconque et savoir combien cela fait en années, mois, jours, heures, minutes et secondes.

    j'ai, enfin, compris comment utiliser la fonction DecodeDateTime:

    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
     
    procedure TForm1.AvecTdateTime;
    var
      dateInput : TDateTime;
      Year, Month, Day, Hour, Minute, Second, MilliSecond : word;
     
     
    begin
        dateInput := StrToDate(L_EdNbresSecondes.text);
        DecodeDateTime(dateInput,year,month,day,hour,minute,second,millisecond);
        with RichEdit1.Lines do
                begin
                    Add('Nombres d''années :' + IntToStr(year));
                    Add('Nombre de mois :' + IntToStr(month));
                    Add('Nombre de jours :' + IntToStr(day));
                    Add('Nombre d''heures :' + IntToStr(hour));
                    Add('Nombre de minutes : ' + IntToStr(minute));
                    Add('Nombre de secondes :' + IntToStr(second));
                    //Add(IntToStr (High (Integer)));
                end;
    end;
    Comme ceci l'erreur de compil ne se produit plus.

    Maintenant, quand je rentre un nombre (par ex: 12345678912) j'obtiens le message d'erreur "is not a valide date".

    J'ai bien essayé avec la méthode des div et mod mais cela ne fonctionne que pour l'intervalle valide des Integers... pour le nombre 12345678912 je devrais employer le type Double mais alors je ne peux plus utiliser div et mod (utilisable seulement pour les integer)... bref, je ne suis pas encore sortis de l'auberge :+)

    EricStib

  8. #8
    Membre expérimenté
    Profil pro
    DEV
    Inscrit en
    Août 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DEV

    Informations forums :
    Inscription : Août 2006
    Messages : 182
    Par défaut
    Et si tu essayé par rapport a une date de 'référence' ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    Il semblerait que l'utilisation des fonctions DecodeDateTime soient soumises à l'utilisation d'un nombre correcte sous format DATE. Or, ici, je rentrais un nombre tout à fait au choix de l'utilisateur.

    J'ai relevé la limite des Integer en utilisant le type Int64... en attendant de
    trouver mieux.

    Ci-dessous, le code modifié (et fonctionnel).

    Je vais continuer mes recherches sur le format TDateTime en employant des format valable.

    Merci à tous pour votre aide,
    a+
    EricStib

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    procedure TForm1.Calcul;
     
    var
        nbreInitial,nbreAnnee,nbreMois,nbreJours,
                 nbreHeures,nbreMinutes,NbreSecondes, reste  : Int64;
     
     
    begin
        {les fonctions mod et div ne sont utilisables que dans la gamme des
        valeurs integer !! }
        try
            RichEdit1.Clear;
     
            {Transforme un nombre entier donné en :
                Année, Mois, Jour, Heure, Minutes et secondes}
            nbreInitial := StrToInt64(L_EdNbresSecondes.Text);
     
            nbreAnnee := nbreInitial div (365*(24*3600));
            reste := nbreInitial mod (365*(24*3600));
     
            nbreMois := reste div (3600*24*30);
            reste := reste mod (3600*24*30);
     
            nbreJours := reste div (3600*24);
            reste := reste mod (3600*24);
     
            nbreHeures := reste div 3600;
            reste := reste mod 3600;
     
            nbreMinutes := reste div 60;
            nbreSecondes := reste mod 60;
     
            with RichEdit1.Lines do
                begin
                    Add('Nombres d''années :' + IntToStr(nbreAnnee));
                    Add('Nombre de mois :' + IntToStr(nbreMois));
                    Add('Nombre de jours :' + IntToStr(nbreJours));
                    Add('Nombre d''heures :' + IntToStr(nbreHeures));
                    Add('Nombre de minutes : ' + IntToStr(nbreMinutes));
                    Add('Nombre de secondes :' + IntToStr(nbreSecondes));
     
                end;
     
     
        except
            MessageDlg('Dépassement de la limite des integer ! ', mtWarning, [mbOK], 0);
        end;
    end;

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Parfois, je me demande si certains ne le font pas exprès ! ne pas savoir faire la différence entre une procédure avec des paramètres en sortie et une fonction ... avant de faire de Delphi, essayer de programmer sur une Ti80 ça fera un entrainement à certaines logiques de programmation ...

    sinon, il existe "TryEncodeDateTime" qui renvoit True ou False, selon si la date est correcte ou pas, et sinon fonctionne comme EncodeDateTime

    il est bien dommage que TryDecodeDateTime n'existe pas d'ailleurs, ...

    juste comme ça F1 sur EncodeDateTime, puis "voir aussi", c'est dingue mais l'on trouve ce que l'on veut !

    Sinon, un TDateTime, faut lire l'aide aussi à ce sujet, c'est un nombre à virgule flottante ...

    La partie entière d'une valeur de type TDateTime représente le nombre de jours depuis le 30/12/1899.
    La partie fractionnaire d'une valeur de type TDateTime est la partie des 24 heures écoulée.
    Tu confonds donc un nombre de secondes avec une date en format delphi ... déjà ...

    les fonctions mod et div ne sont utilisables que dans la gamme des valeurs integer
    c'est vrai que le modulo et la division entière n'est valable que pour les entiers ... ça c'est la base des mathématiques quand même, la différences entre les Entiers Naturelles ou Relatifs et les Réels ...


    maintenant euh, encore F1, ... car ton calcul n'est possible que pour Heure, Minute ... car les années Bisextiles, les mois de différentes longueurs ...

    Ceci, fait en gros un calcul similaire, mais avec plus de chance d'être exacte !
    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
    var
      NbMilliSecond: Int64;
      AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word;
    begin
      NbMilliSecond := 12345678912;
      DecodeDateTime(IncMilliSecond(0, NbMilliSecond), AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond);
      with ListBoxWord.Items do
      begin
          Add('Nombres d''années :' + IntToStr(AYear));
          Add('Nombre de mois :' + IntToStr(AMonth));
          Add('Nombre de jours :' + IntToStr(ADay));
          Add('Nombre d''heures :' + IntToStr(AHour));
          Add('Nombre de minutes : ' + IntToStr(AMinute));
          Add('Nombre de secondes :' + IntToStr(ASecond));
          Add('Nombre de millisecondes :' + IntToStr(AMilliSecond));
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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