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

Lazarus Pascal Discussion :

Problème de formatage de date [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut Problème de formatage de date
    Bonjour,
    J'ai un message d'erreur sur les lignes de code mises en encart : "" is an invalide date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DateTimeToString(jcgdate,'yyyymmdd',((StrToDate(jcgdate))));
    ...........
    J'ai essayé avec StrToDateDef, le message disparaît mais j'en ai un suivant quelques lignes plus loin : "Bande" in an invalide float sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (strtofloat(freq)>1.81) and (strtofloat(freq)< 2.0) then band:= '160M';
    En l'occurence Bande est le nom du champ dans la BDD SQLite et band (sans e) est le nom de la variable. Le problème ne vient pas de là puisque exactement le même code fonctionne sous Delphi avec la même BDD.
    Manquerait-il une déclaration dans le uses ?
    Merci pour votre aide.
    Cordialement.
    PS: j'avais une version Lazarus qui fonctionnait mais je l'ai perdue

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 129
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 129
    Par défaut
    Yep !

    Citation Envoyé par f5jcg_Lulu Voir le message
    Bonjour,
    J'ai un message d'erreur sur les lignes de code mises en encart : "" is an invalide date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DateTimeToString(jcgdate,'yyyymmdd',((StrToDate(jcgdate))));
    ...........
    Je ne sais pas ce que tu trafiques (il nous manque les définitions de tes variables) mais, si ça c'est valide DateTimeToString(jcgdate, alors ça, ça ne peut pas l'être : StrToDate(jcgdate).

    Et "pourquoi ?" demanderas-tu ? Parce qu'un coup jcgdate est un TDateTime, et après c'est une String ! Faut être cohérent !

    Citation Envoyé par f5jcg_Lulu Voir le message
    J'ai essayé avec StrToDateDef, le message disparaît mais j'en ai un suivant quelques lignes plus loin : "Bande" in an invalide float sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (strtofloat(freq)>1.81) and (strtofloat(freq)< 2.0) then band:= '160M';
    En l'occurence Bande est le nom du champ dans la BDD SQLite et band (sans e) est le nom de la variable. Le problème ne vient pas de là puisque exactement le même code fonctionne sous Delphi avec la même BDD.
    Si le problème ne vient pas de là, pourquoi nous montres-tu ça ? Fais voir d'où il vient, et fais voir aussi la déclaration de tes variables.

    Citation Envoyé par f5jcg_Lulu Voir le message
    PS: j'avais une version Lazarus qui fonctionnait mais je l'ai perdue
    Ça doit pouvoir se retrouver (même si ce n'est pas une bonne idée).

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    "" is an invalide date
    DateTimeToString n'apprécie manifestement pas d'avoir la même variable en entrée et en sortie.

    Passe par jcgdate := FormatDateTime('yyyymmdd', StrToDate(jcgdate));

    Citation Envoyé par Jipété Voir le message
    Et "pourquoi ?" demanderas-tu ? Parce qu'un coup jcgdate est un TDateTime, et après c'est une String ! Faut être cohérent !
    Pas du tout

    StrToDate attend une chaîne et DateTimeToString retourne une chaîne.
    Ca ne compilerait pas s'il y avait une erreur de type.

  4. #4
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Oui ce serait une bonne idée car je verrais bien à ce moment là où se situe l'erreur.
    Quant à savoir ce que je "trafique", je ne trafique rien, j'essaie juste de me sortir de cette impasse avec votre aide si vous le voulez bien !
    La seule question que je me pose est : pourquoi ce code strictement identique fonctionne très bien sous Delphi. La réponse qu'on m'avait faite (sur un autre sujet) : "ben ya des trucs qui fonctionnent sur Delphi et pas sur Lazarus, c'est comme ça" ne me convient qu'à moitié.
    Il faudrait absolument que je retrouve la version de cette application qui fonctionnait bien.
    En attendant, merci néanmoins pour les suggestions que je vais essayer.
    Cordialement

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 129
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 129
    Par défaut
    Bonjour,
    Citation Envoyé par Andnotor Voir le message
    Pas du tout

    StrToDate attend une chaîne et DateTimeToString retourne une chaîne.
    Ca ne compilerait pas s'il y avait une erreur de type.
    OK, j'ai tout faux : j'ai confondu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure DateTimeToString(
      out Result: string;
      const FormatStr: string;
      const DateTime: Double;
      Options: TFormatDateTimeOptions = []
    );
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function DateTimeToStr(
      DateTime: Double;
      const FormatSettings: TFormatSettings;
      ForceTimeIfZero: Boolean = False
    ):string;

    Mea culpa.

  6. #6
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 635
    Par défaut
    Bonjour f5jcg_Lulu,

    Citation Envoyé par f5jcg_Lulu Voir le message
    Bonjour,
    J'ai un message d'erreur sur les lignes de code mises en encart : "" is an invalide date
    [CODEl]DateTimeToString(jcgdate,'yyyymmdd',((StrToDate(jcgdate))));[/CODE]
    Comme on dit pour LISP : Lost in Stupid Parenthesis. 3 ouvrantes et 4 fermantes : le compte n'est pas bon. Et en plus il y en a qui ne servent à rien sinon faciliter les erreurs 8-)
    Plus concis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTimeToString(jcgdate,'yyyymmdd', StrToDate(jcgdate));
    Salut

  7. #7
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Oui, merci Guesset, mais si vous recomptez bien les parenthèses, le nombre d'ouvrantes et de fermantes est identique. Il y a juste une ouvrante et une fermante de trop. Pas grave. Si tel n'avait pas été le cas, le compilateur aurait bloqué sur cette erreur.
    Je laisse le problème qui m'occupe en tâche de fond pour les mauvais jours. La version Delphi fonctionne (avec je le répète un code strictement identique) et c'est ce qui m'importe pour le moment.
    Merci à tous. A plus tard.
    Cordialement

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Si le code est identique et la base la même, les définitions de champs sont-elles les mêmes (même type) ? Et les composants d'accès aussi ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Tout est identique, c'est un copier-coller de Delphi (c'est peut-être là l'erreur, mais où ?), les composants de saisie, les noms et types des variables, tout est identique, la BDD est la même, appelée par Delphi comme par Lazarus et située dans le même dossier.
    Sauf que Delphi utilise les composants Firedac et Lazarus les composants ZeosLib. Peut-être que...

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 129
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 129
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    Sauf que Delphi utilise les composants Firedac et Lazarus les composants ZeosLib. Peut-être que...
    d'une part.

    Et d'autre part, il existe un outil spécialisé pour passer de Delphi à Lazarus car pas sûr qu'un copier/coller fonctionne bien, à part pour un basique "Hello World" :
    Menu Outils / Conversion Delphi / Convertir un projet Delphi en projet Lazarus...

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 129
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 129
    Par défaut
    Bonjour,

    comme il est question de copier/coller un code Delphi, on peut supposer que le début des fichiers .pas et .lpr est écrit ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unit nom;
     
    {$MODE Delphi}
     
    interface
    ...
    alors que peut-être qu'il faudrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unit nom;
     
    {$MODE objfpc}{$H+}
     
    interface
    ...
    Enfin, j'dis ça j'dis rien, hein.

  12. #12
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Si j'écris {$mode objfpc}{$H+} au lieu de {$MODE delphi}{$H+} j'ai une erreur dans "Procedure ExportToAdif(DBGrid1 : TDBGrid;FileName : String);", j'ai le message "Duplicate identifier DBGrid1.
    Non la raison était ailleurs. Ah mais ! Si je n'ai pas les compétences j'ai au moins la ténacité . J'ai modifié les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HeadTable := HeadTable + ',' + DBGrid1.Columns[I].FieldName;
    ..................
    HeadTable := HeadTable + ',' + DBGrid1.Columns[I].FieldName;
    ..................
    lineTable := lineTable + DBGrid1.Columns[J].FieldName;
    ..................
    lineTable := lineTable + ',' + DBGrid1.Columns[J].FieldName;
    avec ces changements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HeadTable := HeadTable + ',' + DBGrid1.Columns[I].Field.AsString;
    ..................
    HeadTable := HeadTable + ',' + DBGrid1.Columns[I].Field.AsString;
    ..................
    lineTable := lineTable + DBGrid1.Columns[J].Field.AsString;
    ..................
    lineTable := lineTable + ',' + DBGrid1.Columns[J].Field.AsString;
    ce qui génère le fichier au format ADIF comme attendu. Sous Delphi, pour le même résultat, je dois écrire pour les mêmes lignes, si je n'en prend qu'une en exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HeadTable := HeadTable + DBGrid1.Fields[I].AsString;
    ..............
    ou bien
    ..............
    HeadTable := HeadTable + DBGrid1.Columns[I].AsString;
    ............
    les 2 sont acceptés
    Content d'y être arrivé.
    Merci à tous pour votre aide et vos suggestions.
    Cordialement

  13. #13
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Bonjour à tous,
    Je reviens sur mon problème de formatage de date qui en fait n'est pas résolu. J'ai la ligne de code suivante, toujours la même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTimeToString(jcgdate,'yyyymmdd',((StrToDateDef(jcgdate, 0))));
    Le fichier au format ADIF est bien créé sauf qu'il y a le problème bien connu des dates erronées (18991230). Exemple :
    Exportation du carnet de trafic de F5JCG vers un fichier ADIF<EOH>
    <QSO_DATE:8>18991230<TIME_ON:4>1100<FREQ:6>14.055<CALL:7>9A4FM/P<RST_RCVD:3>599<RST_SENT:3>599<MODE:2>CW<COMMENT:18>Zdenko / 9AFF-0014<BAND:3>20M<EOR>
    <QSO_DATE:8>18991230<TIME_ON:4>1104<FREQ:6>14.058<CALL:8>HB9CEV/P<RST_RCVD:3>599<RST_SENT:3>599<MODE:2>CW<COMMENT:18>Arthur / HB/GR-115<BAND:3>20M<EOR>
    J'ai consulté d'autres forums traitant du sujet, mais ce problème agite beaucoup la communauté sans y avoir trouvé une solution. En auriez-vous une ?
    Merci. Cordialement.

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    On a déjà vu que cette construction ne fonctionnait pas, StrToDateDef ne fait que masquer l'erreur et renvoyer 0.

    Pourquoi ne veux-tu pas faire cette conversion en deux étapes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d := StrToDate(jcgdate);
    DateTimeToString(jcgdate, 'yyyymmdd', d);

  15. #15
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Non ça ne fonctionne pas. J'ai le message d'erreur suivant :
    uMainForm.pas(2166,8) Error: Incompatible types: got "TDateTime" expected "AnsiString"
    Ce qui est curieux c'est que le même code (celui de mon post d'origine) fonctionne parfaitement sous Delphi mais pas sous Lazarus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Version Delphi
    DateTimeToString(jcgdate,'yyyymmdd',(StrToDate(jcgdate)));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Version Lazarus
    DateTimeToString(jcgdate,'yyyymmdd',((StrToDateDef(jcgdate, 0))));
    On constate une différence dans le StrToDateDef sous Lazarus. Sans le "Def" j'ai un message bloquant
    "" is not a valid date format
    On m'a déjà dit "il y a des trucs qui fonctionnent sous Delphi et pas sous Lazarus. C'est comme ça". Le "c'est comme ça" est intellectuellement peu satisfaisant, vous en conviendrez.

+ Répondre à la discussion
Cette discussion est résolue.

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