Les form2 et 3 ne sont pas créer au lancement du programmes, et je désire pouvoir les créer en fonction d'un quelquonc événement (clic sur boutton ou autre...).
Je m'y prend ainsi :
application.CreateForm(Tform2,form2);
form2.show;
et pour quitter la form2 : form2.destroywindowhandle.
Je reviens sur la form1 et lorsque je veut quitter le programme ainsi :
form1.DestroyWindowHandle;
application.terminate;
Et bien j'ai le droit à une belle erreur de violation d'accès.....
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 10 oct. 2006 à 21:06
Quand tu écris :
Application.CreateForm(Tform2, form2);
L'objet Application devient propriétaire de form2 et est donc responsable de sa destruction.
Or, avant la fin de d'application, tu détruis le handle de la fenêtre form2 (form2.destroywindowhandle).
Donc, quand l'application se termine, elle transmet à Windows un handle complètement farfelu.
Voilà ce que c'est que de vouloir utiliser des méthodes dont on ne maîtrise pas la portée.Comme l'a écrit Cirec, ferme simplement tes fenêtres par un appel à Close ou Release et tout ira mieux.
May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 10 oct. 2006 à 21:52
premierement, pourquoi ne pas laisser les fiches etre créées puis les appelées avec Show.
elle ne seront pas visible de toute façons.
deuxiement, on ne ferme pas une fenetre en appelant DestroyWindowHandle mais Free comme pour tout les objets, a condition bien sur qu'on gere la creation et destruction.
le mieux etant d'appeler Form.Close qui genere toute une suite d'evenement qui sont utile pour la procedure de destruction de la fiche.
troisiement, on ne quitte jamais une application en appelant Application.Terminate ou encore Halt(0) directement mais bien en appelant la methode "Close" de la fiche principale, encore une fois, dans un soucis de declancher la suite d'evenement necessaire a la destruction de l'application (OnClose, OnDestroy).
Application.Terminate reviens a tuer le processus via le gestionnaire des taches, ce n'est pas une methode propre et adaptée pour quitter d'une façon normale une application. Les evenements OnClose et OnDestroy etant necessaire pour detruire les instances d'objets ou de pointeurs créés dynamiquement et non géré par l'une des fiches.
en somme en appelant Form1.Close on declanche ceci :
liberations/evenement de fermeture gérées par le developeur -> si Form1 fiche modal : Modalresult mrCancel -<si Form1 fiche MDIChild : action Minimize -<
si Form1 = fiche principale : Application.Terminate ->
si CallTerminateProcs : PostQuitMessage(0);
Liberation gérées par le systeme ->
Form1.Destroy ->
Form1.OnDestroy ->
liberations gérées par le developeur
si on appel directement Application.Terminate on saute donc toutes ces etapes importantes de verification et de liberation, du moins de preparation a une fermeture du programme.
ce qui peu empecher la liberation de ressources, la remise a zero de parametres, la sauvegarde de travail ect...
vus qu'on gere ces problemes dans le gestionnaire OnCloseQuery/OnClose et non dans OnDestroy qui ne sert qu'a liberer des objets dynamique ou des ressources bien qu'ils puissent figurer aussi dans OnClose.
en gros :
tu laisse ton projet tel quel (creation de fiche a la creation de la principale)
pour fermer une fiche tu appel FormX.Close, pour l'ouvrir FormX.Show (ou ShowModal)
pour quitter le programme tu appel FormP.Close (fiche principale)
pour ce qui est des violations d'accés, c'est en general un probleme d'allocation de ressources par exemple a la creation d'un objet ou d'un transtypage ou encore de la lecture/ecriture sur un pointeur/instance non alloué ou erroné.
Mr7Bungle
Messages postés17Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention30 octobre 2007 11 oct. 2006 à 08:54
Le fait de créer toutes les fenêtres au debut de l'application ne risquerai pas de surcharger le systeme ?
c'est pour ça que je voulais créer les pages au fur et à mesure suivant le besoin car j'ai 35fenêtres dans mon appli .....
Merci de bien vouloir m'apporter quelques précisions à ce sujet
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 11 oct. 2006 à 09:25
Mr7Bungle,
Partant de la même réflexion que toi, il m'arrive pour économiser la machine de créer les forms à la volée :
Application.Createform(...);
Try
MaForm.Show; (ou ShowModal)
Finally
MaForm.Release;
end;
Maitenant, est-ce que l'économie est vraiment conséquente ??? En tout
cas, à chaque fois que la form est appelée, tu n'as pas à réinitialiser
tous les contrôles de la fiches...
Donc je créé mes pages au démarrage de l'application, je créé les fiches en même temps que la fiches principale
Pour ouvrir form2 :
procedure TForm1.Button3Click(Sender: TObject);
begin
form2.show;
end;
Pour la fermer :
procedure TForm2.Button1Click(Sender: TObject);
begin
form2.close;
end;
et pour quitter l'application :
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.release;
end;
cette méthode fonctionne mais ne stop pas l'application
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.close;
end;
Et celle ci me renvoie toujours une violation d'accès.
Et deuxième essai, en créant les form 2 et 3 dans la propriété formload de ma form1 (principale), et là, au lancement c'est la form2 qui se lance (alors que je ne fais que l'a crée, pas l'afficher) et la form1 qui aurai du apparaitre n'apparait pas.....
J'éspère avoir été clair , à mon avis il y a quelques points que j'ai mal compris, merci de m'apporter vos lumières =)
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 11 oct. 2006 à 10:50
Euuhhh....
Il semblerait donc que ta form principale soit la form1. Donc, pour
fermer l'application, tu as juste besoin de faire un close sur la
form1... normalement le release sur les autres forms est fait tout
seul... (enfin il me semble)
Pour ouvrir form2 :
procedure TForm1.Button3Click(Sender: TObject);
begin
form2.show; (Le "Showmodal" est pas mal
aussi dans la mesure où il interdit l'accès à la form1 tant que la
form2 n'est pas fermée)
end;
Pour la fermer :
procedure TForm2.Button1Click(Sender: TObject);
begin
form2.close;
end;
et pour quitter l'application :
procedure TForm1.Button1Click(Sender: TObject);
begin
<strike>form1.release;
</strike>Close; (tout simplement... ou bien "Application.Terminate" si la form2 est toujours ouverte)
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 11 oct. 2006 à 14:17
Je n'y comprends pas grand chose...
-Est-ce que tu as un événement Form1.OnFormClose ? Si oui, peut-on en disposer ?
-As-tu essayé avec Application.Terminate ?
Sinon, est-ce que c'est pas ton ordi ou ta version de delphi qui pose
problème (parce que des "form.Close" j'en fais tous les jours sans
problème...) ?
Je sais pas si tu as mis en ligne l'intégralité de ton code, mais à mon
avis, ça vient d'autre chose que le form.close... peut être un truc en
cours d'utilisation et qui n'a pas été fermé ou libéré...
Mr7Bungle
Messages postés17Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention30 octobre 2007 11 oct. 2006 à 14:43
Merci encore pour vos reponses !!!
Finalement l'erreur n'avez rien à voir avec la création et la fermeture des fenêtres, mais avec un composant mal configuré : SkinData .
Effectivement se genre d'erreur (violation d'accès) est tres tres vague....
N'existe-t-il pas d'outils permettant de débugger ce genre d'erreur plus rapidement? , un outils qui apporterai des précisions lors d'une violation d'accès? car se serai tout de même pas de temps de gagné.