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

C++Builder Discussion :

Comment fermer par programme un dialog affiché avec execute [IDE]


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut Comment fermer par programme un dialog affiché avec execute
    Bonjour,
    un petit problème qui semble tout bête à la base !!
    J'ai un TSaveDialog que j'affiche avec un "execute".
    Je voudrai dans certain cas pouvoir fermer ce dialog par programme.
    Comment faire ??? y'a pas de Close()...

    merci de votre aide !!
    Pascale38

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Vu que le Execute est bloquant cela semble difficile
    Faudrait un thread qui via un SendMessage soit simule le Clic soit envoi WM_CLOSE
    Une bidouille Delphi 100% API Win32 pour écrire dans un Dialogue Ouvrir (là c'est celui de NotePad) pour envoyer sa propre valeur
    Voir aussi Modifier un champ d'un TSaveDialog

    Autre solution, voir si tu peux fournir ta propre WndProc et via un bool, tu pourrais forcer la fermeture, par contre, cela ne réagi que lors d'une action utilisateur, peut-être dès le déplacement de la souris mais je pense que WM_NOTIFY n'arrive que sur un VRAI action comme un clic sur un élément
    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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Salut ShaiLeTroll !

    ni SendMessage(monDialog->Handle, WM_CLOSE, 0,0);
    ni PostMessage(monDialog->Handle, WM_CLOSE, 0,0);
    ne ferme le dialogue...

    Je vais regarder du côté de ton code pour simuler le clic sur ok.
    merci !
    Pascale38

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    J'ai bien compris l'idée de faire un
    SendMessage(HwndButton, BM_CLICK, 0, 0);

    mais je n'arrive pas à récupérer le HwndButton.
    Tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    lpszClass := 'Button';
    lpszWindow := 'OK';
    HwndButton  := FindWindowEx(HwndParent, HwndChildAfter, lpszClass, lpszWindow);
    'OK' c'est la caption de ton bouton???
    Ce qui veut dire que ça marche pas si le PC is in english ???
    En ce cas pas la peine que je cherche plus loin dans cette solution, vu que appli internationale...

    Arghhhh comment récupérer le handle de ce bouton !!!???

  5. #5
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut pour le bouton OK je crois que tu peux utiliser un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HWND HwndButton = GetDlgItem(HwndParent, IDOK);
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  6. #6
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Voici un exemple plus complet qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
        SaveDialog1->Execute();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::SaveDialog1Show(TObject *Sender)
    {
        HWND HwndParent = GetParent(((TSaveDialog*)Sender)->Handle);
        HWND HwndButton = GetDlgItem(HwndParent, IDCANCEL); // Bouton Annuler
        SendMessage(HwndButton, BM_CLICK, 0, 0); // Envoie un Click sur le bouton Annuler
    }
    //---------------------------------------------------------------------------
    J'ai mis le code dans le OnShow du TSaveDialog juste pour faire le teste. Je te fais confiance pour le mettre à la bonne place.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    merci beaucoup Crayon,
    ça marche nickel !!!!
    trop biennnnnnnnnnnnnnnn tu me sauves la vie !!!
    Allez hop hop, résolu !!!

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 429
    Points : 24 794
    Points
    24 794
    Par défaut
    @Pascale38, Tu l'as mis dans quel event ?
    Si tu l'a laissé dans le OnShow, autant ne pas appeler Execute, cela serait plus simple non ?
    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

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    ShaiLeTroll : ahahah
    Là j'ai juste fait une petite appli pour tester, en fait j'ai mis le test dans un "OnTimer".
    Puisque tu veux tout savoir, dans ma vraie appli il sera dans le onClose de la fenêtre parent, OnClose qui est lui même appelé par ma fiche principale dans un cas très particulier où je perds la communication avec mon appareil et où je ne dois plus rien afficher dans ce cas là...

    Voilà tu sais tout
    merci encore !!!

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Faudrait que je teste ce code mais avec un Dialogue externe à une application de test, juste une bidouille pour jouer pas pour de la prod
    J'ai un peu le même problème que toi Pascale38 mais je n'ai pas la main sur le Dialog, voir comment je peux choper le bon Handle compatible avec GetDlgItem, ça sera mieux que mes FindWindowEx\GetWindowText d'où ma curiosité
    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

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Hop je relance la discussion
    Comment connaitre le petit nom du bouton (ici dans l'exemple IDCANCEL) ?
    En fait ça ne fonctionne pas avec un Print Dialog (à priori le bouton cancel a un autre identifiant) et je ne sais pas où trouver l'info ?

    merci !!!!!!!!!!
    Pascale38

  12. #12
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Citation Envoyé par Pascale38 Voir le message
    Comment connaitre le petit nom du bouton (ici dans l'exemple IDCANCEL) ?
    Salut, j'utilise le logiciel WinSpy++ pour connaitre le Control ID.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Merci Crayon, sympa ton outil !
    Donc je vois que le bouton cancel d'une boite de dialogue save a un Control ID qui vaut 2, c'est comme ça que tu en as déduit que son petit nom était IDCANCEL ? Parce que le bouton cancel du print dialog a aussi un ID de 2...
    Et je ne vois nulle part l'info IDCANCEL ?

  14. #14
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Tiré de winuser.h:
    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
    /*
     * Dialog Box Command IDs
     */
    #define IDOK                1
    #define IDCANCEL            2
    #define IDABORT             3
    #define IDRETRY             4
    #define IDIGNORE            5
    #define IDYES               6
    #define IDNO                7
    #if(WINVER >= 0x0400)
    #define IDCLOSE         8
    #define IDHELP          9
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0500)
    #define IDTRYAGAIN      10
    #define IDCONTINUE      11
    #endif /* WINVER >= 0x0500 */
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Donc le bouton cancel du print dialog a bien pour nom IDCANCEL mais le code suivant ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HWND HwndParent = GetParent(((TPrintDialog*)Sender)->Handle);
    HWND HwndButton = GetDlgItem(HwndParent, IDCANCEL);
    SendMessage(HwndButton, BM_CLICK, 0, 0);
    --> HwndButton vaut NULL...

    et ça ne fonctionne pas non plus avec un find dialog, par contre lui se ferme tout seul si la form est fermée...

    Pffff aucun ne fonctionne pareil, c'est la galère et je ne sais pas comment fermer mon print dialog du coup

  16. #16
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, tu n'as pas besoin de faire le GetParent pour cette fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HWND HwndParent = ((TPrintDialog*)Sender)->Handle;
    HWND HwndButton = GetDlgItem(HwndParent, IDCANCEL);
    SendMessage(HwndButton, BM_CLICK, 0, 0);
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Effectivement ça marche comme ça !
    Heu je suis un peu perdue, tu pourrai m'expliquer cette histoire de GetParent ??
    merciiiiiiiiiiiiiiiii

  18. #18
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    GetParent est une fonction de l'API Win32 qui renvoie le Handle parent d'une fenêtre.
    Dans le cas présent tu demandais le parent de la TPrintDialog c'est à dire la fenêtre appelant.

    L'aide de GetParent dans le MSDN (Google search: msdn getparent function) - en Anglais:
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Oui j'ai bien compris que cette fonction renvoie le handle du parent, ce que je ne comprends pas c'est pourquoi pour un save dialog il faut passer par le handle du parent pour récupérer le handle du bouton et pas pour un print dialog...
    En fait même c'est devoir passer par le handle du parent d'un save que je ne comprends pas...
    Heu je suis pas sûre d'être très claire là

  20. #20
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Si c'est clair.
    Utilise WinSpy++ il te donnera sans doute l'arborescence des Handle.

    J'utilise pour ma part MiniSpy qui a cette fonctionnalité.
    http://www.codeproject.com/Articles/1732/MiniSpy

    Ce peut-être lié à l'implémentation de TSaveDialog vs TPrintDialog dans ce cas il faut regarder dans la VCL. Ou Sinon à la façon dont ces fonctions sont construites dans Windows.
    Mais dans les 2 cas MiniSpy/WinSpy te donnera la réponse car il affiche aussi les classes de fenêtre et tu verras tout de suite si la fenêtre est du Win32 pure ou si elle est encapsulé dans un T* (de type VCL).

    Edit: pour l'arborescende des Handle je dois confondre avec Spy++ (qui est un outil de Visual Studio). Mais quand tu déplace MiniSPy au dessus d'un controle il te donne le Handle et son parent ce qui revient au même (en plus pénible).

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

Discussions similaires

  1. Comment fermer un programme en barre des tâches ?
    Par chris-57 dans le forum Scripts/Batch
    Réponses: 10
    Dernier message: 19/11/2009, 13h56
  2. Comment fermer un programme ouvert avec la fonction Shell
    Par nicolas2603 dans le forum VBA Access
    Réponses: 13
    Dernier message: 08/02/2008, 21h01
  3. Comment modifier par programmation une form crée lors de l'execution
    Par Fab.asia dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 31/07/2007, 15h47
  4. Comment fermer un programme en execution
    Par Nik_Meilleur dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2007, 18h33
  5. Réponses: 1
    Dernier message: 18/02/2007, 21h30

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