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

Composants VCL Delphi Discussion :

TForm et Interface


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut TForm et Interface
    Salut à tous

    J'ai créé un programme qui utilise des plugins. J'avais au départ utilisé des DLL sans interface. Mais d'après beaucoup de monde, c'est mal
    J'ai donc commencé à tester des solutions avec des interfaces. Seulement voila, j'ai des gros pépins.
    J'ai donc créé un projet vierge avec une fiche et un bouton. J'ai aussi un projet de DLL qui exporte une fonction qui renvoie l'interface en question.
    Voici le gabarit de mon interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      IPedroTest = interface
      ['{1665DEEB-3ADB-4185-B21A-BFD75836C3CF}']
      //Getters
      procedure SetAppHandle(const Value: HWND); StdCall;
      //Setters
      function GetAppHandle: HWND; StdCall;
     
      //publié
        function Test1: boolean; StdCall;
        property AppHandle: HWND read GetAppHandle write SetAppHandle;
      end;
    La propriété AppHandle est là pour les tests.
    Voici l'implémentation de Test1 qui ne fait que créer et afficher une fiche de façon modale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function TTest.Test1: boolean;
    begin
    //  Application.Handle := AppHandle;
    //  with TDLLForm.Create(Application) do
      with TDLLForm.Create(nil) do
      try
        Result := ShowModal = mrOk;
      finally
        Free;
      end;
    end;
    Je récupère donc ma procédure dans la DLL qui me crée l'interface. Je lance alors la procédure Test1.
    La fiche s'affiche bien mais:

    • Lorsque je ferme cette fiche, tout le projet se ferme. Si je suis en mode Debug (F9), j'ai droit à une AV. Sinon, tout se ferme sans autre forme de procès.
    • La fiche de la DLL a son propre bouton dans la barre des tâches en plus de celle du programme principal ce que je ne veux pas. En passant le Handle de l'application et en initialisant Application.Handle := FAppHandle, le bouton ne s'affiche plus MAIS (il y en a toujours un) le bouton du programme principal n'est pas enfoncé. Si je clique dessus, la fiche principale désactivé repasse devant la fiche de la DLL... Il faut ensuite faire Alt-Tab pour revenir sur la fiche modale.

    Je ne sais pas si je suis bien clair Quoi qu'il en soit, ma question est: Qu'est-ce que j'ai oublié?? Ou alors, plus généralement: Comment utiliser une fiche avec une interface sans qu'il y ait tous ces défauts?

    Merci d'avance

    PS: pour ceux qui veulent tester, voici mon projet de test (Le GUID est certainement à changer (Ctrl+Shift+G)):
    http://pedro.developpez.com/divers/test_interface.zip
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    La fiche de la DLL a son propre bouton dans la barre des tâches en plus de celle du programme principal ce que je ne veux pas. En passant le Handle de l'application et en initialisant Application.Handle := FAppHandle, le bouton ne s'affiche plus MAIS (il y en a toujours un) le bouton du programme principal n'est pas enfoncé.
    Je dirais plutôt le Owner de la fenêtre est à affecter ...

    Pour l'Access Violation, qui viens de l'interface je crois, alors là galère.

    J'ai essayé diverse truc avec les interfaces mais j'ai carrément laissé tout tomber. J'ai remarqué que la gestion des interfaces avec FastMM et le memory manager de borland sont différentes. Où FastMM se plaint d'un memory leak, l'autre roule très bien. En fixant le memory leak rapporté par fastMM, crash avec mm de borland. De plus, très peu de documentation clair.
    Un gros bordèle pour le release et le add. En résumé, sur un gros projet, j'ai trop galéré et j'ai abandonné.

    Bref, je vous souhaite bon voyage.

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par pepi22 Voir le message
    Je dirais plutôt le Owner de la fenêtre est à affecter ...
    Bah c'est ce que l'on pourrait croire mais tous mes tests effectués jusqu'ici donnent systématiquement le Handle de l'application comme solution pour éviter ce bouton disgracieux
    Citation Envoyé par pepi22 Voir le message
    Pour l'Access Violation, qui viens de l'interface je crois, alors là galère.
    Elle vient seulement lorsque tout se ferme, après quelques secondes...
    Citation Envoyé par pepi22 Voir le message
    J'ai essayé diverse truc avec les interfaces mais j'ai carrément laissé tout tomber. J'ai remarqué que la gestion des interfaces avec FastMM et le memory manager de borland sont différentes. Où FastMM se plaint d'un memory leak, l'autre roule très bien. En fixant le memory leak rapporté par fastMM, crash avec mm de borland. De plus, très peu de documentation clair.
    Pour ma part, dans mon gros projet, j'ai utilisé SimpleShareMem qui marche très bien mais qui, comme toi visiblement, me produit des memory leaks. Bon pas beaucoup mais cela se produit à chaque fois que je lance un plugin! C'est pour éviter cela que j'essaie de passer aux interfaces mais je galère pas mal A vrai dire, en faisant "comme il ne faut pas faire", ça a très bien marché jusque là Mis à part la perte de mémoire évidemment
    Citation Envoyé par pepi22 Voir le message
    Un gros bordèle pour le release et le add. En résumé, sur un gros projet, j'ai trop galéré et j'ai abandonné.

    Bref, je vous souhaite bon voyage.
    Merci

    [EDIT]
    Je viens de réessayer en créant avec un Owner (en l'occurence, la fiche du prog principal) mais même problème: 2nd bouton et fermeture totale...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    Elle vient seulement lorsque tout se ferme, après quelques secondes...
    C'est ce que je dis, cela doit surement provenir de l'interface.

    Est-ce que vous appelez release?

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par pepi22 Voir le message
    C'est ce que je dis, cela doit surement provenir de l'interface.
    Aïe
    Citation Envoyé par pepi22 Voir le message
    Est-ce que vous appelez release?
    J'ai essayé Release, Free et Destroy et même FreeAndNil sans grand résultat

    Merci en tout cas de m'aider
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    Question peut-être curieuse, avez vous essayez de ne rien faire du tout?

Discussions similaires

  1. [Débutant] imprimer une interface TForm
    Par bicha_27 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/09/2012, 09h49
  2. Interface dune Tform
    Par Panaméen dans le forum C++
    Réponses: 0
    Dernier message: 15/05/2008, 16h49
  3. TForm dans une DLL avec utilisation d'Interface
    Par guedelmalin dans le forum Langage
    Réponses: 13
    Dernier message: 17/06/2005, 11h58
  4. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27
  5. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

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