IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Information à propos de Lazreport et l'exception "SIGSEGV" version 1.44 ou 1.6 de Lazarus [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut Information à propos de Lazreport et l'exception "SIGSEGV" version 1.44 ou 1.6 de Lazarus
    J'utilise LazReport dans mon application sous WindowsXP, je n'ai aucun souci si j'utilise LazReport en
    déposant le composant "TfrReport" sur la forme de l'application.
    Avec par exemple le code ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.ButtonPrint1(Sender: TObject);
    begin
     Data.SQLQuery1.DisableControls;
     frDBDataSet1.DataSet := Data.SQLQuery1;
     frDBDataSet1.DataSource := Data.DataSource1;
     frReport1.LoadFromFile(CheminImpressions+'rangements.lrf');
     frReport1.ShowReport;
     Data.SQLQuery1.EnableControls;
    end;
    Mais, si je veux utiliser LazReport en programmation direct suivant cette exemple ci-dessous, sans utiliser le composant déposé sur la forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    procedure TForm1.ImpressionRequete;
    var
     frViewA: TfrView;
     frPageA: TfrPage;
     frBandViewA: TfrBandView;
     frReportA: TfrReport;
     Gauche,Bas, OffBas,Largeur,Hauteur, HauteurChar:integer;
    begin
     
    Gauche := 10;
    Bas:=32;
    Largeur:=740;
    Hauteur:=40;
    HauteurChar := 16;
    OffBas := 5;
     
    frReportA := TfrReport.Create(Self);
    frReportA.Pages.Clear;
    frReportA.Pages.Add;
    frPageA:=frReportA.Pages[0];
     
     
     frBandViewA := TfrBandView(frCreateObject(gtBand, '',frPageA));
     frBandViewA.SetBounds(Gauche,Bas,Largeur,Hauteur);
     frBandViewA.BandType := btReportTitle;
     frPageA.Objects.Add(frBandViewA);
     
     frViewA := TfrView(frCreateObject(gtMemo, '',frPageA));
     frViewA.SetBounds(Gauche,Bas+OffBas,Largeur,HauteurChar);
     frViewA.Memo.Add('Requête du: '+DateToStr(Date));
     
     TfrMemoView(frViewA).Font.Size := 10;
     TfrMemoView(frViewA).Font.Bold := True;
     TfrMemoView(frViewA).Alignment := taCenter;
     frPageA.Objects.Add(frViewA);
     
     Bas := Bas*3;
     
     frBandViewA := TfrBandView(frCreateObject(gtBand, '',frPageA));
     frBandViewA.SetBounds(Gauche,Bas,Largeur,Hauteur div 2);
     frBandViewA.BandType := btMasterData;
     frBandViewA.DataSet:='frDBDataSet1';
     frPageA.Objects.Add(frBandViewA);
     
     frViewA := TfrView(frCreateObject(gtMemo, '',frPageA));
     frViewA.SetBounds(Gauche,Bas+OffBas,Largeur,HauteurChar);
     frViewA.Memo.Add('[Data.SQLQuery1."ART_REFERENCE"]');
     frPageA.Objects.Add(frViewA);
     
     
     frViewA := TfrView(frCreateObject(gtMemo, '',frPageA));
     frViewA.SetBounds(Gauche+300,Bas+OffBas,Largeur,HauteurChar);
     frViewA.Memo.Add('[Data.SQLQuery1."ART_REFERENCE"]');
     frPageA.Objects.Add(frViewA);
     
     frReportA.ShowReport;
     
    end;
    Ce message d'erreur 'classe 'exception "External:SIGSEGV" s'affiche lors de la sortie de l'application

    Nom : ErreurSIGSEGV.jpg
