Erreur généré aléatoirement lors de chargement d'une form depuis une autre form

Résolu
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 - 13 mai 2005 à 14:36
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 - 16 mai 2005 à 14:07
Bonjour,



Je suis en train de faire une application de gestion des stocks sous delphi 7 avec access 2003.

Pour le moment je n'ai rien relié avec access, je ne m'occupe que de l'application.



J'ai une form authentification et une form menu principal (elle
contient un main menu et une toolbar pour un accès plus rapide à
certaines fonctions via des icônes).



=====================================================================

Voici le code :



form authentification quand je clique sur valider :

if frmMenuPrincipal = nil then

begin

Application.CreateForm(TfrmMenuPrincipal,frmMenuPrincipal);

frmMeunPrincipal.Show;

end

else

begin

frmMenuPrincipal.Show;

end;



frmAuthentification.Free;



form menu principal quand je clique dans le menu Fichier -> Changer d'utilisateur ou sur l'icône de la toolbar :
if frmAuthentification = nil then


begin


Application.CreateForm(TfrmAuthentification,frmAuthentification);


frmAuthentification.Show;


end


else


begin


frmAuthentification.Show;


end;





frmMenuPrincipal.Free;

======================================================================



Quand j'essaye de tester plusieurs fois le fait de passer de
l'authentification au menu principal (par le menu ou par l'icône de la
toolbar) j'ai une erreur qui apparaît aléatoirement. C'est-à-dire une
fois de suite, une autre fois au bouit de 5 clic, etc.



Cette erreur est une erreur de type eaccessviolation et je ne vois pas comment faire pour m'en sortir.



J'ai essayé de faire en pas à pas approfondi mais je n'arrive pas à cerner le problème.



Je pense qu'il doit y avoir un problème avec la fonction free car quand je l'enlève ça fonctionne.



Mais admettons que la form soit restée en mémoire et ne se soit pas détruite, alors avec mon if ça devrait le gérer.



Merci par avance pour l'aide que vous m'apporterez.

8 réponses

informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
16 mai 2005 à 14:07
Je n'y ai pas pensé de suite mais en plus c'est de cette façon que je
procédais sous visual basic 6 qui n'a pas l'option des forms
disponibles.



Pour conclure ce problème, je vais donc utilisé la méthode non
dynamique avec des show/hide/close et si ça prend trop de place en
mémoire ou que ça devient long en execution je passerais au dernier
code de manchester qui buggait le moins.



Je pense que le problème doit venir de ma version de delphi car manchester l'a apparement essayé chez lui et que ça marche.



Voilà en attendant je tiens à vous à vous remercier tous les deux pour m'avoir sorti d'un mauvais pas.



informatixo
3
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
13 mai 2005 à 23:07
En fait quand tu fee ron form le pointeur n'est pas toujours nil d'ou l'erreur...

Voici un code qui devrais marcher:

if not assigned(frmMenuPrincipal) then
Application.CreateForm(TfrmMenuPrincipal,frmMenuPrincipal);
frmMenuPrincipal.Show;
Freeandnil(frmAuthentification);

Bon Coding .... ManChesTer.
0
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
14 mai 2005 à 01:22
Je tiens à vous remercier pour l'aide que vous m'apportez.



J'ai essayé le code que vous m'avez donné mais ça continue de planter avec le message d'erreur suivant :



"Le projet Directstock.exe a provoqué une classe
d'exceptionEAccessViolation avec le message 'Violation d'accès à
l'adresse 004033BC dans le module 'Directstock.exe'. Lecture de
l'adresse 00990000'. Processus stoppé. Utilisez le Pas-à-pas ou
Exécuter pour continuer."



Depuis j'ai enlevé la barre outil et tout le code inutile pour ne
laisser que les 2 forms avec leur codes respectifs que vous m'avez
indiqué.



Ca plante aléatoirement au bout d'1 fois, 2 ou 3 fois. Je tiens à
préciser quand même que c'est soit une form ou l'autre qui déclenche
l'erreur (c'est-à-dire soit pendant le passage authentification vers
menu principal ou soit l'inverse).



Voici le nouveau code :



pour la form authentification :



================================================================

procedure TfrmAuthentification.cmdValiderClick(Sender: TObject);

begin

if not Assigned(frmMenuPrincipal) then

begin

Application.CreateForm(TfrmMenuPrincipal,frmMenuPrincipal);

frmMenuPrincipal.Show;

end

else

begin

frmMenuPrincipal.Show;

end;



FreeAndNil(frmAuthentification);

end;

=================================================================



pour la form menu principal :

=================================================================

procedure TfrmMenuPrincipal.MnuFichierChangerUtilisateurClick(

Sender: TObject);

begin

if not Assigned(frmAuthentification) then

begin

Application.CreateForm(TfrmAuthentification,frmAuthentification);

frmAuthentification.Show;

end

else

begin

frmAuthentification.Show;

end;



//frmAuthentification.txtIdentifiant.Text := '';

//frmAuthentification.txtMotDePasse.Text := '';

FreeAndNil(frmMenuPrincipal);

end;

=================================================================



Je précise que quand je met freeandnill en commentaire ça fonctionne
très bien, mais ce n'est pas intéressant car les 2 forms se voient et
restent en mémoire alors que j'en veux qu'une à la fois



Je commence à désespérer, j'espère ne pas devoir retourné au visual basic car delphi à l'air bien mieux.



Voilà, peut être y a t-il une autre piste à explorer ? Peut-être que je
me suis trompé dans l'ordre du free peut être faut-il que je le mette
avant le show ?
0
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
14 mai 2005 à 11:20
Le code suivant fonctionne parfaitement sous delphi 7 :

