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

Langage Delphi Discussion :

DELPHI XE assign d'un composant ancêtre : EConvertError


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 59
    Points : 81
    Points
    81
    Par défaut DELPHI XE assign d'un composant ancêtre : EConvertError
    Bonjour,
    Voilà mon problème : j'ai un composant TMyImageList herité de TImageList . Voici l'arbre d'héritage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    |-TPersistent
     |-...
      |-TCustomImageList
       |-TDragImageList
        |-TImageList
         |-TMyImageList
    Dans une DLL de manipulation des images j'assigne un TImageList à un TMyImageList :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure X(aMyImageList: TMyImageList); export;
    (...)
    procedure X(aMyImageList: TMyImageList);
    var
      anImageList: TImageList;
    begin
      anImageList := TImageList.create(nil);
      aMyImageList.Assign(anImageList);
      //lève l'exception : "Le projet Y a déclencher la classe d'exception EConvertError avec le message 
      //'Impossible d'affecter TImageList à TMyImageList'"
    end;
    => La procedure X (qui est dans la DLL) est appelée depuis un programme Y. En revanche le code suivant ne lève pas d'exceptions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure X(aMyImageList: TMyImageList);
    var
      vMyImageList: TMyImageList;
      anImageList: TImageList;
    begin
      anImageList := TImageList.create(nil);
      vMyImageList := TMyImageList.create(nil);
      aMyImageList.Assign(vMyImageList);
    end;
    Le problème est visible dans la VCL :
    L'instruction assign appel "TCustomImageList.Assign(Source: TPersistent)" de imgList.pas (vcl) :
    - Dans le 1er cas, "Source is TCustomImageList" retourne false .
    - Dans le 2nd cas, "Source is TCustomImageList" retourne vrai.

    Là je n'y comprend plus rien. Quelqu'un sait-il pourquoi aMyImageList n'est pas évaluer comme un descendant de TCustomImageList lorsqu'il n'est pas instancié dans la DLL??
    (précision: ce code fonctionnait parfaitement avant la migration de Delphi7 vers Delphi XE)
    merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 586
    Points : 25 256
    Points
    25 256
    Par défaut
    Citation Envoyé par Gwenou Voir le message
    Là je n'y comprend plus rien. Quelqu'un sait-il pourquoi aMyImageList n'est pas évaluer comme un descendant de TCustomImageList lorsqu'il n'est pas instancié dans la DLL??
    Justement, c'est là l'erreur ! Les adresses des ClassType est différent entre la DLL et l'EXE


    Plusieurs solutions :
    - utiliser construire avec Paquets d'Execution (*) pour la DLL et l'EXE, le ClassType du TImageList sera ainsi partagé par les deux binaires.
    Pour le TMyImageList il faut faire son propre package, si tu veux que deux instances soit comparable mais si tu conserves Assign sur le TImageList, cela ne devrait pas être nécessaire

    - Créer le TMyImageList dans la DLL, faire une sorte de Factory qui sera utilisé par l'Exe, ainsi TMyImageList héritera tu TImageList de la DLL et non du TImageList de l'EXE

    - ne pas utiliser directement des objets VCL mais des Interfaces (soit via un COM\ActiveX, soit manuellement en déclarant tes types), cela revient à ré-écrire tout l'objet TImageList, cela peut être fastidieux !

    (*) je suppose que D7 cela était coché !
    Vérifie en XE la liste des paquets, il est possible qu'elle soit fausse, le plus simple, tu supprimes tout, tu décoches puis re-coche, cela reconstruit la liste complète par défaut

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 59
    Points : 81
    Points
    81
    Par défaut
    EXACT !

    J'ai ajouté :
    "construire avec les paquets d'execution : vcl" au projet et à la DLL, ça marche bcp mieux. Et Effectivement c'était coché dans mon environnement Delphi7.
    merci !

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 586
    Points : 25 256
    Points
    25 256
    Par défaut
    N'oublie pas lors du déploiement de ton application à fournir vcl150.bpl (on le trouve dans System32)
    Le numéro est automatiquement ajouté selon la version du compilateur, en XE c'est 150

    Faire de même pour chaque paquet dans la liste, sinon tu auras un message de classe non trouvée ou paquet introuvable sur un PC utilisateur sans Delphi

    vcl150 et vcl70 peuvent cohabiter si tu as encore des applications en D7 sur le poste, mais ne pourrons pas s'échanger d'objet évidemment !

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

Discussions similaires

  1. [Delphi 7] Déclaration d'un composant dynamique
    Par alainvh dans le forum Débuter
    Réponses: 5
    Dernier message: 06/02/2010, 09h25
  2. Réponses: 5
    Dernier message: 14/08/2009, 09h24
  3. [Delphi 2006] Problème de compilation (composant SQX)
    Par NewSoftVision dans le forum Delphi
    Réponses: 2
    Dernier message: 04/05/2007, 14h05
  4. [Delphi 2005] Comment installer un composant ?
    Par rdoudou dans le forum EDI
    Réponses: 1
    Dernier message: 15/11/2005, 20h24
  5. {delphi 6 Perso} Palette de Composant
    Par dudux dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 14/10/2004, 15h20

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