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 :

Savoir si un objet implement une interface


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 197
    Points : 54
    Points
    54
    Par défaut Savoir si un objet implement une interface
    Bonjour a tous j'ai créer une interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        ISecurity = interface(IInterface)
        ['{C05A0D2F-0E87-45E0-95DF-9315D1A02EEF}']
        procedure CanSessionAcces(Session: TSession); stdcall;
        end;
    et j'ai une class qui implemente cette interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TPersoBouton = class(TBitBtn, ISecurity)
      private
        ........
        procedure CanSessionAcces(Session: TSession); stdcall;
        ........
      public
        constructor Create(AOwner: TComponent); override;
      published
        ..........
          end;
    sur un formulaire ou je depose mon bouton j'ai la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TFormPerso.securityControl;
    var i: integer;
    Int :ISecurity;
    btn :TPersoBouton;
    begin
       for i:=0 to self.ComponentCount -1  do
       begin
            if   Components[i].IsImplementorOf(int) then
            begin
                Int := Components[i] as ISecurity;
                Int.CanSessionAcces(nil);
            end;
       end;
    end;
    la condition Components[i].IsImplementorOf(int) retourne toujours false bien l'element à l'index i implement l'interface.
    j'espère avoir exposé clairement mon probleme.
    Cordialement.

  2. #2
    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 154
    Points
    10 154
    Par défaut
    Il est risqué de travailler sur un même objet en même temps en temps qu'instance d'une classe et qu'instance d'une interface. Car dès le moment que tu récupères une référence à son implémentation de l'interface, l'objet compte ses références d'interfaces, mais pas celles d'instance de classe.
    Donc soit travaille uniquement avec des références à des interfaces, soit uniquement avec des références à des classes.

    Cela dit, pour ton problème, il est fort possible qu'il te faille d'abord récupérer Components[i] en tant que IInterface, puis utiliser un as d'interfaces pour le récupérer en ISecurity, avec éventuellement génération d'une exception EIntfCastError s'il ne l'implémente pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var Intf : IInterface;
        Security : ISecurity;
    ...
    Intf := Components[i];
    try
      Security := Intf as ISecurity;
      // Do something with Security
    except
      on Error : EIntfCastError do;
    end;
    Voir aussi : Quid du transtypage et de l'opérateur as ?

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 197
    Points : 54
    Points
    54
    Par défaut
    je crois que le probleme est au niveau Components[i].IsImplementorOf(int) qui retourne false bien que Components[i] implemente l'interface.
    je ne sais pas si c'est un bug mais
    Components[i].IsImplementorOf(int) retourne false alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Int := Components[i] as ISecurity;
               Int.CanSessionAcces(nil);
    ne genère pas d'erreur au contraire la methode CanSessionAcces(nil); est executé pour chacun des Components[i].
    cordialement

  4. #4
    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 154
    Points
    10 154
    Par défaut
    En fouillant un peu les codes sources de la VCL, j'ai compris le problème : IsImplementorOf, méthode qui ne me disait rien, n'est pas du tout utilisée dans ton cas de figure. Cela fait partie du processus très complexe de sauvegarde en flux des composants.

    La seule manière de procéder qui fonctionne est celle que j'ai indiquée plus haut, à savoir l'utilisation de as avec un except sur EIntfCastError.

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

Discussions similaires

  1. Delaration d'un objet dont sa classe implemente une Interface
    Par handsome01 dans le forum Général Java
    Réponses: 2
    Dernier message: 02/11/2012, 03h20
  2. [ANTLR][JAVACC]implementer une interface
    Par anitshka dans le forum EDI et Outils pour Java
    Réponses: 13
    Dernier message: 22/08/2006, 15h12
  3. [Reflection] Obtenir toutes les classes implémentant une interface
    Par Pill_S dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 20/04/2005, 16h48
  4. [classe anonyme] implementant une interface
    Par stanilas dans le forum Langage
    Réponses: 4
    Dernier message: 30/11/2004, 00h18
  5. [Reflection] Classes implémentant une interface
    Par thibaut dans le forum API standards et tierces
    Réponses: 17
    Dernier message: 29/07/2004, 14h57

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