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 :

Crash lors d'un TOpenDialog.Execute : inacceptable s'agissant d'un fondamental de la LCL [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 343
    Points : 536
    Points
    536
    Billets dans le blog
    2
    Par défaut Crash lors d'un TOpenDialog.Execute : inacceptable s'agissant d'un fondamental de la LCL
    Bjr à vous,

    Je vous fais part d'un bug inacceptable de la LCL, s'agissant d'un fondamental censé être testé et validé.
    Environnement:
    Un Linux Mint 32 bit tout neuf et mis à jour

    Lazarus 2.0.6 et fpc 3.0.4 tout frais
    Window manager: xfce
    Soit une fiche principale avec un menu Fichier -> Ouvrir.
    L'item de menu est associé à un TAction nommé acOpen

    Je crée un TOpenDialog d'ouverture de fichier, à la volée, tel que je le pratique depuis 15 ans

    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
     
    procedure TRPIMainWnd.acOpenExecute(Sender: TObject);  
    begin
     with TOpenDialog.Create(Application) do
      begin
        try
          InitialDir := ExtractFilePath(ParamStr(0)); // dossier de l'exécutable
          Filter := 'GHTopo XTB|*.xtb';
          if (Execute) then // <-- crash !!!
          begin
            // traitement
            ShowMessage(FileName);
          end;
        finally
          Release;
        end;
      end;    
    end;
    et j'obtiens un crash au droit du Execute, avec les messages suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    The program 'GHTopoRPI' received an X Window System error.
    This probably reflects a bug in the program.
    The error was 'BadWindow (invalid Window parameter)'.
      (Details: serial 5414 error_code 3 request_code 12 minor_code 0)
      (Note to programmers: normally, X errors are reported asynchronously;
       that is, you will receive the error a while after causing it.
       To debug your program, run it with the --sync command line
       option to change this behavior. You can then get a meaningful
       backtrace from your debugger if you break on the gdk_x_error() function.)
    ce qui est parfaitement inacceptable, s'agissant quand même d'un fondamental !!!

    La seule parade est de lancer l'application avec le paramètre --sync

    Comment peut-on accepter de tels dysfonctionnements entraînant crises de nerfs, pertes de temps ???

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 720
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 720
    Points : 15 106
    Points
    15 106
    Par défaut
    Bonsoir,

    Je ne sais pas si ça va te rassurer/faire plaisir, mais avec ma vieille 1.4.0 / fpc 2.6.2 sous Linux Debian 7.0 / 32bits et Lxde, ça fonctionne : me suis contenté à la va-vite de rajouter un bouton sur un projet en cours d'étude et d'y coller ton code avec une microscopique modif au niveau du filtre :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with TOpenDialog.Create(Application) do
       begin
         try
           InitialDir := ExtractFilePath(ParamStr(0)); // dossier de l'exécutable
           Filter := 'Fichier jpeg|*.jpg';
           if (Execute) then // <-- crash !!!
           begin
             // traitement
             ShowMessage(FileName);
           end;
         finally
           Release;
         end;
       end;
    end;

    Enfin, je croyais que ça fonctionnait… En fait, que je clique sur le ShowMessage ou que j'annule la boîte de dialogue, dans les deux cas ça tue la fenêtre du prog mais celui-ci continue à tourner en arrière-plan !

    Bref :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         finally
    //       Release; l'IHM disparaît mais le prog continue à tourner en mémoire
           Free; // pb ci-dessus réglé avec Free
         end;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 343
    Points : 536
    Points
    536
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bonsoir,


    Enfin, je croyais que ça fonctionnait… En fait, que je clique sur le ShowMessage ou que j'annule la boîte de dialogue, dans les deux cas ça tue la fenêtre du prog mais celui-ci continue à tourner en arrière-plan !
    J'ai bêtement copié/coller un exemple de Delphi 7 pour l'illustration.
    D'habitude, je passe par une variable pour éviter un conflit de noms avec le with (.Free / .Release du TOpenDialog ou de TForm1), et j'utilise quasi systématiquement FreeAndNil() pour libérer.
    De plus, le crash ne survient qu'aléatoirement (aucun pb avec d'autres forms créées avec le même patron ...) et pas du tout avec un autre PC ... sous la même version de Linux Mint

    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      TD: TOpenDialog;
    begin
      TD := TOpenDialog.Create(Application) ;
         try
           TD.InitialDir := ExtractFilePath(ParamStr(0)); // dossier de l'exécutable
           TD.Filter := 'Fichier jpeg|*.jpg';
           if (TD.Execute) then // <-- crash !!!
           begin
             // traitement
             ShowMessage(TD.FileName);
           end;
         finally
           FreeAndNil(TD);
         end;
       end;
    end;
    Vu que çà fonctionne en spécifiant --sync dans les paramètres de lancement ou en argv[0], mets provisoirement en RESOLU

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 720
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 720
    Points : 15 106
    Points
    15 106
    Par défaut
    Citation Envoyé par JP CASSOU Voir le message
    D'habitude, je passe par une variable pour éviter un conflit de noms avec le with (.Free / .Release du TOpenDialog ou de TForm1)
    Tiens tiens tiens...
    Comme si ce que j'ai observé (disparition de la form mais sans clôture du programme) se produisait avec le Release, genre Form1.Release alors que le Free dans le même contexte s'appliquerait au TOpenDialog ?
    Un truc de malade psychopathe, non ?


    Citation Envoyé par JP CASSOU Voir le message
    De plus, le crash ne survient qu'aléatoirement (aucun pb avec d'autres forms créées avec le même patron ...) et pas du tout avec un autre PC ... sous la même version de Linux Mint
    avec un autre PC où tu fais tourner juste le binaire ou tout le bazar laz/fpc ?

    EDIT
    Et comme tout ça me turlupinait, j'ai fait l'essai suivant :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      TD: TOpenDialog;
    begin
      TD := TOpenDialog.Create(Application);
      with TD do
        try
          InitialDir := ExtractFilePath(ParamStr(0)); // dossier de l'exécutable
          Filter := 'Fichier jpeg|*.jpg';
          if (Execute) then // <-- crash !!!
          begin
            // traitement
            ShowMessage(FileName);
          end;
        finally
          Release;
        end;
    end;
    avec le même résultat : l'IHM disparaît mais le prog tourne, simplement en cliquant sur Annuler du TD.
    Alors, pour en avoir le cœur net, j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        finally
          TD.Release;
        end;
    et là, bingo !
    unit1.pas(62,7) Error: identifier idents no member "Release"
    en me soulignant Release, hé hé hé !

    Conclusion : c'était bien ça : le with masquait silencieusement le fait que le Release va s'appliquer à la form, puisque le TOpenDialog ne le propose pas.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut question bête mais pourquoi faire :

    TD := TOpenDialog.Create(Application); ?


    et non pas TD := TOpenDialog.Create(Self);

    Vu que tu dois rajouter --Sync à mon avis le problème vient de là (les processus sont executés dans 2 threads différents, je pense )
    De plus le propriétaire de ta boite de dialogue c'est ta fenêtre et non pas TApplication

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 343
    Points : 536
    Points
    536
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut question bête mais pourquoi faire :

    TD := TOpenDialog.Create(Application); ?


    et non pas TD := TOpenDialog.Create(Self);Vu que tu dois rajouter --Sync à mon avis le problème vient de là (les processus sont executés dans 2 threads différents, je pense )
    De plus le propriétaire de ta boite de dialogue c'est ta fenêtre et non pas TApplication

    A+
    Bjr,

    1. Le problème est identique quelque soit le demandeur (Application, self ou nil)
    2. Il n'est pas systématique
    3. Beaucoup de fenêtres de mon application sont wrappées dans des fonctions de 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
     
    // affichage de la distance entre deux stations
    function DispDistanceEntreStations(const FD: TToporobotStructure2012;
                                       const FE: TBDDEntites;
                                       var   S1, S2: TBaseStation;
                                       const DescriptionAction: string;
                                       const CaptionAdditionalAction: string): integer;
    var
      TD: TdlgDistanceBetweenTwoStations; // descendant de TForm créé dynamiquement
    begin
      result := 0;
      TD := TdlgDistanceBetweenTwoStations.Create(Application);
      try
        if (TD.Initialiser(FD, FE, S1, S2, DescriptionAction, CaptionAdditionalAction)) then
        begin
          TD.ShowModal;
          if (TD.ModalResult = mrOK) then
          begin
            Result += 1;
            S1 := TD.GetStation1();
            S2 := TD.GetStation2();
            if (TD.DoAllowAdditionalAction()) then Result += 1;
          end;
        end;
      finally
        TD.Release;
      end;
    end;

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 720
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 720
    Points : 15 106
    Points
    15 106
    Par défaut
    Citation Envoyé par JP CASSOU Voir le message
    3. Beaucoup de fenêtres de mon application sont wrappées dans des fonctions de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // affichage de la distance entre deux stations
    function DispDistanceEntreStations(const FD: TToporobotStructure2012;
                                       const FE: TBDDEntites;
                                       var   S1, S2: TBaseStation;
                                       const DescriptionAction: string;
                                       const CaptionAdditionalAction: string): integer;
    var
      TD: TdlgDistanceBetweenTwoStations; // descendant de TForm créé dynamiquement
    ...
    Et donc ce n'est plus un TOpenDialog et donc TD.Release; fonctionnera ici.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut
    Citation Envoyé par JP CASSOU Voir le message
    Bjr,

    1. Le problème est identique quelque soit le demandeur (Application, self ou nil)
    Bizarre ce truc tu as marqué le sujet comme résolu. Qu'as tu fais pour corriger le problème ?

    Citation Envoyé par JP CASSOU Voir le message
    2. Il n'est pas systématique
    Quoi ? le problème ?

    Citation Envoyé par JP CASSOU Voir le message
    3. Beaucoup de fenêtres de mon application sont wrappées dans des fonctions de la forme:
    Pourquoi utilises tu Release au lieu de FreeAndNil pour libérer tes fenêtre ?
    Release laisse finir la fenêtre de traiter les messages, et FreeAndNil détruit la fenêtre de suite, ne serait pas une cause de problème avec TOpenDialog ?

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #9
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Je viens de regarder ton "wrapper" et j'ai vu que tu utilises Showmodal utiliser Release n'est pas très recommandé dans le cas d'une fenêtre "modal" qui attend un résultat comme c'est le cas ici. Pour une fenêtre "non-modal" Release (c'est l'utilisateur qui ferme la fenêtre) c'est plus sûre, mais si tu contrôle bien ton code "FreeAndNil" suffit. Sinon il faut passer par l'évènement "FormClose" avec l'utilisation de "CloseAction"
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 720
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 720
    Points : 15 106
    Points
    15 106
    Par défaut
    Salut, J.,
    Citation Envoyé par BeanzMaster Voir le message
    Release laisse finir la fenêtre de traiter les messages, et FreeAndNil détruit la fenêtre de suite, ne serait pas une cause de problème avec TOpenDialog ?
    Non, puisque dans le post d'origine de cette discussion,
    Citation Envoyé par Jipété Voir le message
    le with masquait silencieusement le fait que Release va s'appliquer à la form, puisque le TOpenDialog ne le propose pas.
    Une adaptation discrète qui met une joyeuse pagaille…
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Hello J.,
    Citation Envoyé par Jipété Voir le message
    Salut, J.,


    Non, puisque dans le post d'origine de cette discussion,
    Une adaptation discrète qui met une joyeuse pagaille…
    Je parlais du code de cette fonction function DispDistanceEntreStations et non de la précédente avec "OpenDialog", d'ailleurs, c'est pour cela que je n'aime pas trop utiliser le With TObject do dans des cas comme celui-ci
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

Discussions similaires

  1. Crash lors de l'utilisation des VBO
    Par Julien Bodin dans le forum OpenGL
    Réponses: 0
    Dernier message: 03/03/2009, 21h54
  2. plantage programme lors de sa première execution
    Par goffle dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 12/11/2008, 17h25
  3. Crash lors de l'ouverture de mon programme
    Par jimmplan dans le forum MFC
    Réponses: 16
    Dernier message: 16/10/2008, 22h35
  4. Crashs lors du lancement de programmes
    Par smarties dans le forum Windows XP
    Réponses: 3
    Dernier message: 30/08/2008, 13h59
  5. glade-- : crash lors de la génération c++
    Par Patriarch24 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 30/04/2007, 10h56

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