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 :

Enregistrement / relecture de record : compatibilité delphi4 - 7


Sujet :

Delphi

  1. #1
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut Enregistrement / relecture de record : compatibilité delphi4 - 7
    Bonjour,

    J'ai un logiciel qui mémorise ses paramètres dans un 'record' composé de variables de plusieurs types, en tout 167champs. On à du String[de 3 à 250] du Real48, Byte, Integer, Boolean, Double, Real et même des array[1..6] of real

    Ce logiciel est developpé en Delphi4 et le Record est enregistré et lu avec des Read / write.

    Je voudrais le lire avec la même technique avec un programme developpé en delphi7 qui à pour but de venir optionnellement se greffer sur l'ancien logiciel. Manque de bol lorsque je lis le record (avec le même code que sous delphi4) les éléments sont chamboulés, je suppose que la taille de certaines variables à changé ?

    Y à t'il moyen de forcer la compatibilité ?

    Merci,

    Harry

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Les integers changent de format....(au moins ça)

    Quant à renforcer la compatibilité...tu sous-entends sans changer le code, je suppose ?

    Peut-être avec des IFDEF basés sur la version du compilo ? permettant d'utiliser alternativement une description dédiée de ton record.

    Charge à toi de redécrire ce record avec les types qui vont bien (integer->byte)

  3. #3
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut
    Citation Envoyé par qi130
    Les integers changent de format....(au moins ça)

    Quant à renforcer la compatibilité...tu sous-entends sans changer le code, je suppose ?

    Peut-être avec des IFDEF basés sur la version du compilo ? permettant d'utiliser alternativement une description dédiée de ton record.

    Charge à toi de redécrire ce record avec les types qui vont bien (integer->byte)
    Oui, c'est bien quelquechose comme une condition de compilation qu'il me faut. Je ne crois pas que ce soit IFDEF ? (Compile le texte source Delphi qui suit si nom est défini.)

    Reécrire ce record ce n'est pas possible sinon le logiciel originel va voir ses 167 paramètres chamboulés justement ! Il faudrais plustôt que j'adapte le nouveau logiciel pour fonctionner avec l'ancien que l'inverse.

  4. #4
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 567
    Par défaut
    Salut

    Une idée me vient : vérifie l'alignement des champs d'enregistrement et aussi l'utilisation éventuelle des directives de compilation {$A-}, {$A1}, {$A2}, {$A4} et {$A8} ou {$A+}, fais une recherche dans le code du projet sous D4.

    Ces directives permettent de jouer sur la taille des records sans passer par la directive packed (compulse l'aide en ligne pour le détail).

    Ces options pourraient expliquer le chamboulement observé si tes deux Delphi ne sont pas configurés de la même façon.

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  5. #5
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Je viens de "chopper" ça dans la jvcl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {$IFDEF DELPHI6}
     {$I jvcld6.inc}
     {$DEFINE JVCL_CONFIGURED}
    {$ENDIF DELPIH6}
    {-----------------------------------------------------------------------------}
    {$IFDEF DELPHI7}
     {$I jvcld7.inc}
    Il "suffit" d'avoir une description pour chaque version de compilo...

  6. #6
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut
    Citation Envoyé par e-ric
    Salut

    Une idée me vient : vérifie l'alignement des champs d'enregistrement et aussi l'utilisation éventuelle des directives de compilation {$A-}, {$A1}, {$A2}, {$A4} et {$A8} ou {$A+}, fais une recherche dans le code du projet sous D4.

    Ces directives permettent de jouer sur la taille des records sans passer par la directive packed (compulse l'aide en ligne pour le détail).

    Ces options pourraient expliquer le chamboulement observé si tes deux Delphi ne sont pas configurés de la même façon.

    cdlt

    e-ric
    Merci E-ric, je n'ai pas trouvé de directives de compilation particulières dans le logiciel Delphi4.

    Il doit sagir de différences entre delphi4 et 7.
    Je continue mes recherches.

  7. #7
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut
    Citation Envoyé par qi130
    Je viens de "chopper" ça dans la jvcl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {$IFDEF DELPHI6}
     {$I jvcld6.inc}
     {$DEFINE JVCL_CONFIGURED}
    {$ENDIF DELPIH6}
    {-----------------------------------------------------------------------------}
    {$IFDEF DELPHI7}
     {$I jvcld7.inc}
    Il "suffit" d'avoir une description pour chaque version de compilo...

    le IFDEF permet de dire si tu compile ou non un morceau de code.

    dans ton exemple ca permet de dire que si tu est dans delphi6 tu utilise jvcld6.inc et si tu est dans Delphi7 jvcld7.inc.

  8. #8
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    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 : Février 2005
    Messages : 682
    Par défaut
    Bonjour,

    Attention la JVCL défini ses propres variables de compilation à l'installation

    Tu devrais plutôt utiliser ceux du compilateur
    Ainsi de mémoire

    {$ifdef VER130} //Delphi 5
    {$IFDEF VER140} c'est pour delphi 6
    etc...


    a+

  9. #9
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 567
    Par défaut
    Citation Envoyé par Harry
    Merci E-ric, je n'ai pas trouvé de directives de compilation particulières dans le logiciel Delphi4.

    Il doit sagir de différences entre delphi4 et 7.
    Je continue mes recherches.
    As-tu vérifié les options du projet sous D4 ?
    Je suis très étonné d'apprendre que les types de données aient pu changer entre deux versions de Delphi Win 32. La plupart des types dépendent directement du matériel, donc les révolutions sont assez rares en ce domaine.

    Peux-tu déterminer la taille (en nombre d'octets) de ton enregistrement sous D4 et celle sous D7 ?

    Tu as bien repris rigoureusement le record du projet sous D4 ?

    Montre la description du record.

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  10. #10
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut
    Citation Envoyé par e-ric
    As-tu vérifié les options du projet sous D4 ?
    Je suis très étonné d'apprendre que les types de données aient pu changer entre deux versions de Delphi Win 32. La plupart des types dépendent directement du matériel, donc les révolutions sont assez rares en ce domaine.

    Peux-tu déterminer la taille (en nombre d'octets) de ton enregistrement sous D4 et celle sous D7 ?

    Tu as bien repris rigoureusement le record du projet sous D4 ?

    Montre la description du record.

    cdlt

    e-ric
    Pour la taille sous D7 oui, il faudrait que je fasse un enregistrement sur le disque. Mais je crois que ce ne sera pas nécessaire : j'ai affiché dans des showmessage chaque élément jusqu'a trouver celui qui fera foirer et le coupable c'est... le Real48 le premier Real48 auquel 19.6 est affecté (taux de TVA) s'affiche 19.6000000000058
    et le taux de conversion franc/euro de 6.55957 se transforme en 4.5479342439577E-13

    Reste à savoir pourquoi car Delphi4 incluais deja la gestion des real48 en Double... c'est marqué dans l'aide.

  11. #11
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 567
    Par défaut
    je ne suis pas sûr mais les équivalences de types réels ont varié avec les version de Delphi. Il me semble qu'avant Real était équivalent à Real48 mais plus sous D7 (Real est dorénavant un double, grosse différence). Real48 est juste là pour la compatibilité avec Turbo Pascal.

    Si tu dispose de l'aide de Delphi pour les deux versions, il y a un chapitre consacré à la gestion de la mémoire dédié aux nombres réels (leur représentation en mémoire est abordé).

    A partir de l'examen de ces types, tu peux en déduire la bonne structure de ton record sous D7.

    Autre élément d'appréciation (issu de l'aide)
    Citation Envoyé par Aide Delphi 6
    Type Bascule
    Syntaxe {$REALCOMPATIBILITY ON} ou {$REALCOMPATIBILITY OFF}
    Défaut {$REALCOMPATIBILITY OFF}
    Portée Locale
    Remarque

    Dans l'état par défaut {$REALCOMPATIBILITY OFF}, le type réel générique est équivalent à Double.
    Dans l'état {$REALCOMPATIBILITY ON}, Real est équivalent à Real48.
    La bascule REALCOMPATIBILITY offre une compatibilité pour du code existant dans lequel Real est utilisé pour représenter le type réel sur 6*octets, appelé aujourd'hui Real48. Dans du nouveau code, utilisez Real48 lorsque vous voulez spécifier un réel sur 6*octets.
    Double est le type réel préféré dans la plupart des cas.
    En utilisant cette directive localement, tu peux peut-être résoudre ton problème.

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  12. #12
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Par défaut
    Citation Envoyé par e-ric
    je ne suis pas sûr mais les équivalences de types réels ont varié avec les version de Delphi. Il me semble qu'avant Real était équivalent à Real48 mais plus sous D7 (Real est dorénavant un double, grosse différence). Real48 est juste là pour la compatibilité avec Turbo Pascal.

    Si tu dispose de l'aide de Delphi pour les deux versions, il y a un chapitre consacré à la gestion de la mémoire dédié aux nombres réels (leur représentation en mémoire est abordé).

    A partir de l'examen de ces types, tu peux en déduire la bonne structure de ton record sous D7.

    Autre élément d'appréciation (issu de l'aide)

    En utilisant cette directive localement, tu peux peut-être résoudre ton problème.

    cdlt

    e-ric
    Oui, c'est depuis Delphi4 que le Real48 à été introduit pour compatibilité avec le Real de delphi3 et plus ancien et le nouveau Real correspond à un double.

    Le Real48 n'aurais donc pas du changer entre delphi 4 et 7, pourtant c'est le cas.
    La directive {$REALCOMPATIBILITY ON} permet de faire passer les Real en Real48 mais ne change pas la gestion des Real48.

    Dailleurs on vois bien que Sous Delphi7 le Real48 n'est pas confondu avec le 'Real' (double) car sur le premier chiffre on obtiens presque le même résultat. Vu que la gestion mémoire des Real48 et des Double est radicalement différente il n'y à aucune chance d'obtenir quelquechose de ressemblant.

    Au cas ou j'ai testé en remplacant les Real48 par des Double/real pour voir et c'était effectivement une toute autre affaire.

Discussions similaires

  1. Apple enregistre une chute record du nombre d'iPad écoulés
    Par Cedric Chevalier dans le forum Actualités
    Réponses: 20
    Dernier message: 02/08/2013, 11h12
  2. Réponses: 3
    Dernier message: 07/10/2009, 19h29
  3. Réponses: 3
    Dernier message: 18/11/2006, 20h21
  4. Type enregistrement ou "record"
    Par SurfingJeff dans le forum Delphi
    Réponses: 8
    Dernier message: 08/11/2006, 16h02
  5. compatibilité des réels avec pascal (pour fichier de record)
    Par jacquesberger dans le forum Langage
    Réponses: 2
    Dernier message: 12/08/2005, 19h58

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