Crash à la fermeture d'une application Delphi Xe2

cs_Pierre95870 Messages postés 16 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 25 août 2012 - 25 août 2012 à 19:46
SISKODS9 Messages postés 6 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 19 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; 
 


Une image de l'endroit ou se produit le problème:

http://imageshack.us/photo/my-images/194/erreurf.png/

Uploaded with ImageShack.us

Pourrais-je avoir votre aide sur ce point?

Merci par avance
Pierre

1 réponse

SISKODS9 Messages postés 6 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 19 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.

Bon courage
0
Rejoignez-nous