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 :

[MDI][DLL] Enfant MDI dans une dll


Sujet :

Composants VCL Delphi

  1. #1
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut [MDI][DLL] Enfant MDI dans une dll
    Bonjour,

    Est-il possible dans une application MDI, de créer un formulaire enfant MDI dans une DLL ?

    Si oui comment ?

    Je n'ai rien trouvé sur la FAQ.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    [Je me permets de remonter le sujet dans le thread.]
    et je reformule ma question...

    J'ai un applicatif MDI, j'ai un formulaire dans une DLL.
    Est-il possible d'appeler le dit formulaire dans l'applicatif, comme enfant MDI de la mainForm (fsMDIFORM) ?

    Si quelqu'un a une réponse je suis preneur
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Membre actif Avatar de TMuet
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2003
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 225
    Points : 288
    Points
    288
    Par défaut
    Of course

    Je le fais et sa marche très bien 8)

    Il faut procéder de la même façon que si la mère est l'enfant étaient dans le même bianire !
    Le seul petit souci peut concerner le TApplication de la DLL qui n'est pas nécessairement le même que celui de l'EXE. Dans ce cas, tu peux réaffecter celui de la DLL (c'est ce que je fais aussi).

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Merci TMUET

    mais tu pourrais me donner un peu plus de détails STP
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Membre habitué
    Inscrit en
    Février 2003
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 171
    Points : 126
    Points
    126
    Par défaut
    Salut,

    J'ai trouvé un jour ce code sur Internet. Je l'ai essayé et ça marche.

    Code pour la fenêtre MDI principale :
    Pour info, la fenêtre parent à un menu MainMenu1 (voir ci-dessous) avec lequel l'évenement StartClick est généré.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    unit MainUnit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ToolWin, ComCtrls, Menus;
     
    type
      TMainForm = class(TForm)
        MainMenu1: TMainMenu;
        Start: TMenuItem;
        procedure StartClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
       T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;
     
    var
      MainForm: TMainForm;
     
    implementation
     
    {$R *.DFM}
     
    procedure TMainForm.StartClick(Sender: TObject);
    var
       DllHandle: THandle;
       ProcAddr: FarProc;
       ProvaChild: T_ProvaChild;
    begin   
       DllHandle := LoadLibrary('ProjectDll');
       ProcAddr := GetProcAddress(DllHandle, 'ProvaChild');
       if ProcAddr <> nil then
       begin
          ProvaChild := ProcAddr;
          ProvaChild(Application,Self);
       end;
    end;
     
    end.

    Code pour le projet DLL (fichier *.DPR) :
    Remarque qu'ici, on déclare l'unité UnitDll qui est le fichier de la fenêtre MDI enfant.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    library ProjectDll;
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      UnitDll in 'UnitDll.pas' {Form1};
     
     
     
    procedure ProvaChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
    var
      Form1: TForm1;  
      DllProc: Pointer;             { Called whenever DLL entry point is called }
     
    begin
       Application:=ParentApplication;
     
       Form1:=TForm1.Create(ParentForm);
       Form1.MyParentForm:=ParentForm;
       Form1.MyParentApplication:=ParentApplication;
    //   windows.SetParent(Form1.Handle,ParentForm.Handle);
    //   Form1.FormStyle:=fsMDIChild;
       Form1.Show;
    end;
     
    procedure DLLUnloadProc(Reason: Integer); register;
    begin
      if Reason = DLL_PROCESS_DETACH then  Application:=DllApplication;
    end;
     
    exports
       ProvaChild;
     
    begin
       DllApplication:=Application;
       DLLProc := @DLLUnloadProc;
    end.

    Code pour la fenêtre MDI enfant se trouvant 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    unit UnitDll;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
     
    const WM_Creer = WM_USER + 1;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        procedure WMCreer(var Msg : TMessage); message WM_Creer;
      public
        { Public declarations }
        MyParentForm: TForm;
        MyParentApplication: TApplication;
      end;
     
    var
       DllApplication: TApplication;
     
    implementation
     
    {$R *.DFM}
     
    procedure TForm1.WMCreer(var Msg : TMessage);
    begin
      Memo1.Lines.Add('abc');
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       Action:=caFree;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    //   Application:=DllApplication;
    end;
     
    end.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    SebCBien,
    Je viens de tester ton code, et cela répond exactement à mon problème. Je te remercie.
    Maintenant je vais pouvoir avancer de nouveau
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

Discussions similaires

  1. Fonction dans une DLL recevant et renvoyant une chaîne
    Par Roland Chastain dans le forum Delphi
    Réponses: 14
    Dernier message: 23/04/2015, 11h59
  2. new dans une dll, delete bug dans le main..
    Par eomer212 dans le forum Visual C++
    Réponses: 1
    Dernier message: 27/01/2011, 20h49
  3. Réponses: 1
    Dernier message: 24/04/2007, 09h27
  4. Comment ajouter une feuille MDI fille dans une DLL ?
    Par Najdar dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/02/2007, 16h30
  5. [DLL] utiliser une DLL a partir d' une DLL et un .def
    Par venomelektro dans le forum MFC
    Réponses: 9
    Dernier message: 07/12/2004, 14h01

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