Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1383 connectés 

  FORUM HardWare.fr
  Programmation

  [DELPHI] implementation de queryinterface

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[DELPHI] implementation de queryinterface

n°23515
gtm
Posté le 10-04-2001 à 01:02:23  profilanswer
 

Voilà mon problème : je veux une fiche qui implémente une interface. Seulement, TForm ne descend pas de TInterfacedObject, donc les méthodes queryinterface, _addref et _release ne sont pas implémentées.
 
Est-ce que quelqu'un a une idée de leur implémentation ou connaitrait un bidouillage pour s'en passer ?
 
merci

mood
Publicité
Posté le 10-04-2001 à 01:02:23  profilanswer
 

n°23521
JWhy
je peux plier (héhé)
Posté le 10-04-2001 à 01:44:37  profilanswer
 

a mon avis, il va falloir que tu implementes IUnknown (c-a-d QueryInterface, _AddRef et _Release ) a la main...
 
essaye de te faire une classe TUnknownForm (par exemple)
  TUnknownForm = class (TForm, IUnknown)
qui aura les 3 memes methodes que IUnknown, a savoir:
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
 
pour le code QueryInterface, utilise la fonction GetInterface:
  if GetInterface(IID, Obj) then  
    Result := 0
  else  
    Result := E_NOINTERFACE;
 
pour le code de _AddRef et _Release, incremente et decremente un compteur que tu gereras en interne:

  • _AddRef:

 Inc(fRefCount);
  Result := fRefCount;
 
 

  • _Release:

 Dec(fRefCount);
  Result := fRefCount;
  if fRefCount = 0 then Destroy;
 
par contre, le gros inconvenient, c'est que je ne l'ai pas teste donc si ca se trouve, ca ne marche pas !! ;)
 
ps: sinon, si tu as le code source de la VCL (a partir de l'edition entreprise de delphi, je crois) regarde le source du TInterfacedObject, ca devrait t'aider !


---------------
www.alliancefrancophone.org ... Home is where the heart is
n°23547
bat
Posté le 10-04-2001 à 09:50:22  profilanswer
 

Oh là !!! Y'a plus simple.  
Réimplémenter le fonctionnement de COM, c'est plutot complexe ....
 
Plusieurs solutions :
Soit tu veux que ta fiche communique via COM, auquel cas je te conseille d'ajouter un objet COM à ton projet et qu'il te serve d'intermédiaire dans ta communication.  
(cad Fichier/Nouveau/ActiveX/Objet COM)
 
Soit tu veux que ta feuille puisse s'insérer dans un autre conteneur, auquel cas, tu peux utiliser TActiveForm qui est une fiche et en meme temps un ActiveX.
(cad Fichier/Nouveau/ActiveX/ActiveForm)

n°23548
bat
Posté le 10-04-2001 à 09:52:00  profilanswer
 

JWhy, t'as l'air de bien connaitre COM. Tu bosses avec ?
Avec quel langage/bibliothèque ?

n°23584
gtm
Posté le 10-04-2001 à 11:37:06  profilanswer
 

bat> en fait je veux simplement utiliser les interfaces pour faire une sorte d'héritage multiple : j'ai plusieurs classes qui ne sont pas du tout dans la même hiérarchie et j'aimerais qu'elles implémentent une certaine fonction.
 
JWhy> Merci, j'ai essayé ce que tu proposes, mais ca marche pas. En fait, je crois que le problème vient d'autre part.
J'ai déclaré mon interface de la sorte :  
 
IObservateur=interface(iunknown)
   ['{un ID}']
   procedure UpDateExt
   end;
 
rien de bien bizarre donc, j'ai même essayé plusieurs IDs au hasard. Et c'est là le problème : lors de l'execution :  
 
obj as IObservateur   -> le ID de IObservateur donné par le debugger ne correspond pas à ce que j'ai entré plus haut.
Et à cette ligne, l'execution saute à une adresse où il n'y a rien
 
Bon, je vais continuer à tester dans tous les sens, peutêtre que je trouve autre chose
 
a+

n°23592
gtm
Posté le 10-04-2001 à 12:06:16  profilanswer
 

Ca y est! J'ai trouvé  :)  
 
En fait, mes objets interfacés sont dans un liste (TList), donc il faut transtyper
 
TInterfacedObject(liste[i]) as IObservateur
 
et ça, ça marche pas...
 
mais TInterfacedForm(liste[i]) as IObservateur : ça marche.
 
Mais du coup, je vois pas trop l'intérêt des interfaces si il faut connaitre le type à la compilation ou si tous mes objets doivent descendre d'un même objet pour avoir droit à l'interface.  
Ca tient à moi ou à Delphi (version 4) ?

n°23594
zeltron
Posté le 10-04-2001 à 12:12:28  profilanswer
 

Alors gtm de retour dans le 10D ?

n°23597
gtm
Posté le 10-04-2001 à 12:27:17  profilanswer
 

zeltron> Non, c'est pour la semaine prochaine  :na:  
 
Ca doit être michel derriere ce pseudo, non ?

n°23598
zeltron
Posté le 10-04-2001 à 12:28:51  profilanswer
 

gtm a écrit a écrit :

zeltron> Non, c'est pour la semaine prochaine  :na:  
 
Ca doit être michel derriere ce pseudo, non ?




 
Peut être ...
 
Enfoiré tu as pris 5 semaines c'est scandaleux !

n°23644
Miles V
Posté le 10-04-2001 à 14:33:46  profilanswer
 

Effectivement, d'après ce que j'en sais, tu es obligé de  
connaitre le type de l'objet à la compil (même pb en Delphi 5).
 
Ca m'a semblé très con à moi aussi, mais j'ai pas réussi à
contourner le problème...

mood
Publicité
Posté le 10-04-2001 à 14:33:46  profilanswer
 

n°23835
JWhy
je peux plier (héhé)
Posté le 10-04-2001 à 23:34:29  profilanswer
 

bat a écrit a écrit :

JWhy, t'as l'air de bien connaitre COM. Tu bosses avec ?
Avec quel langage/bibliothèque ?




Oui, je bosse avec COM sous Delphi depuis 2/3 ans maintenant...


---------------
www.alliancefrancophone.org ... Home is where the heart is
n°23836
JWhy
je peux plier (héhé)
Posté le 10-04-2001 à 23:41:13  profilanswer
 

gtm a écrit a écrit :

Ca y est! J'ai trouvé  :)  
 
En fait, mes objets interfacés sont dans un liste (TList), donc il faut transtyper
 
TInterfacedObject(liste[i]) as IObservateur
[...]




 
et sinon, t'as essaye d'utiliser le TInterfaceList ?
 
tu devrais pouvoir recuperer directement ton (liste[i] as IObservateur ) sans avoir besoin de le transtyper (et donc sans avoir besoin de savoir si c'est un TInterfacedObject ou un TInterfacedForm)...

 

[edit]--Message édité par JWhy--[/edit]


---------------
www.alliancefrancophone.org ... Home is where the heart is

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [DELPHI] implementation de queryinterface

 

Sujets relatifs
lancer un exe depuis une appli delphiSMS et DELPHI
requete sous delphiLa bd sous Delphi et le composant DBLookupComboBox.......
treeView en delphi ??????Delphi Vs Visual Basic !!!
[DELPHI] quelques petites questio niveau fonctionnalites :)[Delphi] Onglets
[DELPHI] constructor et self ?Gérer la vitesse d'un moteur en utilisant la méthode PWM sous Delphi!
Plus de sujets relatifs à : [DELPHI] implementation de queryinterface


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR