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 :

Objets COM et Objets métiers


Sujet :

Delphi

  1. #1
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut Objets COM et Objets métiers
    Salut tout le monde.

    Je désire créer une API. J'ai déjà tout le code des objets métiers qui sert dans une application. Le but est de faire une API sur cette application.

    J'ai suivi quelques tutoriels et je suis en train de prendre en main le biniou.

    Je me heurte sur un problème d'architecture.
    Comment faire coller les objets COM aux objets métiers ?

    J'ai par exemple 2 objets métiers : TMyComposant et TMyComposantList.
    TMyComposantList possède une méthode GetByNom qui prend le nom du TMyComposant en paramètre et renvoie le TMyComposant correspondant. Rien de bien sorcier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function GetByNom( aNom : string ) : TMyComposant;
    var
      i : Integer;
    begin
      Result := nil;
      for i := 0 to Count - 1 do
        if Items[ i ].Nom = aNom then
        begin
          Result := Items[ i ];
          Break;
        end;
    end;
    Dans l'API, je crée 2 interfaces IComMyComposant et IComMyComposantList avec leurs objets implémentés associés.

    J'ai défini une propriété ByNom prenant un WideString en paramètre et retournant un IComMyComposant.

    Mais ensuite, je ne peux pas mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TComMyComposantList.Get_ByNom( const aNom : WideString ) : IComMyComposant;
    begin
      Result := FMyComposantList.GetByNom( aNom );
    end;
    Avec FMyComposantList étant un TMyComposantList mis en private.
    Je ne peux pas faire ainsi car ça va retourner un TMyComposant et non pas un IComMyComposant.

    Je ne voudrais pas non plus devoir redévelopper chacune des méthodes mais pouvoir les réutiliser.

    Je me suis dit que peut-être serrait-il mieux d'intégrer l'un dans l'autre. C'est-à-dire faire dériver mes composants directement TAutoObject et non plus de TObject, mais le soucis est que les composant dérivent pour l'instant de TComponent et qu'il n'existe pas de TAutoComponent.

    J'ai aussi des objets qui dérivent de TList et si je veux faire dériver de TAutoObject, je suis coincé car on ne peut pas faire d'héritage multiple en Delphi.

    En fait, je ne sais pas très bien qu'elle architecture choisir pour développer une API. Et je ne trouve que de l'aide théorique sur les objets COM et pas de conseils sur leur utilisation.

    Merci pour votre aide, j'espère que j'ai pas été trop confus.

  2. #2
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Je réfléchis à la question et je me dis qu'il faudrait que j'arrive à faire dériver un objet de l'autre, soit mes objets métiers deviennent des objets COM, soit les objets dérivant des interfaces COM héritent aussi de mes objets métiers.

    Le soucis vient du fait qu'on ne peut pas faire d'héritage multiple, il faudra sûrement que je refasse les méthodes.

  3. #3
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    A priori, il n'y aurrait pas de solution miracle, je vais devoir repenser tous mes objets et refaire une partie des méthodes.
    Dommage.

    Je laisse quand même la question ouverte pour récupérer le retour d'expérience de ceux qui sont déjà passés par là.

  4. #4
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Juillet 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 128
    Par défaut
    Bonjour,

    Essaie d'utiliser un énumérateur de collection pour gérer ta liste plutot qu'un objet liste. Ton objet devra implémenter IEnumVariant ou une interface de même type.

    La méthode Next devrait renvoyer un objet du type IComMyComponent qui sera créer à chaque fois avec ton objet métier comme champ privé.

    J'espère que j'ai été assez clair

  5. #5
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Citation Envoyé par flash_math
    Bonjour,

    Essaie d'utiliser un énumérateur de collection pour gérer ta liste plutot qu'un objet liste. Ton objet devra implémenter IEnumVariant ou une interface de même type.

    La méthode Next devrait renvoyer un objet du type IComMyComponent qui sera créer à chaque fois avec ton objet métier comme champ privé.

    J'espère que j'ai été assez clair
    Ben pas trop.
    En gros, tous mes objets métiers serraient instanciés et je n'instancierait les objets COM qu'au moment de leur appel et je les relierait à mes objets métiers ?

    Si je passe pas un énumérateur, est-ce que c'est toujours indexé et je pourrais récupérer un élément sans devoir repasser toute la liste ?

  6. #6
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Juillet 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 128
    Par défaut
    Pour l'instanciation oui.

    Bon c'est un peu vieux pour moi, mais je penses à ça :

    La méthode Next donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Inc(FIndex);
      FObjet:=nil;
    Et la méthode GetCurrent donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if FObjet=nil then
      FObjet:=TMyComComponent.create(FList.items[FIndex] as IMyComComponent;
    result:=FObjet;
    Mais cette méthode t'obligera bien sur à instancier un objet à chaque fois.

    De plus, en effet, comme pour tous les énumérateurs, il te faudra repasser la liste à chaque fois ou utiliser la méthode Skip.

    Bon c'est une idée comme ça car j'ai des problèmes avec mon pc et donc j'ai pas acces à l'aide de Delphi pour l'instant.

  7. #7
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Merci, pour ces infos.
    Dès que je rebosse dessus (vendredi) et que j'avance je dirai si ça marche ou ça pose problème.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 130
    Par défaut
    Salut,

    Les énumérateurs en COM marchent très bien

    Ta classe liste se déclare comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TPipo = class(TAutoIntfObject, IPipo, IEnumVARIANT)
    Et doit implémenter les méthodes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        function Clone(out ppenum: IEnumVARIANT): HResult; stdcall;
        function Next(celt: LongWord; var rgvar: OleVariant;
          out pceltFetched: LongWord): HResult; stdcall;
        function Reset: HResult; stdcall;
        function Skip(celt: LongWord): HResult; stdcall;
    A+

Discussions similaires

  1. Réponses: 16
    Dernier message: 06/06/2007, 12h42
  2. [Définition] Objet COM
    Par Etanne dans le forum Windows
    Réponses: 4
    Dernier message: 19/08/2004, 18h44
  3. Objet COM ou pas en réseau ?
    Par corwin_d_ambre dans le forum Web & réseau
    Réponses: 11
    Dernier message: 13/07/2004, 17h38
  4. [objets COM] "Catastrophic failure"
    Par Air'V dans le forum ASP
    Réponses: 5
    Dernier message: 10/09/2003, 11h45
  5. Désenregistrement d'Objets COM sous Windows
    Par barthelv dans le forum Windows
    Réponses: 2
    Dernier message: 21/05/2003, 15h11

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