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 7] Affection Variable non controlé avec IInterface


Sujet :

Langage Delphi

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [Delphi 7] Affection Variable non controlé avec IInterface
    Salut tous,

    Je suis un petit nouveau dans le delphi [Delphi 7][WinXP] mais j'ai toutefois une lourde expérience en Java. Et je me suis pris au jeu de faire une conception à la java avec en particulier l'utilisation d'interface c'est à dire en Delphi de IInterface. Et j'ai des comportement plutot bizarre concernant les affectations de variables.

    Voici un rapide exposé de ma conception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IService = interface
     
     procedure InitService;
    end
    le Guid étant généré avec S+Ctrl+G

    Une classe d'implémentation
    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
     
    TMyService = class(TInterfacedObject , IService)
      constructor Create;
     
      private
        FEventListeners :     IInterfaceList;
        FSequenceListeners :  IInterfaceList;  
     
       public
        // Implementation de l'interface
        procedure InitService;
     
       //Implementation propre
     
      procedure fire;
    end
    L'implementation du constructor s'assure de mettre à nil toutes les variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor Create;
    begin
     FEventListeners := nil;
     FSequenceListeners := nil; 
    end;
    Et Fire initialize les variables FeventListeners et FSequenceListeners.

    Voici la sequence d'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
     l_list : IListInterface;
     l_service : IService;
     l_MyService : TMyService;
    begin
    l_list := TListInterface.Create;
    l_list.add(IService(TMyService.create ));
    l_service := l_list[i] as IService;
    l_service.init;
    l_MyService := TMyService(l_service);
    l_MyService.fire;
    Et c'est là dans fire qu'apparait le problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure fire;
    begin
     if FEventListeners <> nil then
        FEventListeners := TListInterface.Create;
     
    end
    Bien que FEventListeners est été mis à nil dans le Create et bien il n'est pas nil et provoque donc une erreur lors de la nouvel création.

    Ici la variable est est une IInterfaceList mais j'ai aussi le cas avec d'autre type.

    Est ce que quelqui'un peut m'expliquer ou m'aiguiller vers de la doc détailler sur les différents cast et en particulier dans l'utilisation des IInterface.

    Merci
    Et si quelqu'un a des problèmes en JAva - No problem

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure fire; 
    begin 
     if Assigned(FEventListeners) then 
        FEventListeners := TListInterface.Create; 
     
    end
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je te remercie de ton aide mais le problème n'est pas de vérifier l'affectation, c'est qu'il y a affectation d'une variable sur un pointer non souhaité. Ma variable est normalement à nil mais quand je verifie son affectation après récupération dans la liste, suite au cast TMyService, une ou des variables sont affectés sans action de ma part.

  4. #4
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Je pense savoir d'où vient ton problème. Cette ligne me semble fausse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    l_list.add(IService(TMyService.create ));
    Tu devrais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    l_list.add(TMyService.create as IService);
    En effet, lorsque on utilise l'opérateur as, cela revient à appeler la méthode QueryInterface qui retourne l'interface spécifié : un pointeur, différent de celui d'une autre interface ou de la classe Delphi. Si tu transtypes directement, tu transforme artificiellement une instance de classe Delphi en interface. Tu obtiens donc n'importe quoi.
    Autre chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    l_service := l_list[i] as IService;
    Est-tu sûr de ta variable i ? Comme elle n'apparait pas dans le code...
    A ta place, j'aurais plutot écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin 
    l_list := TListInterface.Create; 
    l_service:= TMyService.Create as IService;
    l_list.add(l_service); 
    l_service.init;
    C'est plus rapide puisqu'il n'y a plus qu'un seul "transtypage" et le risque d'erreur est plus faible.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse éclairante. Il semble en effet que se soit lié à des problèmes de transtypage.

    Il n'y a pas de souci dans la récupération du IService dans la liste. Par contre lorsque je retranstype celui ci dans l'objet y a un problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
    l_service : IService;
    l_myservice : TMyService;
    begin
    l_service.init; // Pas de souci
    l_myservice := TMyService(m_service);
    l_myservice.fire ; //Problem les variables sont déjà affecté par un grand mystère.
    pour info si cela peut vous donner des pistes. J'utilise un singleton : TAppliContext qui contient la liste de mes services afin de disposer d'une seule instance de ceux ci partout dans le code. Ca marche très bien sauf ces malheureuse affectation.

    Sinon merci pour réactivité

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Il faut lire le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
    l_service : IService;
    l_myservice : TMyService;
    begin
    l_service.init; // Pas de souci
    l_myservice := TMyService(l_service);
    l_myservice.fire ; //Problem les variables sont déjà affecté par un grand mystère.
    Et MERCI pour vos réponses.

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/06/2009, 18h26
  2. Affecter variable avec une saisie clavier
    Par DI_2007 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/03/2007, 19h46
  3. Affecter variable avec une saisie clavier
    Par DI_2007 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/03/2007, 13h43
  4. Réponses: 13
    Dernier message: 01/06/2006, 17h20
  5. [debutant] get image avec une variable non static
    Par laguna dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2006, 15h57

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