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 :

Récupérer "Annuler" ou "OK"


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Récupérer "Annuler" ou "OK"
    Bonjour,

    J'utilise cette fonction à la place de SelectDirectory.
    Mettre ShlObj, ActiveX; dans les uses

    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
    Function Browse : String;
    var
      BrowseInfo  : TBrowseInfo;
      PIDL        : PItemIDList;
      Folder      : array[0..MAX_PATH] of Char;
    begin
      result := '';
      FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);
      BrowseInfo.hwndOwner      := Application.Handle;
      BrowseInfo.pszDisplayName := @Folder[0];
      BrowseInfo.lpszTitle      := 'Selectionné ou créer un dossier';
     
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or $40;
      CoInitialize(NIL);
     
      PIDL := SHBrowseForFolder(BrowseInfo);
      if Assigned(PIDL) then
        if SHGetPathFromIDList(PIDL, folder) then
          result := folder
        else
          result := '';
    end;
    Je l'utilise comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if Browse = '' then Showmessage('dossier non valid');
    end;

    Comment je peux savoir si l'utilisateur a cliqué sur annuler ou OK ?

    Merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Salut,
    Tu dois mettre le ModalResult = mrOK sur ton bouton OK et ModalResult = mrCancel sur ton bouton Annuler dans les propriétés de chaques boutons.
    Ensuite quand tu fermes la fenêtre, tu tests la valeur de ModalResult.

    Jeankiki

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Jeankiki Voir le message
    Salut,
    Tu dois mettre le ModalResult = mrOK sur ton bouton OK et ModalResult = mrCancel sur ton bouton Annuler dans les propriétés de chaques boutons.
    Ensuite quand tu fermes la fenêtre, tu tests la valeur de ModalResult.

    Jeankiki
    Salut...

    C'est une fenetre de dialogue genre Opendialog !!!!

    impossible ta proposition.

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 710
    Points : 5 332
    Points
    5 332
    Par défaut
    Sur le boite de dialogue genre OpenDiaog, il suffit de testé le résultat de la méthode "Execute". Si ton objet est fait sur le même moule, cela devrait fonctionner non ?

    Sinon, y'a peux être un message à intercepter.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Il n'y a que le PIDL à nil pour le savoir. Je modifierais ta fonction comme suit:

    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
    Function Browse(out aPath :String) :Boolean;
    var
      BrowseInfo  : TBrowseInfo;
      PIDL        : PItemIDList;
      Folder      : array[0..MAX_PATH] of Char;
    begin
      FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);
      BrowseInfo.hwndOwner      := Application.Handle;
      BrowseInfo.pszDisplayName := @Folder[0];
      BrowseInfo.lpszTitle      := 'Selectionné ou créer un dossier';
     
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or $40;
      CoInitialize(NIL);
     
      PIDL := SHBrowseForFolder(BrowseInfo);
     
      if Assigned(PIDL) and SHGetPathFromIDList(PIDL, folder) then
      begin
        aPath  := folder;
        Result := TRUE;
      end
      else Result := FALSE;
    end;

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 531
    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 531
    Points : 25 070
    Points
    25 070
    Par défaut
    Tout le monde n'aime pas, mais je trouve cette syntaxe plus consise !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Result := Assigned(PIDL) and SHGetPathFromIDList(PIDL, folder) 
      if Result then
        aPath  := folder;
    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

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut messieurs,

    Vos deux propositions à moins que je me trompe simplifie la procédure que j'ai mise au dessus, mais je voit pas comment récupere le fait que l'utilisateur à cliquer sur ANNULER ? ou OK ? ou à simplement fermer la fenêtre de dialogue ?

    Je me trompe ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Tout le monde n'aime pas, mais je trouve cette syntaxe plus consise !
    J'ai hésité un instant avec cette syntaxe .

    Buzz,
    L'annulation ou la fermeture de la fenêtre renvoi FALSE !

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    J'ai hésité un instant avec cette syntaxe .

    Buzz,
    L'annulation ou la fermeture de la fenêtre renvoi FALSE !
    Salut AndNotor... c'est plus suptile que cela... sinon j'aurais pas posé la question lol...

    En fait imagine que l'utilisateur chosi "Poste de travail" et clique OK cela retourn une chaine vide donc false et si il fait annuler aussi !! mais je peux pas différencier ces 2 là !!!

    En fait si il clique sur ok en choisissant "poste de travail" je lui envoi un message "Hé mec... tu t'es trompé c'est pas un répertoire valid", si il fais annuler ou femer je lui dit rien...

    Le truc se serait d'avoir en grisé le boutton OK tous ce qui n'ai pas un répertoire valid.

    bye

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Alors comme ça:

    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
    Function Browse(out aPath :String) :TModalResult;
    var
      BrowseInfo  : TBrowseInfo;
      PIDL        : PItemIDList;
      Folder      : array[0..MAX_PATH] of Char;
    begin
      FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);
      BrowseInfo.hwndOwner      := Application.Handle;
      BrowseInfo.pszDisplayName := @Folder[0];
      BrowseInfo.lpszTitle      := 'Selectionné ou créer un dossier';
     
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or $40;
      CoInitialize(NIL);
     
      PIDL := SHBrowseForFolder(BrowseInfo);
     
      if Assigned(PIDL) then
      begin
        if SHGetPathFromIDList(PIDL, folder) then
        begin
          aPath  := folder;
          Result := mrOk;
        end
        else Result := mrIgnore;
      end
      else Result := mrCancel;
    end;
    mrOk : Répertoire valide.
    mrCancel : Annulation. (Fermeture)
    mrIgnore : Répertoire invalide.


  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    Tout simplement exacte AndNotOr.. comme d'hab.

    Voilà la function definitive (déclarer dans une unité libre "sans 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
    function Browse(xHandle:HWND; out aPath : String): TModalResult;
    var
      BrowseInfo  : TBrowseInfo;
      PIDL        : PItemIDList;
      Folder      : array[0..MAX_PATH] of Char;
    begin
      FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);
      BrowseInfo.hwndOwner      := xHandle;
      BrowseInfo.pszDisplayName := @Folder[0];
      BrowseInfo.lpszTitle      := 'Selectionné ou créer un dossier';
      BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or $40;
     
      CoInitialize(NIL);
     
      PIDL := SHBrowseForFolder(BrowseInfo);
      if Assigned(PIDL) then
      begin
        if SHGetPathFromIDList(PIDL, folder) then
        begin
          aPath  := folder;
          Result := mrOk;
        end
        else Result := mrIgnore;
      end
      else Result := mrCancel;
     
    end;
    Je ne connaissais pas du tout le terme Out : d'un fonction !!!

    Voilà comment je l'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Var
      Chemin: String;
    begin
      Case Browse(Application.Handle,Chemin) of
        mrIgnore :showmessage('Chemin invalide');
        mrOk :EditCheminSortie.Text := IncludeTrailingPathDelimiter(Chemin);
        mrCancel:;
      End;
    Merci à toi.


    Je l'aurais un jour.... je l'aurais...

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

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