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 :

Fenêtre modale rétive


Sujet :

Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut Fenêtre modale rétive
    Bonjour à tous, et mes meilleurs voeux

    Une fenêtre modale me fait des misères. Elle se crée et se referme aussitôt, le programme ne s'arrêtant pas dessus.

    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
     
    // Test fonctionnant : 
     
    procedure TForm1.Btn_1Click(Sender: TObject);
    Var
      Retour : integer;
     
    begin
      Form2 := TForm2.Create(Application);
      Retour := Form2.ShowModal;
      Form2.Free;
     
      MessageDlg('RETOUR DE FORM2', mtInformation, [mbOK], 0);
     
    end;

    Et la procédure ne fonctionnant pas :

    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
    Function Saisie_Url_Cible : boolean;
    Var
      Retour : integer;
    
    begin
        Form2 := TForm2.Create(Application);
        Retour := Form2.ShowModal;  // n'attend pas le code de retour
        Form2.Free;
    
        CASE Retour OF
          mrOK :
            begin
              Saisie_Url_Cible := True;
            end;
    
          mrAbort :
            begin
              Saisie_Url_Cible := False;
           end;
    
       End; // Case
    
    
    end;
    Vérifié que la Form2 retourne bien mrOK ou mrAbort. Rien d'autre.

    J'ai créé, pour un test, une troisième fenêtre, avec le code ci-dessus et fonctionnant partout ailleurs : même chose. Ca ne marche pas. Comme si ce prog n'acceptait plus les fenêtres modales. Ca faisait longtemps que ça ne m'était pas arrivé. Je ne vois pas où est l'erreur.

  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,
    Citation Envoyé par bvsud Voir le message
    Une fenêtre modale me fait des misères. Elle se crée et se referme aussitôt, le programme ne s'arrêtant pas dessus.

    Vérifié que la Form2 retourne bien mrOK ou mrAbort. Rien d'autre.

    J'ai créé, pour un test, une troisième fenêtre, avec le code ci-dessus et fonctionnant partout ailleurs : même chose. Ca ne marche pas. Comme si ce prog n'acceptait plus les fenêtres modales. Ca faisait longtemps que ça ne m'était pas arrivé. Je ne vois pas où est l'erreur.
    Qu'est ce qu'il y a dans la fenêtre Form2 ou Form3 (code en particulier) ?
    Utilisez vous un helper sur TForm ?
    Philippe.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonjour.

    Non, pas de fichier helper, rien de particulier. La Form1 est toute petite, et exécute un pop-up. A partir de ce menu, j'appelais une procédure, décrite ci-dessus.

    J'ai aussi remarqué que, si j'ajoute un bouton (pour test), celui-ci appelle une Form3 créée pour le test... et ça fait la même chose. J'ai contourné le problème en appelant un EXE. Je récupère la saisie éventuelle via un fichier temporaire binaire.

    C'est résolu... sans l'être. Il n'y avait même pas de code, dans la Form2. Juste un ModalResult := mrOK ou mrAbort.

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Il y a forcément quelque chose.
    Soit du code, soit par exemple, une douchette qui lit un code barre, qui active le bouton par défaut de la fiche modale (par simulation d'un appui sur Entrée).

    Quelle est la valeur de Retour? Si tu changes le bouton par défaut de la fiche modale, la valeur de Retour change?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par bvsud Voir le message
    Il n'y avait même pas de code, dans la Form2. Juste un ModalResult := mrOK ou mrAbort.
    Fixer ModalResult entraîne la sortie de la boucle de messages ce qui équivaut à la fermeture de la fiche

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Fixer ModalResult entraîne la sortie de la boucle de messages ce qui équivaut à la fermeture de la fiche
    Mais cela n'a aucune incidence sur le problème d'ouverture/ fermeture si le ModalResult est modifié dans le FormClose ou une méthode style action_click

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Oui, effectivement : le bouton (pr la Form de test comme celle de la saisie) appelle la procédure Quitter(), laquelle contient Form2.ModalResult := mrOK. Ou Abort. Mais la Form appelant celle-ci ne s'arrête pas sur l'instruction d'appel.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          Form2 := TForm2.Create(Application);
          Retour := Form2.ShowModal;  // attend le code de retour de Form2
          Form2.Free;
     
         // suite du code...
    Là, on n'attend pas, et la suite du code s'exécute.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par foetus Voir le message
    Mais cela n'a aucune incidence sur le problème d'ouverture/ fermeture si le ModalResult est modifié dans le FormClose ou une méthode style action_click
    Bien sûr mais ça pourrait en être un s'il était dans OnActivate ou une méthode appelée depuis cet événement (sans en être certain).

    C'est l'implémentation de TForm2 qu'il faudrait nous montrer.

  9. #9
    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 bvsud Voir le message
    Non, pas de fichier helper, rien de particulier. La Form1 est toute petite, et exécute un pop-up. A partir de ce menu, j'appelais une procédure, décrite ci-dessus.
    C'est surtout le code dans Form2 qu'il serait intéressant de connaître...
    Citation Envoyé par bvsud Voir le message
    Il n'y avait même pas de code, dans la Form2. Juste un ModalResult := mrOK ou mrAbort.
    A quel endroit dans le code ?
    Philippe.

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonsoir.

    J'ai rajouté ce code, lequel, comme précédemment, ne fonctionne pas. La Form1 affiche ceci, au centre de l'écran :



    Commande du popup entourée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.APPELFORM31Click(Sender: TObject);
    Var
      Retour_Form : integer;
     
    begin
      Form3 := TForm3.Create(Application);
      Retour_Form := Form3.ShowModal;
      Form3.Free;
    end;
    Code de la form3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm3.Btn_RetourClick(Sender: TObject);
    begin
        Form3.ModalResult := mrOK;  // on quitte la Form3
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm3.FormActivate(Sender: TObject);
    begin
        Btn_Retour.SetFocus;  // D'habitude, c'est cela qui fonctionne. On attend la fin du code pour retourner à la Form appelante
    end;
    Là, si elle s'affiche, je ne la vois même pas passer. Je n'ai pourtant pas une carte graphique hyper rapide... Et, de toute façon, Form3 devrait s'afficher et attendre le clic sur le bouton.

    Bizarre...

  11. #11
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Etrange, j'ai fais une application juste avec ce que tu décris, je n'ai pas le problème. as tu essayé dans une application "neuve" ?
    Petit truc au passage, évite d'appeler la var globale a l’intérieur d'elle même (cf. commentaires dans le code)
    Citation Envoyé par bvsud Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.APPELFORM31Click(Sender: TObject);
    Var
      Retour_Form : integer;
       local_Form3: TForm3;
    begin
      local_Form3:= TForm3.Create(Application);
      Retour_Form := local_Form3.ShowModal;
      local_Form3.Free; //si tu utilise Form3 ici, tu le free mais ne le passe pas à nil, donc la variable globale pointe dans l'espace
    end;
    Code de la form3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm3.Btn_RetourClick(Sender: TObject);
    begin
        Self.ModalResult := mrOK;  // "Self" peut etre different de "Form3"
    end;
    au cas ou, voici le code que j'ai utilisé pour tester :
    unit1.pas
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus;
     
    type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        showF31: TMenuItem;
        procedure showF31Click(Sender: TObject);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses
      Unit2;
     
    {$R *.dfm}
     
    procedure TForm1.showF31Click(Sender: TObject);
    var
      ret: integer;
    begin
      form2 := TForm2.Create(Application);
      ret := form2.ShowModal;
      form2.Free;
    end;
     
    end.
    unit1.dfm
    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
    object Form1: TForm1
      Left = 374
      Top = 358
      Width = 699
      Height = 414
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Shell Dlg 2'
      Font.Style = []
      OldCreateOrder = False
      PopupMenu = PopupMenu1
      PixelsPerInch = 96
      TextHeight = 13
      object PopupMenu1: TPopupMenu
        Left = 136
        Top = 80
        object showF31: TMenuItem
          Caption = 'showF3'
          OnClick = showF31Click
        end
      end
    end
    unit2.pas
    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
    unit Unit2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm2 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure FormActivate(Sender: TObject);
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm2.Button2Click(Sender: TObject);
    begin
      form2.ModalResult := mrok;
    end;
     
    procedure TForm2.FormActivate(Sender: TObject);
    begin
      Button2.SetFocus;
    end;
     
    end.
    unit2.dfm
    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
    object Form2: TForm2
      Left = 949
      Top = 240
      Width = 376
      Height = 278
      Caption = 'Form2'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Shell Dlg 2'
      Font.Style = []
      OldCreateOrder = False
      OnActivate = FormActivate
      PixelsPerInch = 96
      TextHeight = 13
      object Button1: TButton
        Left = 72
        Top = 88
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 0
      end
      object Button2: TButton
        Left = 176
        Top = 144
        Width = 75
        Height = 25
        Caption = 'Button2'
        TabOrder = 1
        OnClick = Button2Click
      end
    end
    PS : plutot que setter le focus dans le activate, met plutôt le taborder de ton bouton à 0

  12. #12
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Question idiote, mais parfois la distraction nous joue des tours...
    Comme tu crées Form2 dynamiquement, n'as-tu pas oublié de l'enlever des fiches auto-créées ?

    Cordialement
    Thierry

  13. #13
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonsoir et merci à tous

    C'est résolu... mais j'ignore pourquoi !

    Vu que c'était illogique, j'ai suivi le conseil de guillemouze. Je suis reparti de zéro. Enfin presque : j'avais sauvé les codes. Et ça marche. La dernière fois que j'avais tenté un ShowModal, Delphi voulait à tout prix me créer une Form3, alors même que plus rien ne référait à Form2. J'avais pourtant purgé tous les résidus de compilation, viré le fichier .RES , tout.

    Maintenant, ça marche :

    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
     
    Procedure Appel_Google_Rech_Ds_Les_Caches;
    begin
     
      If Saisie_Url_Cible = False then
        begin
          Quitter;
          Exit;
        end;
     
      Ligne_Appel := 'webcache.googleusercontent.com/search?q=cache:' + Url_Cible_Pr_Rech_En_Caches;
      ShellExecute (handle_App,               // ?
                    'Open',                // ?
                    PChar(Nom_Cplt_FireFox),                    // Param passé au progr
                    PChar(Ligne_Appel),
                    '',                    // Directory par défaut
                    SW_SHOWNORMAL);
     
      Quitter;
     
    {
    Début de l'url pour une recherche en cache : 
    webcache.googleusercontent.com/search?q=cache:  
    }
    end;
     
     
    Function Saisie_Url_Cible : boolean;
    Var
      Retour_Saisie : integer;
     
    begin
      Form2 := TForm2.Create(Application);
      Retour_Saisie := Form2.ShowModal;
      Form2.Free;
     
      if Retour_Saisie = mrOK then Saisie_Url_Cible := True
      Else Saisie_Url_Cible := False;
     
    end;
    Traitement de la saisie dans la Form2 :

    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
     
    Procedure Traiter_Touche;
    begin
      case Touche of
     
        vk_RETURN :
          begin
            Url_Cible_Pr_Rech_En_Caches := Form2.Edit1.Text;
            Quitter_OK;
          end;
     
        vk_ESCAPE :
          begin
            Url_Cible_Pr_Rech_En_Caches := '';
            Quitter_NO;
          end;
     
        Else
          begin
            Form2.Edit1.SetFocus;
          end;
      end;
     
    end;
     
    Procedure Quitter_OK;
    begin
      Form2.ModalResult := mrOK;
    end;
     
     
    Procedure Quitter_NO;
    begin
      Form2.ModalResult := mrAbort;
    end;
    Bon : c'est du code très basique, mais, pour la vérification, ça passe.

    Pourquoi, ça ?

  14. #14
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Comme tu crées Form2 dynamiquement, n'as-tu pas oublié de l'enlever des fiches auto-créées ?
    Effectivement, ca peut poser problème si tu as mis un mécanisme dans ta form pour qu'elle soit unique.
    Perso, je mettrai un point d’arrêt dans TForm.Close ou gérerai l’événement OnCloseQuery pour voir la pile d'appel et repérer le coupable

  15. #15
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Je trouve un peu bizarre ta facon de faire, je la trouve pas très orienté objet (apres ca peut etre assimilé a une question de gouts).
    J'aurai plutôt présenté ca comme ca :
    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
     
    Procedure Appel_Google_Rech_Ds_Les_Caches;
    begin
     
      If not Saisie_Url_Cible then
        begin
          Quitter;
          Exit;
        end;
     
      Ligne_Appel := 'webcache.googleusercontent.com/search?q=cache:' + Url_Cible_Pr_Rech_En_Caches;
      ShellExecute (handle_App,               // ?
                    'Open',                // ?
                    PChar(Nom_Cplt_FireFox),                    // Param passé au progr
                    PChar(Ligne_Appel),
                    '',                    // Directory par défaut
                    SW_SHOWNORMAL);
     
      Quitter;
     
    {
    Début de l'url pour une recherche en cache : 
    webcache.googleusercontent.com/search?q=cache:  
    }
    end;
     
     
    Function Saisie_Url_Cible : boolean;
    begin
      with TForm2.Create(Application) do //Il ne faut pas manipuler une variable globale si on peut faire sans
      try
        Result := {.}ShowModal = mrOk;
      finally
        {.}Free;
      end;
    end;
    Traitement de la saisie dans la Form2 :

    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
     
    //IL FAUT mettre KeyPreview = True dans les propriétés de ta TForm2
    // et mettre Form2KeyDown dans le OnKeyDown de la form
    Procedure TForm2.Form2KeyDown(...);
    begin
      case Key of
     
        vk_RETURN :
          begin
            Url_Cible_Pr_Rech_En_Caches := Self.Edit1.Text;
            ModalResult := mrOk;
          end;
     
        vk_ESCAPE :
          begin
            Url_Cible_Pr_Rech_En_Caches := '';
            ModalResult := mrCancel; //en general, on utilise le coupe mrOk/mrCancel (lié au ModalResult des types de boutons)
          end;
      end;
     
    end;

  16. #16
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonjour.

    Tu as raison. Et ton code est plus élégant.

    Mais, d'habitude, lorsque j'ai ce type de traitement de touche, je renvoie vers une procédure Quitter(). C'est elle qui fait le boulot. Il y a parfois plusieurs instructions que, pour des raisons (personnelles) de lisibilité, je préfère ne pas insérer dans le Case Touche of.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Case Touche of
        27 : 
           begin
                  Quitter;
           end;
     
        vk_F8 : 
           begin
                 Touche := 0;
                 // Traitement touche F8 : appel de procédure ou fonction
     
           end;
    end; // Case
    Je vais regarder de près cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     with TForm2.Create(Application) do //Il ne faut pas manipuler une variable globale si on peut faire sans
      try
        Result := {.}ShowModal = mrOk;
      finally
        {.}Free;
      end;

Discussions similaires

  1. [PowerBuilder] Récupérer la main sur une fenêtre modale
    Par jpdar dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 14h21
  2. Modifier un champ à partir d'une fenêtre modale
    Par ahoyeau dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/03/2005, 16h53
  3. Formulaire dans une fenêtre modale
    Par Amnesiak dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 14h25
  4. Supprimer la croix dans une fenêtre modale
    Par AnneOlga dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/01/2004, 14h52
  5. Rendre une fenêtre modale non modale
    Par Smortex dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/03/2003, 17h56

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