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 :

Problème avec un "if MaClass is TClass"


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut Problème avec un "if MaClass is TClass"
    Bonjour,
    J'ai 2 classes B et C qui héritent de A.
    J'ai une fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function maFonction(objet : TA) : Boolean;
    begin
       if objet.ClassType = TC then
        [...]
    end;
    Même si je passe en paramètre une instance de la classe C, il m'évalue toujours la condition à faux. Pire, en mode débeug, object.ClassType est bien égal à TC mais il m'évalue quand même la condition à faux..

    J'ai essayé aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function maFonction(objet : TA) : Boolean;
    begin
       if objet is TC then
        [...]
    end;
    Ca ne marche pas non plus.

    Une explication ? Une idée ?

    [Edit] En écrivant ces lignes, je me dis que je devrais faire des overload des fonctions plutôt que des pauvres if...

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    As-tu essayé avec InheritsFrom ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if objet.InheritsFrom( TC ) then
    C'est néanmoins curieux que ça n'ait pas fonctionné avec l'opérateur is.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Salut,
    Egalement un autre piste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Objet.ClassName = 'TC' then ...
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par TicTacToe Voir le message
    Salut,
    Egalement un autre piste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Objet.ClassName = 'TC' then ...
    Non, ça c'est très sale !

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par wezzar Voir le message
    Bonjour,
    [Edit] En écrivant ces lignes, je me dis que je devrais faire des overload des fonctions plutôt que des pauvres if...
    Tu veux dire override dans le cadre d'une surcharge d'une méthode ancêtre héritée ... en procédant en méthode objet ... autant utiliser le langage objet tel qu'il existe au lieu de faire du procédural qui n'est pas adapté à la situation (dans d'autres ça peu)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function maFonction(objet : TA) : Boolean;
    begin
       if objet.ClassType = TC then
        [...]
    end;
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function TA.maFonction() : Boolean; // virtual dans le prototype
    begin
      ...
    end;
     
    function TC.maFonction() : Boolean; // override dans le prototype
    begin
      inherited maFonction; // n'est pas obligatoire surtout si le comportement est radicalement différent
      ...
    end;


    En fin, tu n'aurais pas une histoire de DLL ? un objet créé dans l'exe, et transmis à une procédure de DLL ? car effectivement les références de classe sont différentes, il faut soit faire un paquet, soit gérer à la main le partage de classe via un recensement de l'exe vers la DLL et réciproquement ...
    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

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Non non override ne colle pas à ce que je cherche, la fonction "maFonction" ne fait pas partie d'une des classes A, B ou C.
    Mais tu as tout à fait raison, "maFonction" se trouve bien dans une DLL et je lui transmet l'instance de de la classe depuis un exe qui fait appel à cette DLL.
    Que veux-tu dire par
    gérer à la main le partage de classe via un recensement de l'exe vers la DLL et réciproquement
    ?

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par wezzar Voir le message
    Non non override ne colle pas à ce que je cherche, la fonction "maFonction" ne fait pas partie d'une des classes A, B ou C.
    Mais tu as tout à fait raison, "maFonction" se trouve bien dans une DLL et je lui transmet l'instance de de la classe depuis un exe qui fait appel à cette DLL.
    Que veux-tu dire par
    ?
    bien vue le Troll, je l'avais pas vue venir celle là

    et bien la DLL et l'Exe possèdent chaqu'un une version propre de la classe, donc le test ne sera jamais vrai.

    imagine ce que ça donnerait si tu mettais à jour la classe TC dans la DLL sans recompiler l'exe.

    Delphi ne supporte pas comme le C++ les déclarations de classes externes. Pour moi le seul moyen de gérer les choses proprement est de masquer la nature de la classe en créant un jeu de fonctions manipulant un THandle générique :

    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
     
    library exemple;
     
    function CreateMonObject:TMonObject;
    begin
     Result:=TMonObject.Create;
    end;
     
    procedure DestroyMonObject(obj:TMonObject);
    begin
     obj.Free;
    end;
     
    procedure MethodeObject(obj:TMobjObject);
    begin
     obj.Methode;
    end;
    exports
     CreateMonObject,
     DestroyMonObject,
     MethodeObject;
    et côté EXE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function CreateMonObject:THandle; external 'exemple.dll';
    procedure DestroyMonObject(obj:THandle); external 'exemple.dll';
    procedure MethodeObject(obj:Thandle); external 'exemple.dll';
    tu peux éventuellement créer une classe aussi dans l'exe
    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
     
    type
     TMonObject=class
     private
      fHandle:THandle;
     public
      constructor Create;
      destructor Destroy; override;
      procedure Methode;
     end;
     
    constructor TMonObject.Create;
    begin
     fHandle:=CreateObject;
    end;
     
    destructor TMonObject.Destroy;
    begin
     DestroyObject(fHandle);
    end;
     
    procedure TMonObject.Methode;
    begin
     MethodeObject(fHandle);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    bien vue le Troll, je l'avais pas vue venir celle là
    Merci, mais depuis mon sujet "DLL String Pourquoi ça marche sans BORLNDMM.DLL", ce genre de problème, je le pige vite, et le fait de faire une function non objet m'as mis la puce à l'oreille ...

    Sinon pour le recensement des classes de l'exe vers la DLL et réciproquement, en fait, il faudrait faire une fonction dans la DLL genre de RegisterClass ... consulte le lien que j'ai fourni, en particulier GetButtonClass, qui te donne un idée d'un register automatique des classes entre l'exe et la DLL

    Sinon, j'insiste les Paquets d'Execution, c'est la solution pour que la DLL et EXE partage les mêmes classes ! il y a un tutoriel dessus !
    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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Je viens de créer un paquet d'exécution contenant mes classes A, B et C.
    Je fais en sorte que mon programme et ma DLL utilisent ce paquet (options -> Packages), mais j'obtiens le même problème...
    J'ai bien vérifié les unitées déclarées pointent bien vers le paquet d'exécution.
    Une idée ?

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Tu as bien coché la case "Construire avec les paquets d'exécution" et mis les Classes A, B et C dans un paquet (Projet .DPK donnant un .BPL), et ajouter ce paquet dans la liste ???
    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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Effectivement avec cette case ça marche, mais ça m'embête énormément de devoir redistribuer les paquets séparément. Il n'y a pas un moyen d'associer juste le paquet de mes classes ?

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Tu as d'autres solutions :
    - L'encapsulation proposée par Paul Toth
    - Le Recensement que j'ai proposé
    ...
    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

  13. #13
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Il y a aussi l'usage d'interfaces, mais c'est une autre histoire
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Effectivement SJRD, les interfaces utilisent d'ailleurs un principe de recensement via les CLASS ID ... avant d'en arriver à de tel moyen (le meilleur mais pas forcément le plus simple pour les novices), autant qu'il essaye d'autre méthode qui lui apprendront en plus quelques bases qui lui serviront à comprendre l'objet, les pointeurs, ... qu'il faut connaitre avec de s'attaquer aux Interfaces ...
    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

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Il y a aussi l'usage d'interfaces, mais c'est une autre histoire
    oui c'est pas faux d'ailleurs le chapitre 19 de "Delphi 7 Studio" sur les DLL est en ligne chez Eyrolles
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    J'avais pas bien compris ta section sur les Interfaces dans ton livre Paul, mais après relecture je vais essayer cette option.

    Et si j'ai bien compris, le fait que les objets ne soient pas géré de la même manière avec une DLL qu'un programme vient du fait que la structure de celles-ci a été définie avant la programmation objet et n'a pas évolué depuis ?

  17. #17
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par wezzar Voir le message
    J'avais pas bien compris ta section sur les Interfaces dans ton livre Paul, mais après relecture je vais essayer cette option.
    oups

    Citation Envoyé par wezzar Voir le message
    Et si j'ai bien compris, le fait que les objets ne soient pas géré de la même manière avec une DLL qu'un programme vient du fait que la structure de celles-ci a été définie avant la programmation objet et n'a pas évolué depuis ?
    ben c'est surtout que ce n'est pas simple de placer un objet dans une DLL. En C++ on a un fonctionnement un peu batard qui permet de le faire, le mappage de l'objet entre la DLL et l'EXE est fait automatiquement, mais tu peux aussi avoir une partie du code dans l'EXE puisque le .h peux très bien contenir du code (d'où la difficulté pour intégrer une DLL object C++ dans Delphi).

    l'avantage des interfaces c'est que se sont juste des tableaux de méthodes (des pointeurs donc) et que c'est parfaitement défini. Attention cependant, il ne faut pas venir coller des types dynamiques dans l'interface ! (string, tableaux dynamiques, etc..) car tu retombes sur les mêmes problèmes que précédemment sur la gestion mémoire !
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/07/2009, 14h46
  2. Sudo problème avec les simples quotes
    Par Tronche dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 23/03/2007, 12h02
  3. Réponses: 15
    Dernier message: 21/02/2007, 17h29
  4. [MySQL] Problème avec un double quote
    Par wormseric dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/01/2007, 14h44
  5. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59

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