procedure TfrmAuthentification.cmdValiderClick(Sender: TObject);
begin
if frmMenuPrincipal=nil then
Application.CreateForm(TfrmMenuPrincipal,frmMenuPrincipal);
frmMenuPrincipal.Show;
if assigned(frmAuthentification) then
Freeandnil(frmAuthentification);
end;


procedure TfrmMenuPrincipal.MnuFichierChangerUtilisateurClick(
Sender: TObject);
begin
if frmAuthentification=Nil then
Application.CreateForm(TfrmAuthentification,frmAuthentification);
frmAuthentification.Show;
if assigned(frmMenuPrincipal) then
Freeandnil(frmMenuPrincipal);
end;

Si se code ne fonctionne pas c'est que lerreur est dans une autre partie du code.

Bon Coding .... ManChesTer.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
14 mai 2005 à 14:29
Le code suivant fonctionne parfaitement sous D6 et plante au bout de 6 fois sous D4...



J'ai utilisé les évènements ButtonClick pour la clarté.



Form MenuPrincipal:

procedure TfrmMenuPrincipal.Button1Click(Sender: TObject);

begin

if frmAuthentification = nil then

begin

Application.CreateForm(TfrmAuthentification, frmAuthentification);

frmAuthentification.Show;

end;

end;



procedure TfrmMenuPrincipal.FormShow(Sender: TObject);

begin

if not (frmAuthentification = nil) then

begin

//frmAuthentification.Free; // FreeAndNil n'existe pas

//frmAuthentification := nil; // sous D4

FreeAndNil(frmAuthentification);

end;

end;



Form Authentification :

procedure TfrmAuthentification.Button1Click(Sender: TObject);

begin

if frmMenuPrincipal = nil then

begin

Application.CreateForm(TfrmMenuPrincipal, frmMenuPrincipal);

frmMenuPrincipal.Show;

end;

end;



procedure TfrmAuthentification.FormShow(Sender: TObject);

begin

if not (frmMenuPrincipal = nil) then

begin

//frmMenuPrincipal.Free; // FreeAndNil n'existe pas

//frmMenuPrincipal := nil; // sous D4

FreeAndNil(frmMenuPrincipal);

end;

end;



Mais pourquoi donc se compliquer la vie à créer dynamiquement à chaque fois les forms ?



Bonne prog'



j@pee
0
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
14 mai 2005 à 15:46
Pour tester votre code j'ai créé un nouveau projet avec rien que les 2 forms le bouton et le menu.



J'ai quand même cette erreur qui persiste mais au bout d'un peu plus de temps cette fois.



J'ai oublier de dire que j'ai mis menu principal en fiche disponible.



Je tiens à préciser que j'ai essayé cette fois de me servir de
l'éxécutable sans passer par delphi et le debugger. J'ai toujours le
message d'erreur mais quand je clique ok au message d'erreur, je peux
quand même continuer. Peut-être que je passe d'une form à l'autre trop
rapidement et que mon ordinateur portable n'a pas le temps d'éxecuter
le code correctement ?



J'ai une idée que je ne sais pas réaliser mais comme le message
d'erreur n'est pas bloquant peut-être me faut -il l'intercepter et en
guise de gestion d'erreur ne rien faire comme celà il n'apparaîtrait
pas ?



En tous les cas merci de votre aide, ça marche chez vous alors peut-être ai-je un problème avec mon delphi ?
0
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
14 mai 2005 à 15:52
Merci japee de m'aider. Je vais essayer votre code.



Je les créé dynamiquement parce qu'il me semble qu'ainsi j'aurais un
logiciel moins lourd en pourcentage de ressource mémoire utilisé et
qu'il sera plus rapide.



Sinon quelle autre alternative proposeriez vous ?
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
14 mai 2005 à 16:50
Je te propose la manière "basique" :



Tu crées tes forms en phase de conception.

A l'exécution, au lieu de les détruire quand tu n'en a plus besoin, tu
les fermes ou tu les caches, ce qui revient sensiblement au même me
semble-t'il au niveau de la mémoire utilisée, mais à vérifier.

Quoi qu'il en soit, à la conception, tu ne touches pas à la propriété
"visible := false" des fiches secondaires (c'est la valeur par défaut).
Ainsi, elles n'apparaîtront pas tant que tu ne les as pas appelées.

Au lancement de l'application, seule la fiche premièrement créée apparaît.



La procédure classique pour appeler une fiche secondaire est:



(en admettant que fiche principale est Form1 et fiche secondaire Form2)

Form2.ShowModal; // la fiche principale est "gelée" tant que tu n'as pas refermé Form2

Form2.Show; // la fiche principale peut reprendre le focus



Et pour la refermer :



(code à placer sur Form2)

Close // inutile de préciser Form2

Hide // la fiche est seulement rendue invisible



(ou à placer sur fiche principale Form1, à condition d'avoir utilisé "Show" précédemment...)

Form2.Close; // fermeture

ou

Form2.Hide; // Form2 invisible



C'est peut-être un peu confus ?

Alors démonstration avec 2 Forms et 1 Button sur chacun :



--------------------------------------------------------



var

Form1: TForm1;



implementation



uses Unit2;



{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);

begin

Form2.ShowModal; // ou Form2.Show;

end;



--------------------------------------------------------



var

Form2: TForm2;



implementation



uses Unit1;



{$R *.DFM}



procedure TForm2.Button1Click(Sender: TObject);

begin

Form2.Close;

Form1.Show;

end;



procedure TForm2.FormShow(Sender: TObject);

begin

Form1.Hide;

end;



--------------------------------------------------------



On fait pas plus simple et là pas de plantage, c'est garanti !



Bonne prog'



j@pee
0
Rejoignez-nous