cs_Pierre95870
Messages postés16Date d'inscriptionmardi 11 novembre 2008StatutMembreDernière intervention25 août 2012
-
25 août 2012 à 19:46
SISKODS9
Messages postés6Date d'inscriptionmardi 18 octobre 2005StatutMembreDernière intervention19 septembre 2012
-
20 sept. 2012 à 06:47
Bonjour,
Je travaille sur une application qui crée (entre autres) des états QuickReport (sans lien avec un BD).
J'ai créé un état composite qui regroupe ces états et qui est prévisualisé à partir d'un bouton.
Mon soucis est que la visualisation se fait correctement, mais, après avoir fermé la fenêtre de Preview, Lorsque je veux quitter le programme j'ai une violation d'accès.
Elle a lieu uniquement si je visualise cet état composite.
Ici le code de l'état composite (QuickReport 5.05.1)
unit FlightPack;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, QRCtrls,
QuickRpt, QRPrntr, Printers;
type
TForm11 = class(TForm)
QRCompositeReport1: TQRCompositeReport;
QuickRep1: TQuickRep;
DetailBand1: TQRBand;
PageFooterBand1: TQRBand;
procedure QRCompositeReport1AddReports(Sender: TObject);
procedure QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form11: TForm11;
implementation
{$R *.dfm}
Uses Main, Unit1, FuelSheet, Balance, Report, CartonF, CartonE,
CartonFatt, DistribF, Cover;
procedure TForm11.QRCompositeReport1AddReports(Sender: TObject);
begin
with QRCompositeReport1.Reports do
begin
Add(Form12.QuickRep1);
Add(Form4.QuickRep1);
Add(Form10.QuickRep1);
Add(Form5.QuickRep2);
Add(Form7.QuickRep3);
Add(CartonAFr.QuickRep1);
Add(Form6.QuickRep1);
end;
end;
procedure TForm11.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
with QRCompositeReport1.PrinterSettings do
if PrinterIndex <> printer.printerIndex then
PrinterIndex := printer.printerIndex;
end;
end.
Et ici, le code d'impression dans la fiche principale:
procedure TForm3.Action3Execute(Sender: TObject);
begin
if PrintDialog1.Execute then
Form11.QRCompositeReport1.Print;
end;
Enfin, le code de fermeture du programme (à toute fin utile)
procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var i : integer;
Ini : TIniFile;
Edit : TEdit;
Combo : TComboBox;
begin
case Dialogs.Messagedlg('Save data before exit?',mtConfirmation,[mbYes, mbNo
, mbCancel], 0, mbYes) of
mrYes:
begin
Ini := TIniFile.Create(extractFilePath(application.exename)
+ 'Parameters.tdb');
try
//parcourir les composants sur le Panneau
for i :=0 to ComponentCount - 1 do
begin
//si le composant trouvé est du type recherché
if (Components[i] is TEdit) then
begin
Edit := TEdit(Components[i]);
if (Edit.Name <> 'EdDeparture') or (Edit.Name <> 'EdDestination') or
(Edit.Name<> 'CompRoute') then
Ini.WriteString('DATA', Edit.Name, Edit.Text);
end;
If (Components[i] is TComboBox) then
begin
Combo := TComboBox(Components[i]);
Ini.WriteInteger('DATA', Combo.Name,Combo.ItemIndex);
end;
end;
finally
Ini.Free;
end;
end;
mrCancel:
begin
CanClose:= False;
exit;
end;
end;
Liste.Free;
AD.Free;
Runways.Free;
Pistes.Free;
Intersec.Free;
Inter.Free;
ClearStop.Free;
Clear.Free;
Obstacles.Free;
Obst.Free;
LNoise.Free;
LBruit.Free;
LPoints.Free;
Lst.Free;
WXStations.Free;
WXSt.Free;
WXStID.Free;
Wxpoint.Free;
FuelProf.Free;
IndxFuel.Free;
FuelDist.Free;
HoldFuel.Free;
aList.Free;
With TMemIniFile.Create('FuelProfile.tdb') do
begin
Free;
end;
Application.Terminate;
end;
SISKODS9
Messages postés6Date d'inscriptionmardi 18 octobre 2005StatutMembreDernière intervention19 septembre 2012 20 sept. 2012 à 06:47
Un crash peut avoir de multiple causes.
- Si le message d'erreur parle d'une adresse "proche de nil" avec beaucoup de zéros cela peut être du à une instance d'objet nil
- Ce genre de plantage peut aussi venir du fait que l'on continue à utiliser même indirectement un objet détruit (Je vois beaucoup de Free dans le code)
- Une suggestion est de mettre une grande partie de ton code en commentaire, d'affiche ta fenêtre "presque à vide" et de "décommenter" le code au fur et à mesure, pour voir le bloc de code qui peut poser problème.
C'est ce que fait dans ce genre de cas, quand c'est possible.