Form dans une Dll

Signaler
Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004
-
Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004
-
J'ai créé une Dll contenant une form delphi.
A partir de mon application, je parviens à éxécuter cette form.
Lorsque je clique sur la croix pour fermer la form, la form et mon application principale sont fermés.

Si quelqu'un connaît la solution pour fermer uniquement la form de la dll...

bgK

12 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Que déclares-tu comme propriétaire quand tu crées la fiche ? (le paramètre owner passé avec le constructeur Create).

May Delphi be with you.
Delphi advanced
Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004

Euh moi j'utilise:
Application.CreateForm(NomClasse, NomObjet);
pour créer la form.

mon fichier projet est :

library SEIniDll;
uses
Forms, Ini in 'Ini.pas', Princ in 'Princ.pas' {frmPrincIni};
{$R *.res}
procedure ExecPlug();stdcall;
begin
Application.Initialize;
Application.CreateForm(TfrmPrincIni, frmPrincIni);
Application.Run;
end;

exports
ExecPlug;

begin
end.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
En regardant l'aide en ligne, tu peux lire qu'il faut éviter de procéder ainsi, que le premier appel à CreateForm crée la fiche principale de l'application.
Ainsi, quand tu crois fermer ta fiche, tu fermes l'application.

Ce que tu dois faire, c'est de créer une procédure flat qui se chargera d'appeler la fiche à afficher, de manière tout à fait classique (en appelant la méthode Create) et en lui passant l'objet Application comme paramètre.

May Delphi be with you.
Delphi advanced
Messages postés
3
Date d'inscription
mercredi 29 mai 2002
Statut
Membre
Dernière intervention
24 juin 2002

-------------------------------
Réponse au message :
-------------------------------

J'ai créé une Dll contenant une form delphi.
A partir de mon application, je parviens à éxécuter cette form.
Lorsque je clique sur la croix pour fermer la form, la form et mon application principale sont fermés.

Si quelqu'un connaît la solution pour fermer uniquement la form de la dll...

bgK
Messages postés
3
Date d'inscription
mercredi 29 mai 2002
Statut
Membre
Dernière intervention
24 juin 2002

-------------------------------
Réponse au message :
-------------------------------

J'ai créé une Dll contenant une form delphi.
A partir de mon application, je parviens à éxécuter cette form.
Lorsque je clique sur la croix pour fermer la form, la form et mon application principale sont fermés.

Si quelqu'un connaît la solution pour fermer uniquement la form de la dll...

bgK
Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004

Merci bcp j'ai mis :

library SEIniDll;

uses
Ini in 'Ini.pas', Princ in 'Princ.pas' {frmPrincIni};

procedure ExecPlug();stdcall;
var
frmPrincIni : TfrmPrincIni;
begin
frmPrincIni := TfrmPrincIni.Create(nil);
frmPrincIni.Show;
end;

exports
ExecPlug;

begin
end.

Ca marche nikel !!

bgK
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Attention, en passant Nil comme propriétaire de la fiche, personne n'est chargée de la détruire quand tu fermes l'application hôte ! Il y a là un risque important de fuite mémoire en ne pouvant pas détruire une instance d'une fiche.
De plus, comme tu utilises la méthode Show, si l'utilisateur redemande la fiche contenue dans la DLL, elle sera crée une fois de plus.
Je te suggère de remplacer :
frmPrincIni := TfrmPrincIni.Create(nil);

par :
if not Assigned(frmPrincIni) then
frmPrincIni := TfrmPrincIni.Create(Application);

May Delphi be with you.
Delphi advanced
Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004

Euh
if not Assigned(frmPrincIni)
ne peut pas fonctionner puisque frmPrincIni est déclaré juste au dessus.
D'autre part, je ne vois pas trop comment fermer la form avec un bouton.
Application.Terminate Ferme la form et l'application.
frmPrincIni.Close, .CloseQuery, .Destroy génèrent des erreurs.
je ne sais pas si frmPrincIni.Hide serait correct (ne libère pas les ressources ?)

bgK
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
La variable frmPrincIni est déclaré dans l'unité qui décrit la fiche. Un simple Uses "nom de l'unité" te donnes accès à cette variable. Il est donc inutile de déclarer une fois de plus cette variable dans le corps de ta procédure.
J'insiste, en passant application Application comme paramètre de la méthode create, l'application principale devient responsable de la destruction de ta fiche créée dans la DLL.
En créant un gestionnaire d'évènements OnCloseQuery sur frmPrincIni et en mettant "Action := caFree;" dans le corps de cette procédure, les ressources sont automatiquement libérées.
procedure TfrmPrincIni.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

May Delphi be with you.
Delphi advanced
Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004

Encore merçi ça marche (!)

Par contre il faut choisir entre
not Assigned(frmPrincIni) et Action := caFree
car Action := caFree libère les ressources mais ne desassigne pas la variable frmPrincIni donc
not Assigned(frmPrincIni) retourne false au lancement suivant de la fonction et la methode show plante car la form n'est pas initialisée.

bgK
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Affirmatif, après :

Action := caFree;

il faut mettre la vriable d'instance de la fiche à nil :
frmPrincIni := Nil;

Et là, c'est nickel !
May Delphi be with you.
Delphi advanced
Messages postés
131
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004

C'est super merçi

bgK