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

C++Builder Discussion :

Pb classique : intégrer une form ou un frame d'une DLL dans la fiche de l'application


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 43
    Points : 21
    Points
    21
    Par défaut Pb classique : intégrer une form ou un frame d'une DLL dans la fiche de l'application
    Bonjour,

    Question archi classique mais ttes les réponses trouvées sur le forum ou sur le net ne fonctionne pas !

    Je cherche à inclure dans une zone de mon appli (un groupbox ou un panel) une fiche ou un cadre (TFrame) d'une DLL.

    Cette fiche (ou ce cadre) contenant des boutons, affichages, contrôles divers.

    Comment faire ? Dois-je utiliser une fiche ou un cadre ?

    Merci de votre réponse par avance !

    Colloc

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello,

    Perso dans la dll je crée une fiche (BorderStyle = none, BorderIcons = vide), et je lui mets comme ParentWindow le handle du parent voulu dans l'appli (handle passé à la fonction de la dll qui crée la fenêtre). Le parent peut être un TPanel, un TForm, un TTabSheet ...

    Par contre, dans cette fonction de création, je sauvegarde le Application->Handle de la DLL, et je le remplace par celui de l'appli appelante.
    La fonction de destruction de la fenêtre repositionne le Application->Handle de la DLL à son ancienne valeur.

    Et ça marche très bien (avec Builder 2007) !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 43
    Points : 21
    Points
    21
    Par défaut
    Je n'y arrive pas !!

    Voilà mon code de création dans la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    extern "C" __stdcall __declspec(dllexport,dllimport) int Show(TWinControl* parentForm, TApplication* Appli)
     
    {     TForm1 *MyForm=new TForm1(parentForm);
          if (MyForm)
                    {
                    if  (parentForm) MyForm->Parent=parentForm;
                    Application->Handle=Appli->Handle;
     
                    MyForm->Show();
                    }
     
     
    }

    Et mon appel en dynamique dans l'appli principal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     HINSTANCE hinstDLL;
        MYDLLFUNC ImpFuncDLL;
      int iRet;
            if ((hinstDLL=LoadLibrary("DLLFonction.dll"))) {
                       ImpFuncDLL = (MYDLLFUNC)GetProcAddress(hinstDLL, "Show");
     
                        if (ImpFuncDLL) {
                                              iRet = ImpFuncDLL(FichePrincipale,Application);
                                               }
                       }
    Bref, rien de bien compliqué !

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    extern "C" __stdcall __declspec(dllexport,dllimport) int Show(TWinControl* parentForm, TApplication* Appli)
     
    {     TForm1 *MyForm=new TForm1(parentForm);
          MyForm->Left = 0;
          MyForm->Top = 0;
          if (MyForm)
                    {
                    if  (parentForm) MyForm->ParentWindow=parentForm->Handle;
                    Application->Handle=Appli->Handle;
     
                    MyForm->Show();
                    }
    }
    Mais je ferais ceci:
    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
    17
    18
    19
    20
    21
    22
    extern "C" __stdcall __declspec(dllexport,dllimport) int Show(HWND parentForm, HWND Appli, HWND* oldAppli, TForm** fenetre)
     
    {
         *oldAppli = Application->Handle;
         Application->Handle=Appli;
     
         TForm1 *MyForm=new TForm1(NULL);
         *fenetre = MyForm;
     
         MyForm->Left = 0;
         MyForm->Top = 0;
         if  (parentForm) MyForm->ParentWindow=parentForm;
     
         MyForm->Show();
    }
     
    extern "C" __stdcall __declspec(dllexport,dllimport) int Fermer(HWND oldAppli, TForm* fenetre)
     
    {     
            Application->Handle = oldAppli;
            delete fenetre;
    }
    Puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TForm* fenetre;
    HWND appli;
    iRet = ImpFuncDLL_Show(FichePrincipale,Application, &fenetre, &appli);
    ...
    ImpFuncDLL_Fermer(fenetre, appli);
    Ok, c'est crado, mais c'est pour l'idée...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 43
    Points : 21
    Points
    21
    Par défaut
    J'ai testé ton code, fais qq correction (qq petites erreurs a priori de ta part)...

    Mais il n'en veut pas !

    Je tourne en rond depuis 2 jours là dessus ! Alors que cela parait si simple !

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Quand tu mets un point d'arrêt sur MyForm->Show(), est-ce que derrière les propriétés de MyForm te paraissent correctes ? (pas facile d'être crétif, là...)

    Pour info, sur mon form, j'ai Position à poDesigned.

    Dans le constructeur de ma fenêtre, j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      if (mHandleParent != NULL)        // mHandlePent : ->Handle d'un TWinControl 
      {
        BorderStyle = bsNone;
        BorderIcons = TBorderIcons();
        ParentWindow = mHandleParent;
     
        // On prend toute la place dispo dans le parent
        TRect rect;
        ::GetClientRect(mHandleParent, &rect);
        Width = rect.Width();
        Height = rect.Height();
      }
    La 1ère fonction (celle juste avec ParentWindow) m'a permis d'afficher ma fenêtre dans un TPanel contenu dans un TTabSheet....

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 43
    Points : 21
    Points
    21
    Par défaut
    De retour après un mois à faire d'autres choses ...

    Je reviens vers vous pour avoir la solution, je tourne en rond.

    Je n'arrive toujours pas à afficher ma form de la DLL dans la form de l'appli principale. Je vois bien qu'il se passe qq chose, mais je ne la vois pas !

    Help please !!!

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello,

    ... Je vois bien qu'il se passe qq chose ... !
    Ben c'est déjà pas mal
    A part regarder en débugage les propriétés de la fenêtre créée... ou essayer de voir avec Spy++...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 43
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par totoche76 Voir le message
    Hello,

    Ben c'est déjà pas mal
    A part regarder en débugage les propriétés de la fenêtre créée... ou essayer de voir avec Spy++...
    Sans abuser, peux-tu remettre le code que tu as fait pour le mettre dans le TPanel ?

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Citation Envoyé par Colloc Voir le message
    Sans abuser, peux-tu remettre le code que tu as fait pour le mettre dans le TPanel ?
    Si FichePrincipale contient un TPanel nommé Panel1, ça donne quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TForm* fenetre;
    HWND appli;
    iRet = ImpFuncDLL_Show(FichePrincipale->Panel1->Handle, Application->Handle, &fenetre, &appli);
    ...
    ImpFuncDLL_Fermer(fenetre, appli);

  11. #11
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    J'ai aussi eu des trucs bizarres. J'ai essayé d'afficher une fenêtre C++ dans une fenêtre Access et tout fonctionnait très bien en utilisant une méthode similaire. Mais par contre toutes les frames de mes fenêtres C++ disparaissait (alors qu'elles s'affichent très bien dans un projet VCL).

    J'ai pas mal cherché mais n'ai rien trouvé. C'est comme si les TFrame n'étaient simplement plus affichés lorsque le parent est en dehors de la DLL.

    Pour précision: j'avais fait des tests avec une fenêtre très simple (en dehors d'Access) et effectivement la frame n'apparaissait plus dès que le parent (ou peut-être l'application) est en dehors de la DLL.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 43
    Points : 21
    Points
    21
    Par défaut
    Bon, j'arrive désormais à afficher une fenêtre dans un panel :

    Le code :

    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
    //---------------------------------------------------------------------------
    extern "C" int __stdcall __declspec(dllexport)  Show(TApplication* Appli,TForm** Fiche)
    {
     
    Application=Appli;
    *Fiche=new TForm1(NULL);
    Application->Handle=Appli->Handle;
    return 1;
    }
     
    extern "C" int __stdcall __declspec(dllexport)  Close(TForm** Fiche)
    {
    (*Fiche)->Close();
    delete(*Fiche);
    return 1;
    }
    Et le code dans mon appli :
    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
    17
    18
    if (hinstDLL=LoadLibrary("DLLFonction.dll"))
            {
            AccesFiche = (AccesFicheDLL)GetProcAddress(hinstDLL, "Show");
            FermetureFiche = (FermetureFicheDLL)GetProcAddress(hinstDLL, "Close");
     
            if (AccesFiche)
                            {
                            AccesFiche(Application, &FicheDLL);
                            FicheDLL->Parent=PanelDLL;
                            FicheDLL->Show();
                            FicheDLL->Left=0;
                            FicheDLL->Top=0;
                            FicheDLL->FormStyle=fsStayOnTop;
                            FicheDLL->Align=alClient;
                            }     
     
     
            }
    Comme on le voit, je suis obligé de mettre la fenêtre à StayOnTop, c'est la seule méthode pour me permettre de la voir dans ma fiche (mon panel). Mystère....



    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (FermetureFiche)
                            {
                            FermetureFiche(&FicheDLL);
                            }
    Cependant, désormais, je n'arrive pas à libérer la librairie, ça me plante complètement tout, et si je ne le fais pas ça me plante aussi !

    Des idées ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 43
    Points : 21
    Points
    21
    Par défaut
    Bon, j'ai trouvé, j'ai bien sauvegardé l'appli et son handle puis remis lors de la femeture, ça fonctionne....

    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
    17
    18
    19
    20
    //---------------------------------------------------------------------------
    extern "C" int __stdcall __declspec(dllexport)  Show(TApplication* Appli,TForm** Fiche, TApplication** OldAppli)
    {
    *OldAppli=Application;
    Application=Appli;
    *Fiche=new TForm1(NULL);
    Application->Handle=Appli->Handle;
     
     
    //return MyForm;
    }
     
    extern "C" int __stdcall __declspec(dllexport)  Close(TForm** Fiche,TApplication* OldAppli)
    {
    (*Fiche)->Close();
    delete(*Fiche);
    Application=OldAppli;
    Application->Handle=OldAppli->Handle;
     
    }

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/02/2013, 14h37
  2. Utilisation des Frames sur une Forms
    Par selmak7 dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/07/2006, 17h42
  3. [Forms]problème d'appel d'une form
    Par med_anis_dk dans le forum Forms
    Réponses: 2
    Dernier message: 27/05/2006, 20h26
  4. [Form close] Impossible de fermer une form
    Par valoji dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2006, 15h12
  5. Réponses: 2
    Dernier message: 07/02/2006, 20h57

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