Affichages : 358
Taille : 9,8 Ko

    Par contre en modifiant le fichier "LR_Class.pas" en commentant la ligne 9742 "FPages.free" je n'ai plus aucun souci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    destructor TfrReport.Destroy;
    begin
      if CurReport=Self then
        CurReport:=nil;
      FVal.Free;
      FVars.Free;
      FEMFPages.Free;
      FEMFPages := nil;
    //  FPages.Free;  
      FComments.Free;
      FreeAndNil(FDetailReports);
      FreeAndNil(FScript);
      inherited Destroy;
    end;
    Je comprends que "FPages.free" a déja été exécuté, je n'ai pas pour l'instant approfondi le problème.

  2. #2
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Patrick25300 Voir le message
    Mais, si je veux utiliser LazReport en programmation directe suivant cette exemple ci-dessous, sans utiliser le composant déposé sur la forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    procedure TForm1.ImpressionRequete;
    [...]
    frReportA := TfrReport.Create(Self);
    Je comprends que "FPages.free" a déja été exécuté, je n'ai pas pour l'instant approfondi le problème.
    Bonjour,

    Ici, le problème tient à la création elle-même. En fournissant Self comme paramètre, on rend la fiche principale propriétaire du composant et par conséquent responsable de sa libération. Or, il semblerait que le rapport s'autodétruise après utilisation : il y a donc bien deux appels à Free.
    La solution est d'utiliser le paramètre nil et tout rentre dans l'ordre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    frReportA := TfrReport.Create(nil);
    Cordialement,

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  3. #3
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut
    Merci gvasseur58 effectivement ça marche bien avec le paramètre "nil", c'est résolu

  4. #4
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut
    Bonjour

    Désolé ça ne suffit pas, en fait le paramètre "nil"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    frReportA := TfrReport.Create(nil);
    empêche la bande Master d'imprimer les données, si je remets le commentaire devant "// FPages.Free;"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    destructor TfrReport.Destroy;
    begin
      if CurReport=Self then
        CurReport:=nil;
      FVal.Free;
      FVars.Free;
      FEMFPages.Free;
      FEMFPages := nil;
    //  FPages.Free;  
      FComments.Free;
      FreeAndNil(FDetailReports);
      FreeAndNil(FScript);
      inherited Destroy;
    end;
    et "self" comme paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    procedure TForm1.ImpressionRequete;
    [...]
    frReportA := TfrReport.Create(Self);
    ça fonctionne, je vais utiliser "self", mais, mettre un commentaire dans mon code afin de ne pas oublier ce problème.

  5. #5
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Patrick25300 Voir le message
    Bonjour

    Désolé ça ne suffit pas, en fait le paramètre "nil"
    Désolé .
    Je n'ai pas essayé cette bibliothèque, car elle est toujours en développement intensif et semble poser quelques problèmes. Mais là, la manipulation est élémentaire : je vais essayer de me renseigner et faire quelques tests supplémentaires.

    Bon courage !

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  6. #6
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut
    Bonjour

    Merci gvasseur58 de tes réponses.

    LazReport qui est issu de FastReport est bien plus intéressant à mon gout que Rave Reports Borland Edition ou quickReport le plus c'est que l'utilisateur à la possibilité de modifier les rapports d'impression, aussi il est assez simple d'utilisation, merci à l'équipe de Lazarus.

  7. #7
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 953
    Points : 9 283
    Points
    9 283
    Par défaut
    hello,
    dans mon exemple de base de données sqlite présent dans les versions récentes de lazarus (lazarusxxxx\examples\database\image_mushrooms) j'utilise lazreport pour imprimer tous les champignons de la base :

    Nom : Lazarus_Db_Lazreport.jpg
Affichages : 464
Taille : 99,0 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  8. #8
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    Par curiosité, et puisqu'il semble qu'il y puisse y avoir plusieurs appels au destructor, pourquoi ne pas utiliser plutôt FreeAndNil ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      FreeAndNil(FPages);     // Au lieu de: FPages.Free;
    C'est d'ailleurs ce qui semble être utilisé pour d'autres propriétés (FDetailReports, FScript, y compris pour FEMFPages).

  9. #9
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par FChrisF Voir le message
    Par curiosité, et puisqu'il semble qu'il y puisse y avoir plusieurs appels au destructor, pourquoi ne pas utiliser plutôt FreeAndNil ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      FreeAndNil(FPages);     // Au lieu de: FPages.Free;
    C'est d'ailleurs ce qui semble être utilisé pour d'autres propriétés (FDetailReports, FScript, y compris pour FEMFPages).
    Bonjour,

    C'est une piste possible. Cependant, sauf bogue avéré de la bibliothèque, je chercherais en priorité à modifier le code de l'application plutôt que celui de la bibliothèque. D'autre part, si bogue il y a, j'ai bien peur que d'utiliser FreeAndNil ne servirait qu'à cacher un problème de conception. Je n'utilise pas lazreport pour le moment parce que j'ai l'impression - peut-être fausse - que l'ensemble connaît encore de petits problèmes et parce que je n'en ai pas besoin . Ami Calmant a raison de renvoyer à d'autres exemples qui fonctionnent afin de voir où se situe le problème.
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  10. #10
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 953
    Points : 9 283
    Points
    9 283
    Par défaut
    hello,

    Citation Envoyé par gvasseur58 Voir le message
    Ami Calmant a raison de renvoyer à d'autres exemples qui fonctionnent afin de voir où se situe le problème.
    Le problème c'est que mon exemple fonctionne avec des composants visuels de lazreport , ce qui ne pose apparemment pas de souci.

    L'idée à FChrisF :
    FreeAndNil(FPages); // Au lieu de: FPages.Free;
    me semble très intéressante car la procédure FreeAndNil est plus "propre" que free toute seule et ne provoque pas d'exception :
    FreeAndNil

    Free object if needed, and set object reference to Nil

    Declaration

    Source position: sysutilh.inc line 310

    procedure FreeAndNil(
    var obj
    );
    Description :

    FreeAndNil will free the object in Obj and will set the reference in Obj to Nil. T
    he reference is set to Nil first, so if an exception occurs in the destructor of the object, the reference will be Nil anyway.

    Errors :

    Exceptions that occur during the destruction of Obj are not caught.
    on peut exécuter plusieurs freeandnil de suite sur le même objet sans qu'il y ait d'exceptions.

    Il faudrait faire aussi la même chose pour FemFPages.
    D'après ce que j'ai pu voir le seul intérêt de Free par rapport à FreeAndNil est quand on veut réutiliser l'objet après. Ici ce n'est pas le cas puisque c'est la fin de l'application

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  11. #11
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Bonjour,

    @Ami Calmant

    Comme tu le rappelles toi-même, FreeAndNil restera silencieux. Trop souvent, c'est qu'après avoir libéré l'objet, on voudrait s'en servir.
    Voir par exemple cette discussion (en anglais) :

    Really, some would argue that in many cases (but not all), trying to use a variable of a freed object is a bug by itself.
    Mais aussi les commentaires de celle-ci (toujours en anglais).

    Sans rentrer dans un débat non tranché qui a agité les pascaliens de tout bord, il reste le reproche qu'on peut faire à FreeAndNil quoi qu'il arrive : cette procédure peut masquer un problème de conception, surtout quand on masque une exception. En gros, ça marche et on est content, jusqu'à un emploi qui fera réapparaître le problème .
    L'autre souci majeur est qu'ici la solution touche la bibliothèque elle-même, ce que je n'aime pas du tout : que se passera-t-il lors d'une mise à jour ? A moins d'avoir repéré un véritable bogue, ce qui est possible, mais reste à prouver...

    Cordialement,

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  12. #12
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    Sans vouloir polémiquer non plus sur le "FreeAndNil", ni présumer de l'utilisation correcte d'un LazReport en tant que composant créé dynamiquement, je pense qu'il est tout de même préférable d'utiliser un "FreeAndNil" plutôt que de commenter le "Free" problématique: cela aura au moins l'intérêt d'éviter les fuites mémoire.

  13. #13
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par FChrisF Voir le message
    Sans vouloir polémiquer non plus sur le "FreeAndNil", ni présumer de l'utilisation correcte d'un LazReport en tant que composant créé dynamiquement, je pense qu'il est tout de même préférable d'utiliser un "FreeAndNil" plutôt que de commenter le "Free" problématique: cela aura au moins l'intérêt d'éviter les fuites mémoire.
    Là, nous sommes bien d'accord
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [db4o] Quelles informations à propos de cet SGBDO ?
    Par diesel dans le forum Autres SGBD
    Réponses: 5
    Dernier message: 05/12/2006, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo