Application MDI

Signaler
Messages postés
18
Date d'inscription
mercredi 17 juillet 2002
Statut
Membre
Dernière intervention
11 août 2003
-
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
-
Salut à tous,
Je cré une application MDI, la fenêtre principal est mis comme FormStyle= fsMDIForm, mais j'aimerai mettre toutes les fenêtres dont FormStyle= fsMDIChild dans une DLL.
Dans la DLL elles sont mise sur FormStyle= fsMDIChild mais quand j'exécute je reçois le message d'erreur:
"Exception class EInvalidOperation with message 'Cannot create form. No MDI forms are currently active.'....
Voici le code qui fait appelle à la DLL

procedure TMainForm.Messagerie1Click(Sender: TObject);
var
DLLHandle: THandle;
AffichMess:procedure(Sender: TObject); stdcall;
begin
DLLHandle:= LoadLibrary('DllMessgerie.dll');
if DLLHandle= 0 then
ShowMessage('Erreur dans le chargement de la DLL');
AffichMess:= GetProcAddress(DLLHandle, 'AffichMess');
AffichMess(MessagerieForm);
end;

Merci pour votre aide.

Jeankiki

7 réponses

Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Salut !!

D'une, y a juste un petit problème qui pourrait entrainer une "erreur fatale" dans certain cas :

tu as mis :

if DLLHandle= 0 then
ShowMessage('Erreur dans le chargement de la DLL');
AffichMess:= GetProcAddress(DLLHandle, 'AffichMess');
AffichMess(MessagerieForm);

Donc, si jamais la DLL n'était pas chargée pour une quelconque erreur, le prog essaiera quand même d'utiliser la procedure AffichMess... pour palier à ce problème, tu peux utiliser un bloc "Try" avec un "Except" à la fin, ou mettre "if DLLHandle= 0 then
begin
ShowMessage('Erreur dans le chargement de la DLL');
Exit;
end;"

Sinon, pour ton "vrai" problème, il faudrait d'après moi que tu éclaircisses deux trois trucs : à quoi correspond "MessagerieForm" ? Si le paramètre de AffichMess est bel et bien Sender, alors c'est "MainForm" qu'il faut donner... Je me trompe ?
A moins que MessagerieForm soit elle aussi en "fsMDIForm"...
Peut-être pourrais-tu donner la partie du code de AffichMess qui ouvre la fenêtre ?

Voilà... J'espère avoir bien compris ce que tu demandais, et t'avoir aidé un peu !
Bestiol.
Messages postés
18
Date d'inscription
mercredi 17 juillet 2002
Statut
Membre
Dernière intervention
11 août 2003

Merci pour ton aide, MessagerieForm est
var
MessagerieForm: TForm;

voici le code de AffichMess

procedure AffichageMessagerie(Sender: TObject);
begin
MessagerieForm:= TMessagerieForm.Create(Application);
end;

exports AffichageMessagerie name 'AffichMess';

Jeankiki
Messages postés
89
Date d'inscription
jeudi 11 avril 2002
Statut
Membre
Dernière intervention
3 juillet 2003

Je vois que tu travsaille bien sur notre projet!
Aller, Bon courage!
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Salut !!

Peut-être vais-je dire une bétise, mais ne devrais-tu pas remplacer "TMessagerieForm.Create(Application);" par "TMessagerieForm.Create(Sender);"

Ainsi, d'après moi (je ne peux malheureusement pas faire de test !), la form sera bien créée avec pour parent la form que tu as passé en paramètre de ta procédure... il faut donc bien que tu passes MainForm en paramètre de AffichMess dans ton prog...
Bien sûr, ta form MessagerieForm doit être en fsMDIChild, ce que tu as déjà fais, si j'ai bien compris !

Voilà, essaie ça et dit moi comment ça se présente, stp !!

Bestiol.
Messages postés
18
Date d'inscription
mercredi 17 juillet 2002
Statut
Membre
Dernière intervention
11 août 2003

Non cela ne vas pas car Sender est de type TObject et TMessagerieForm est de type TForm ;)
Merci quand même
Jeankiki
Messages postés
18
Date d'inscription
mercredi 17 juillet 2002
Statut
Membre
Dernière intervention
11 août 2003

Merci mais tu sais je n'ai pas encore fait grand chose, mais bon j'y travaille
Jeankiki
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Rien ne t'empêche de changer les paramètres de ta procédure ! :)

Bestiol.