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

Composants VCL Delphi Discussion :

Valeur choisie dans TTaskDialog


Sujet :

Composants VCL Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut Valeur choisie dans TTaskDialog
    Mon dernier "problème" de la semaine ...

    Je voulais utiliser un TTaskDialog pour proposer plusieurs choix de réponses à une question.
    Une solution consiste à l'utiliser avec les RadioButton.

    Je voulais essayer une autre façon avec les CommandLinks, de façon à proposer une possibilité de réponse en une seule action au lieu de choisir puis de valider le choix.

    Pour créer la boite de dialogue, pas de problème !
    Par contre, récupérer le choix fait par l'utilisateur, je n'y arrive pas.
    J'ai essayé de lier une pseudo class de façon à la lier à l'évènement OnButtonClicked du TTaskDialog mais dans la procédure d'évènement, je ne n'arrive pas à récupérer l'info voulue.
    Voici mon code :

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    type
      TClickBouton = class
      private
        FReponse: Byte;
      public
        constructor Create;
        procedure OnClick(Sender: TObject; ModalResult: TModalResult; var CanClose: Boolean);
        procedure OnClick2(Sender: TObject);
        property Reponse: Byte read FReponse write FReponse;
      end;
     
    ...
     
    function ChoixMultiples(Titre, Question: string; Choix: TStringDynArray; out Reponse: Byte): Boolean;
    var
      I: Integer;
      Clk: TClickBouton;
      Rep: Byte;
    begin
     
      if ThemeServices.ThemesEnabled and (Win32MajorVersion >= 6) then
      begin
     
        Clk := TClickBouton.Create();
     
        with TTaskDialog.Create(nil) do
        begin
          try
            Caption       := Application.Title;
            Title         := Titre;
            Text          := Question;
            CommonButtons := [];
            MainIcon      := tdiInformation;
     
            for I := Low(Choix) to High(Choix) do
              with TTaskDialogButtonItem(Buttons.Add) do
              begin
                Caption     := Choix[I];
                ModalResult := mrNone;
                Tag         := I;
              end;
     
            Flags := [tfUseCommandLinks, tfAllowDialogCancellation];
     
            OnButtonClicked := Clk.OnClick;
     
            if Execute then
              begin
                Result  := True;
                Reponse := Clk.FReponse;
              end;
     
          finally
            Clk.Free;
            Free;
          end
        end;
     
      end;
    end;
     
    ...
     
    procedure TClickBouton.OnClick(Sender: TObject; ModalResult: TModalResult;
      var CanClose: Boolean);
    begin
      FReponse := TTaskDialog(Sender).Button.Index;  // <<<<<<<<<< Là, c'est toujours 0. Donc, ce n'est pas la bonne manière
    end;
    Pour l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if UnitMultiReponses.ChoixBouton('Jour', 'Quel jour venez-vous ?', ['Lundi', 'Mardi', 'Mercredi'], Reponse) then
            ShowMessage(Reponse.ToString);
    Quelqu'un aurait-il une idée ?

    Je précise que chaque TTaskDialogButtonItem ajouté ne possède d'évènement OnClick mais seulement une procédure Click qui n'est pas modifiable.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 829
    Points : 13 573
    Points
    13 573
    Par défaut
    Normal puisque tous les ModalResult sont à mrNone.

    TModalResult n'est qu'un type entier, tu leur mais une valeur quelconque qui ne pile pas sur celles prédéfinies (mrOk, etc.), par exemple I +100 et ensuite, ben c'est un case ModalResult of comme pour le reste.

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    J'y avais pensé mais je ne savais si cela allait interférer avec la réponse de la boite de dial.

    Ok, merci !

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    Je reviens sur le sujet parce que j'ai découvert quelque chose de plus simple.
    En fait, chaque TButton ajouté se voit automatiquement attribué un ID dans l'ordre d'ajout.
    Au retour du Execute, il suffit de récupérer le Button.ID du TTaskDialog et ça donne l'index du bouton cliqué.


    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
     
    function ChoixMultiples(Titre, Question: string; Choix: TStringDynArray; out Reponse: Byte): Boolean;
    var
      I  : Integer;
      Rep: Byte;
    begin
      Reponse := 0;  // Valeur de la réponse par défaut
      if ThemeServices.ThemesEnabled and (Win32MajorVersion >= 6) then
        with TTaskDialog.Create(nil) do
        begin
          try
            Caption       := Application.Title;
            Title         := Titre;
            Text          := Question;
            CommonButtons := [];
            MainIcon      := tdiInformation;
            Flags         := [tfUseCommandLinks, tfAllowDialogCancellation];
     
            for I := Low(Choix) to High(Choix) do
              with TTaskDialogButtonItem(Buttons.Add) do
                Caption := Choix[I];
     
            if Execute then
            begin
              Result  := True;
              Reponse := Button.ID;  
            end;
     
          finally
            Free;
          end
        end;
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 829
    Points : 13 573
    Points
    13 573
    Par défaut
    C'est pas exceptionnel, tu peux tout recommencer si par la suite tu réordonnes les boutons.

    Les ModalResult reçoivent aussi une valeur par défaut, à partir de 100. C'est plus pérenne

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    Comme quoi je suis les conseils qu'on me donne !
    Par contre, j'ai du rajouter un test parce que de façon aléatoire, le clic sur la croix de fermeture renvoie True pour la fonction Execute alors que ça ne devrait 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
    36
    37
    38
    39
    40
    41
    42
    43
     
    function ChoixMultiplesBoutons(Titre, Question: string; Choix: TStringDynArray; out Reponse: Byte): Boolean;
    var
      I    : Integer;
      Dlg  : TTaskDialog;
      Click: TClick;
    begin
      Reponse := 0;
      if ThemeServices.ThemesEnabled and (Win32MajorVersion >= 6) then
      begin
        Click := TClick.Create;
     
        Dlg := TTaskDialog.Create(nil);
        try
     
          Dlg.Caption            := Application.Title;
          Dlg.Title              := Titre;
          Dlg.Text               := Question;
          Dlg.CommonButtons      := [];
          Dlg.MainIcon           := tdiInformation;
          Dlg.Flags              := [tfUseCommandLinks, tfAllowDialogCancellation, tfEnableHyperlinks];
          Dlg.OnHyperlinkClicked := Click.OnClick;
     
          for I := Low(Choix) to High(Choix) do
            with TTaskDialogButtonItem(Dlg.Buttons.Add) do
            begin
              Caption     := Choix[I];
              ModalResult := I + 100;
            end;
     
          Result := Dlg.Execute;
          Result := Result and (Dlg.ModalResult <> mrCancel);
          if Result then
            Reponse := Dlg.Button.ModalResult - 100;
     
        finally
          Dlg.OnHyperlinkClicked := nil;
          Dlg.Free;
          Click.Free;
        end
     
      end;
    end;

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/04/2009, 16h00
  2. Réponses: 5
    Dernier message: 04/12/2008, 16h58
  3. Copier valeur choisie dans liste modifiable d'une combobox
    Par pinpin31 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/10/2008, 22h36
  4. Rendre inactive une combobox selon la valeur choisie dans une 1er combobox
    Par The Molo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 14/12/2007, 14h34
  5. Insérer valeur choisie dans une cellule
    Par jcaspar dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/10/2007, 18h45

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