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

informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 13 mai 2005 à 14:36 - Dernière réponse : informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 16 mai 2005 à 14:07
3
Merci
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

Merci informatixo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de informatixo
cs_ManChesTer 378 Messages postés vendredi 20 octobre 2000Date d'inscription 11 décembre 2013 Dernière intervention - 13 mai 2005 à 23:07
0
Merci
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.
Commenter la réponse de cs_ManChesTer
informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 14 mai 2005 à 01:22
0
Merci
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 ?
Commenter la réponse de informatixo
cs_ManChesTer 378 Messages postés vendredi 20 octobre 2000Date d'inscription 11 décembre 2013 Dernière intervention - 14 mai 2005 à 11:20
0
Merci
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.
Commenter la réponse de cs_ManChesTer
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 14 mai 2005 à 14:29
0
Merci
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
Commenter la réponse de japee
informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 14 mai 2005 à 15:46
0
Merci
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 ?
Commenter la réponse de informatixo
informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 14 mai 2005 à 15:52
0
Merci
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 ?
Commenter la réponse de informatixo
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 14 mai 2005 à 16:50
0
Merci
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
Commenter la réponse de japee

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.