informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 2012
-
13 mai 2005 à 14:36
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 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).
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.
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 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.
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 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);
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 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).
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 ?
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 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 ?
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 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.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 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 :