begin process at 2010 03 20 16:38:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Débutant(e)

 > 

Probleme de Violation d'accès


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme de Violation d'accès

mardi 10 octobre 2006 à 14:33:15 | Probleme de Violation d'accès

Mr7Bungle

Bonjour et merci de bien vouloir preter attention à mon petit soucis =)

Voila, j'ai créer un programme utilisant plusieurs fenetres différentes deja créées à l'aide de l'interface graphique de Delphi7.


program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

begin
  Application.Initialize;
  Application.Title := 'ProcessTest';
  Application.CreateForm(TForm1, Form1);
  //Application.CreateForm(TForm2, Form2);
  //Application.CreateForm(TForm3, Form3);
  Application.Run;
end.


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.....

Merci d'avance pour votre aide !



mardi 10 octobre 2006 à 16:14:45 | Re : Probleme de Violation d'accès

cirec

Membre Club Administrateur CodeS-SourceS
Salut,
essaye déjà de fermer ton application par un simple :
Form1.Close;

 
@+
Cirec

mardi 10 octobre 2006 à 16:36:26 | Re : Probleme de Violation d'accès

Mr7Bungle

Merci de ta reponse ! mais malheureusement, ça ne fonctionne pas,
j'ai remplacé

form1.destroywindowhandle;
application.terminate;

par :

form1.close;

et donc oui ça ferme l'application mais l'erreur de violation d'accès est toujours présente....

Mais merci tout de même =)


mardi 10 octobre 2006 à 19:19:41 | Re : Probleme de Violation d'accès

Emandhal

u,
Et en pas à pas ca donne quoi?

Tout problème a sa solution... Mais en général, celle que l'on trouve n'est jamais la bonne...

mardi 10 octobre 2006 à 19:42:19 | Re : Probleme de Violation d'accès

cantador

Membre Club

création de forme non automatique :

  Screen.Cursor := crHourGlass;
  if not Assigned(form2) then
    Application.CreateForm(Tform2, form2);
  Screen.Cursor := crDefault;
  form2.ShowModal (ou Show)

Pour la violation d'accès, il faut être prudent, quelquefois on croît que cela vient de là et en fait..

peut-être vaudrait t-il mieux joindre le code complet ?

cantador

mardi 10 octobre 2006 à 21:06:31 | Re : Probleme de Violation d'accès

Delphiprog

Administrateur CodeS-SourceS

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 !


Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

mardi 10 octobre 2006 à 21:52:42 | Re : Probleme de Violation d'accès

f0xi

Membre Club Administrateur CodeS-SourceS


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 :

Form1.Close ->
Form1.OnCloseQuery ->
si CloseQuery : Form1.DoClose ->
Form1.OnClose ->
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é.


Croc (click me)
mardi 10 octobre 2006 à 22:16:31 | Re : Probleme de Violation d'accès

Mr7Bungle



Et bien merci à vous pour vos reponses complètes et la leçon de gestion de fenêtres, j'en avais besoin !!

Effectivement je m'y suis pris un peu brutalement...
je test ça demain dans la matinée mais je pense que ça devrait aller mieux =)

Merci encore.
mercredi 11 octobre 2006 à 08:54:29 | Re : Probleme de Violation d'accès

Mr7Bungle

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

merci encore.




mercredi 11 octobre 2006 à 09:25:10 | Re : Probleme de Violation d'accès

simonpelloquin

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...

Simon

1 2

Cette discussion est classée dans : application, form2, form1, violation, createform


Répondre à ce message

Sujets en rapport avec ce message

thread et application.createform [ par bundyboss ] Salut, je voudrai placer "application.createForm(Form1, Form1)" dans un thread mais j'arrive pas.Je ne peux rien placer non plus dans les uses?Aider m Application.Mainform [ par Taktaky ] Salutj ai 3 Forms : Form1, Form2, Form3MainForm est Form1 (pour le moment)Mais je voudrais changer:  la Form2 :=  mainFormmais la Form1 dois demarer l [application] Access violation lors de l'ouverture d'une nouvelle fenetre. [ par fanxat ] Bonjour, j'ai un gros soucis, dan le cadre de mon projet on doit faire un jeu. On a donc crée un menu qui permet de choisir le mode de jeu  ainsi que Probleme XPManifest et fiches dans DLL [ par fade96 ] Voila mon problememon appli qui execute mes fonctions et procedures de ses dll produit une erreur a sa fermeture (exclusivement si j'ouvre une fiche d probleme avec ajout d'1 2eme form [ par dk ] depuis qq temps je me confectionne un petit programme qui tient sur un seul formulaire (form1) mais maintenant j'aimerais ajouter qq options supplemen Prob' bizarre. [ par Becracker ] J'ai rencontré un prob bizarre. J'ai deux forms : form1 et form2. J'aim mis un bouton sur form1 avec le code begin form2.show; end; et bizarrement i probleme avec fenêtre showmodal [ par philpas ] bonjour, j'ai un problème que j'arrive pas à résoudre avec la fenêtre showmodal.j'ai 3 fenetres. form1 form2 et form31) dans form1 (fiche principal) j Erreur de compilation au niveau du projet [ par Francky23012301 ] Salut à tous, quand je veux compiler mon projet, une erreur estr signalée par le compilateur. Voila la source : program Project1; uses Forms, Renommer des unités, comment faire? [ par RonnyZZZ ] J'ai voulu renommer des unités, en commencant par une (pour voir...), afin que mon application soit plus claire à mes yeux.Pour ce faire, je sauve sou DRAG AND DROP [ par minipod ] Très clairement: j'ai deux Form: Form1 et Form2 j'ai 2 RichEdit: RichViewEdit1 et RichViewEdit2 (composants trouvés sur trichview.com)sur Form1 j'ai R


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales