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

Delphi Discussion :

Fenetre MessageDlg qui disparait quand FDQuery.Open


Sujet :

Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 39
    Points : 130
    Points
    130
    Par défaut Fenetre MessageDlg qui disparait quand FDQuery.Open
    Bonjour à tous,

    <EDIT>(Voir prochain message pour les précisions)<EDIT>

    Je suis confronté à un bug très gênant et ... étrange.
    Le but c'est d'ouvrir une requête (TFDQuery), puis de mettre un message à l'utilisateur.

    La procedure qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FDQuery.SQL.Text := 'select user mdp from utilisateur where user = ''robert'' and mdp = ''plant''';
    FDQuery.Open;
    MessageDlg('OK !', mtWarning, [mbOK], 0);
    En effet, la fenêtre 'OK !' pop, mais se ferme quasi-instantanément.

    Alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FDQuery.SQL.Text := 'select user mdp from utilisateur where user = ''robert'' and mdp = ''plant''';
    // FDQuery.Open;
    MessageDlg('OK !', mtWarning, [mbOK], 0);
    Fonctionne normalement.

    J'aimerais quand même pouvoir faire le Open puis le MessageDlg (peut importe le résultat de la requête) sans que le MessageDlg ne disparaisse. Je vois absolument pas le lien entre les deux !

    Problème présent en Debug et en Release avec Delphi XE7, une TFDQuery, et MessageDlg provenant de Vcl.Dialogs.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    j'ai vérifié, mais non je n'ai pas ce problème (ouf!)
    J'ai repris ce point à partir d'un code test et fait plusieurs essais différents (pas de changement du SQL texte, changement, disable/Enablecontrols etc...) et toujours pas de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // fdquery.disablecontrols;
    fdQuery1.Close;
    fdquery1.SQL.text:='SELECT * FROM BRANDS ORDER BY CODE';
    fdquery1.Open();
    showmessage('test');
    //fdquery1.enablecontrols;
    un problème avec le fdGUIxWaitcusor peut être ? (bien vérifier le provider)

    juste une question il s'agit d'un programme VCL ou FMX (même si je vois MessageDlg provenant de Vcl.Dialogs)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 39
    Points : 130
    Points
    130
    Par défaut
    En effet SergioMaster, le bug n'est pas reproductible si facilement. J'ai tenté de mettre le cas le plus simple possible sans avoir testé. Désolé.

    Après une analyse plus approfondie, j'ai réussi à localiser assez précisément d’où venait ce comportement.
    Avant d'ouvrir ma query, j'écris dans un fichier texte. Cette écriture est threadé. Le code date de Delphi 7. Cette portion (que je n'ai pas écrite) utilise des TEvent, un TCriticalSection, un dérivé de TThread.
    Le suspect numéro 1 est le TMyThread.Execute.

    Dans ce thread je fais notamment des choses comme :
    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
    while not Terminated do
      try
         case MyEventArret.WaitFor(250) of
           wrSignaled :
              begin
                MyEventArret.ResetEvent;
                LockEtatThread.Acquire;
                try
                  EtatThread := ARRET_EN_COURS;
                finally
                  LockEtatThread.Release;
                end;
                {* on attend au plus 100 ms *}
                MyEventAnnulation.WaitFor(250);
     
                MyEventAnnulation.ResetEvent;
                {...}
    Je vois pas ce qui pourrait faire que mon MessageDlg disparaisse, mais ça vient de la (ou pas loin).

    Ce qui me fait croire ça :
    - Le bug disparait quand je met un point d’arrêt sur Query.Open
    - Le bug disparait quand je thread l'affichage du message comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      task : ITask;
    begin
      SaprrQuery1.Open;
      task := TTask.Create(procedure() begin 
        MessageDlg('salut', mtWarning, [mbOK], 0);
        end);
      task.ExecuteWork;
    end;
    Il n'est pas possible de faire ça pour tous les MessageDlg de mes programmes. J'imagine que je vais devoir réécrire la partie qui pose problème sur XE7, en utilisant des choses comme TParallel ou TTask.

    Si quelqu'un à une idée sur ce qui se passe, c'est bienvenue !

    PS : Je n'ai pas précisé, mais d'une part la MessageDlg disparait quasi instantanement, mais ma fenetre appelante passe en dernier plan (derrière toutes mes autres fenêtres).

Discussions similaires

  1. Tableau qui disparait quand je le mets dans \begin{table} \end{table}
    Par loloboua dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 31/10/2013, 12h08
  2. Sous menu qui disparait quand on passe la souris dessus
    Par pasc06 dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 09/12/2009, 07h23
  3. fenetre DOS qui disparait après fin d'execution
    Par Gwindor dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 10/07/2008, 09h36
  4. lecteur qui disparait quand on clic dessus
    Par Xann_71 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/07/2007, 11h55
  5. Problème: calque qui disparait quand on en affiche un autre.
    Par barracuda83 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/06/2006, 19h59

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