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.
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.
[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.
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).
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.
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.
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager