cs_bgK
Messages postés131Date d'inscriptionvendredi 7 juin 2002StatutMembreDernière intervention19 janvier 2004
-
23 juin 2002 à 18:55
cs_bgK
Messages postés131Date d'inscriptionvendredi 7 juin 2002StatutMembreDernière intervention19 janvier 2004
-
26 juin 2002 à 11:43
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...
cs_bgK
Messages postés131Date d'inscriptionvendredi 7 juin 2002StatutMembreDernière intervention19 janvier 2004 23 juin 2002 à 21:05
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;
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 23 juin 2002 à 21:57
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.
cs_lebot
Messages postés3Date d'inscriptionmercredi 29 mai 2002StatutMembreDernière intervention24 juin 2002 24 juin 2002 à 06:10
-------------------------------
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_lebot
Messages postés3Date d'inscriptionmercredi 29 mai 2002StatutMembreDernière intervention24 juin 2002 24 juin 2002 à 06:10
-------------------------------
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...
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 24 juin 2002 à 20:07
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);
cs_bgK
Messages postés131Date d'inscriptionvendredi 7 juin 2002StatutMembreDernière intervention19 janvier 2004 24 juin 2002 à 21:05
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 ?)
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 24 juin 2002 à 23:15
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;
cs_bgK
Messages postés131Date d'inscriptionvendredi 7 juin 2002StatutMembreDernière intervention19 janvier 2004 25 juin 2002 à 09:32
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.