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

Langage Delphi Discussion :

Comportement curieux d'un RadioGroup


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Comportement curieux d'un RadioGroup
    Windows XP Delphi 4

    Bonjour à Tous,

    Sur ma fiche principale Form1 j'ai un RadioGroup RGMenu auquel est associé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.RGMenuClick(Sender : TObject);
    begin
      case RGMenu.ItemIndex of
      0:Action1;
      1:Form2.ShowModal;
      2:Application.Terminate
      end;
      RGMenu.ItemIndex:= -1;
    end;
    Je clique sur le deuxième item de RGMenu et je vais bien sur Form2. Je ferme Form2 et je reviens bien sur Form1 et comme prévu rien n'est coché sur RGMenu. Si je clique maintenant sur le troisième item de RGMenu, la plupart du temps l'application se ferme normalement mais parfois ça retourne sur Form2. En fermant Form2 je reviens à la situation précédente si bien qu'on ne peut plus en sortir.

    En procédant pas à pas à la fermeture de Form2 je constate que je reviens à la ligne 8 et que RGMenu.ItemIndex prend bien la valeur -1. Mais quand je clique sur le troisième item je constate qu'à la ligne 3 RGMenu.ItemIndex de case est revenu à 1 ce qui bien sur provoque le retour sur Form2.

    Merci d'avance à qui pourra m'éclairer.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Puisque Form1 est la fiche principale, pourquoi ne pas appeler Self.Close plutôt que Application.Terminate ?

    N'y a-t-il ailleurs dans votre code, une méthode qui (ré)initialise ce radiogroup ?
    Philippe.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Comportement curieux d'un RadioGroup
    Merci Philippe,

    Mais ça ne colle pas. Comme je l'ai écrit ci-dessus, lorsque je clique sur Quitter de RGMenu à la ligne 3 RGMenu.ItemIndex est revenu à 1 et non à -1. Ca repart donc dans Form2 et non au cas 2 de case RGMenu.ItemIndex of même s'il contient Self.Close.

    Aucune autre méthode ne remet ItemIndex à 1.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Je n'ai pas D4 mais D7 et je ne reproduis pas le bug
    Vous avez un mini projet à proposer pour test ?
    Philippe.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut
    bon jour
    c'est normale puisque si l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '2:Application.Terminate'
    est executer alor l'instruction suivente qui est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ' RGMenu.ItemIndex:= -1;'
    ne sexecute pas parceque vous avez arreter (terminer') le programme

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Ne serait-ce point lié à l'ordre des événements lors du clic ?

    Peut-être ce code devrait-il plutôt prendre place dans un OnMouseUp ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par tarekk73 Voir le message
    bon jour
    c'est normale puisque si l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '2:Application.Terminate'
    est executer alor l'instruction suivente qui est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ' RGMenu.ItemIndex:= -1;'
    ne sexecute pas parceque vous avez arreter (terminer') le programme
    Absolument pas, et je cite l'aide de Delphi :
    Appelez Terminate pour terminer par programme l'exécution d'une application.En appelant Terminate au lieu de libérer l'objet application,vous permettez à l'application de s'arrêter d'une manière plus ordonnée.

    Terminate appelle la fonction PostQuitMessage de l'API Windows pour effectuer la fermeture de l'application. Terminate n'agit pas immédiatement.

    Terminate est appelée automatiquement quand il y a un message WM_QUIT ou quand la fiche principale est fermée.
    D'ailleurs, tracez le code pas à pas et vous verrez que l'instruction est bien exécutée.
    Philippe.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Comportement curieux d'un RadioGroup
    Non je n'ai pas de mini-projet mais il est facile d'en constituer un avec le RadioGroup indiqué plus haut.

    Mais je ne suis pas sûr que ce soit de quelque utilité, car le bug ne se produit pas systématiquement. Dans à peu près 9 cas sur 10 il ne se produit pas, puis le 10ème ça se plante.

    Je ne comprends pas ce qui peut remettre RGMenu.ItemIndex à 1 alors que dans Form2 RGMenu n'apparait nulle part. Sans aucune certitude, j'ai l'intuition qu'avec un mini-projet le bug risque fort de ne jamais se manifester. J'ai le sentiment qu'il se produit quelque chose de sous-jacent et non perceptible en pas à pas, mais quoi je l'ignore.

    Merci en tous cas de votre aide.

    Georges.

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Plutôt l'impression que ta souris est en fin de vie et a des rebonds de contact...

    @tarekk73 : Tu confonds Application.Terminate et Halt.

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut
    bon alor peux etre la solution est

    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
    procedure TForm1.RGMenuClick(Sender : TObject);
    begin
      case RGMenu.ItemIndex of
      0: begin
            RGMenu.ItemIndex:= -1;
            Action1;
          end;
      1:begin
             RGMenu.ItemIndex:= -1;
             Form2.ShowModal; 
       end;
     
      2:     Application.Terminate;
     
      end;
     end;
    parceque apré le retour de Form2.ShowModal; notr itemindex est = 1 et il provoque peu etre a nouveu l'appel de l'evenement onclik

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Tarek : un peu de réflexion avant de raconter n'importe quoi s'il te plaît

    ...et soigne ton écriture !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Comportement curieux d'un RadioGroup
    Merci Andnotor.

    C'est une hypothèse à laquelle je n'avais pas pensé. Il est vrai qu'elle n'est pas neuve mais hors de ce cas précis elle ne me crée pas de soucis.

    Georges.

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu n'as pas un OnActivate qui change le ItemIndex ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Comportement curieux d'un RadioGroup
    Non ShaiLeTroll nulle part dans le code hors le RGMenuClick il n'est affecté une valeur à RGMenu.ItemIndex.

    Je ne suis pas un débutant dans Delphi (bien que pratiquant en amateur) mais ne suis pas non plus un expert. Mais je constate avec un peu de plaisir que l'explication de ce bug sur lequel j'ai passablement séché n'est pas non plus évidente pour des gens beaucoup plus compétents que moi.

    Merci à tous.

    Georges.

  15. #15
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    essaies de travailler en mode asynchrone Postmessage par exemple pour fermer la fiche principale

  16. #16
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    On devrait faire un Pot dans lequel tout ceux qui utilise "Application.Terminate" mettrais un euro dedans ... on serait milliardaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.RGMenuClick(Sender : TObject);
    var I: integer;
    begin
      I := RGMenu.ItemIndex;
      if I = -1 then exit;
      RGMenu.ItemIndex := -1;
     
      case I of
        0: Action1;
        1: Form2.ShowModal; 
        2: Application.MainForm.Close;
      end;
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  17. #17
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Voici ce qui ce passe dans le Close de la fiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Application.MainForm = Self then Application.Terminate
    Il faudrait justifier un peu plus l'appel de Application.MainForm.Close dans le cas présent parce que je n'y vois pas grand intérêt
    Le seul cas où cet appel est nécessaire est si la fermeture est conditionnée (ex. fichier modifié mais non sauvegardé).

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Re Comportement curieux d'un RadioGroup
    MONTOR : excuse mon ignorance mais je ne vois pas ce que sont le mode asynchrone et PostMessage. Quelques explications seraient les bienvenues.

    Dr. Who : j'ai déjà essayé cette modification du code sans résultat. En effet à l'entrée de RGMenu le ItemIndex est déjà à 1. Tout se passe comme si le Item Index était re-valorisé à 1 dans Form2 alors que que le code de cette fiche ne contient aucun appel de RGMenu.ItemIndex.

    Andnotor : je ne vois pas bien ce que cela apporte. A noter d'ailleurs que dans l'exposé initial du problème j'ai indiqué pour faire simple que Form1 était la fiche principale mais ce n'est pas toujours le cas.

    Merci à tous.

    Georges.

  19. #19
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par Stevens.Georges Voir le message
    Andnotor : je ne vois pas bien ce que cela apporte.
    Rien du tout ! C'était juste une remarque sur le commentaire de Dr. Who

    Maintenant, il faut arrêter de focaliser sur ces quelques lignes, le problème ne vient pas de là ! Seul un click de souris ou un appel direct à RGMenuClick vont exécuter ce code. Même fixer manuellement ItemIndex ne génère pas cet évènement.

    Mets un point d'arrêt et contrôle la pile d'appel pour voir à travers quelles procédures tu passes.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Re Comportement curieux d'un RadioGroup
    Pour ceux qui auront la gentillesse et la patience nécessaires, et en réponse à Adnotor, j'ai pu avancer un peu dans la localisation du bug. Voici ce que j'ai fait et que vous devriez pouvoir reproduire :

    1/ Créer un mini projet avec deux fiches Form1 (principale) et Form2.
    2/ Sur Form1 placer un RadioGroup nommé RGMenu et placer dans son évènement OnClick le code donné plus haut. Remplir bien sûr les items en conséquence.
    3/ Placer un point d'arrêt sur les lignes 3 (case RGMenu.ItemIndex of) et 8 (RGMenu.ItemIndex:=-1).
    4/ Lancer le projet et cliquer sur l'item 2 de RGMenu pour aller sur Form2. Sauter le point d'arrêt et aller dans Form2.
    5/ Fermer Form2 ce qui ramène au point d'arrêt de la ligne 8 de RGMenu.
    6/ Aller en pas pas à pas pour sortir de RGMenu. Form1 se réaffiche.
    7/ Cliquer sur Quitter de RGMenu. Au point d'arrêt de la ligne 3 on constate que ItemIndex est revenu à 1. En tous cas c'est ce que je constate sur mon PC.

    Et maintenant, même si je supprime les deux points d'arrêt, ça continue à aller à Form2 lorsque je clique sur Quitter.

    Merci d'avance à un plus compétent que moi qui pourra éclaircir la question.

    Georges.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [TOMCAT5.5] Comportement curieux de la mémoire
    Par tnodev dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 02/11/2007, 11h26
  2. [JScrollBar] comportement curieux
    Par rems033 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 01/10/2007, 10h06
  3. [Cookies] Mes cookies ont un comportement curieux
    Par Jinx_ dans le forum Langage
    Réponses: 2
    Dernier message: 16/03/2007, 16h11
  4. [Rewrite .htaccess] Comportement curieux aussi
    Par Bensor dans le forum Apache
    Réponses: 2
    Dernier message: 23/12/2006, 13h22
  5. comportement curieux font-bold sous ffx ?
    Par SpaceFrog dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 22/06/2006, 11h51

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