Utilisation des Fiches (TForm) avec message d'erreur violation d'accès [Résolu]

Signaler
Messages postés
3
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
3 juillet 2010
-
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
-
Salut tout le monde,
J'ai conçu une application (MainMenuForm)
Pour imprimer un état, je fais appel impression.Show (impression est une forme). Avec cette forme l'utilisateur a le choix d'imprimer directement (Report1.Print) ou de prévisualiser l'état. La prévisualisation personnalisée est appelée dans la forme avec prévisu.Show(previsu est une forme) et Report1.Preview (QuickReport). Quand je ferme , avec il n'y a pas d'erreur et reprend la main. Quand je ferme , il n'y a pas d'erreur. Mais quand je quitte l'application <MainMenuForm,Application.Terminate> je reçois un message "violation d'accès à l'adresse 00522CDD".


Voici à peu près l'ossature des codes
// forme principale contenant le menu qui appelle forme impression
unit MainMenuForm
uses impression;

procedure MainFormMenu.Imprimer(Sender:TObject);
begin
Impression.Show;
end;
end.

//Forme pour choix imprimer ou prévisuliser
unit Impression
uses MainMenuForm,Previsu,Report1;

procedure Impression.Previsiualiser(Sender:TObject)
begin
Previsu.Show;
Report1.Preview;
end;
end.

//Forme pour prévisualiser personalisé
unit previsu
uses Report1;

procedure previsu.Fermer(Sender:TObject);
begin
close;
end;
end.

Pouvez-vous m'indiquer l'endroit où se trouve l'erreur quand après prévisualisation je quitte l'appication ?
Merci de vos promptes réactions.
Merci

7 réponses

Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
Salut.
Quelques recommandations :
- les forms impression et previsu devraient être ouvertes en ShowModal et non en Show simple.
- Ne pas déclarer les unités de Forms (ou incluant une référence à une Form) dans le uses général de l'unité, mais juste après implementation.

unit MainMenuForm;
//...
implementation
uses impression;

- Ne pas utiliser Application.Terminate pour une application visuelle. Il suffit de fermer la form principale du programme(Close).

A +
Thierry
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Salut,

déjà il faudrait savoir ou se déclenche cette erreur "00522CDD" .. pour ce faire:

tu charges le DPR dans l'IDE si ce n'est pas encore fait. Tu mets un point d'arrêt sur la première ligne:
Application.Initialize;

et tu lances le projet "F9" ... le prog démarre et s'arrête aussitôt ---> dans l'IDE
Menu "Chercher" ---> "Erreur d'exécution..."
et dans la zone de saisie tu rentres l'adresse de l'erreur "00522CDD" --->"Ok" et te voilà sur la ligne correspondante à l'adresse.

[hr]@+Cirec
[hr]
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
@Cirec : quel smiley rageur !
@yannba: tu peux faire confiance à Cirec, j'ai d'ailleurs fait le même test avant de poster mon message. Pour les fenêtres ouvertes par Show simple, elles se fermeront automatiquement au Close de la fenêtre principale (même si elles sont "hide").

Je rappelle à notre ami allmight qu'il serait bon de nous dire si son problème est résolu ou non !

A +
Thierry
Messages postés
133
Date d'inscription
mercredi 4 janvier 2006
Statut
Membre
Dernière intervention
7 septembre 2010

Salut,

- Ne pas utiliser Application.Terminate pour une application visuelle. Il suffit de fermer la form principale du programme(Close).

Vu que j'utilise toujours cette instruction, Pourquoi ??

Merci
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
tout simplement parce que "Application.Terminate" est, ce qu'on pourrait appeler, un arrêt brutal de l'application.

Un simple teste te le démontrera.
sur un nouveau projet tu places deux boutons et tu complètes comme suit:
[hr]procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

[b]begin
  /bShowMessage('Close Event');
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
[b]begin
  /bShowMessage('Close Query Event');
end;

procedure TForm1.btn_CloseClick(Sender: TObject);
[b]begin
  /bClose;
end;

procedure TForm1.btn_TerminateClick(Sender: TObject);
[b]begin
  /bApplication.Terminate;
end;



[hr]@+Cirec
[hr]
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
arf ... trop lent


[hr]@+Cirec
[hr]
Messages postés
133
Date d'inscription
mercredi 4 janvier 2006
Statut
Membre
Dernière intervention
7 septembre 2010

Ok je vais voir de ce pas vos lies et tester le prog de cirec.

Je pensais que Application.terminate permettait de forcer la fermeture de toutes les Form meme si elles sont ouvertes ou cachées (instruction hide) ou si elles ont été apellées par un show au lieu de showmodal (et qu'on aurait oublié de fermer).