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 :

TFileOpenDialog position d'initialisation [Système/Fichiers/API]


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut TFileOpenDialog position d'initialisation
    Bonjour,

    J'utilise TFileOpenDialog et TFileSaveDialog sur un système multi-écran. Je place le composant sur la form et quand je fais un :

    ou un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenDialog->Execute(Application->Handle);
    Cette fenêtre de dialogue apparaît toujours sur l’écran principal et non pas sur l'écran secondaire, là ou mon application tourne.

    Savez-vous comment je peux forcer la fenêtre de dialogue sur l'écran de mon application ?

    Merci a tous

    Cordialement

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut BIPBIP59
    Si tu dois ouvrir ta Form2 juste avant l'ouverture du TFileOpenDialog, tu peu essayer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Form2->Show();
    OpenDialog1->Execute();
    il est aussi possible de mettre la Form2 au premier plan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Form2->BringToFront();
    OpenDialog1->Execute();

  3. #3
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Je l'ai pas essayé, mais y a une solution ici qui fait plein sens:

    http://www.delphigroups.info/2/21/290728.html

    J'ai essayé ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm2::OpenDialog1Show(TObject *Sender)
    {
      TOpenDialog* dlg = (TOpenDialog*)Sender ;
      MoveWindow(dlg->Handle,0,0,0,0,true) ;
      Abort() ;
    }
    Et ça positionne le OpenDialog à la postion 0,0 de la partie client du parent du dialogue.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    Merci pour vos réponses, hélas cela ne fonctionne pas pour mon cas.
    Pour la première solution proposé par blondelle je permet d’ajouter un complément d’information, car mon appli n’a qu’une seule form qui est exécutée sur l’écran secondaire, elle est déjà visible et active et c’est elle qui ouvre ma fenêtre de dialogue (par un simple menu). Malgré tout elle s’ouvre systématiquement dans l’écran principal.

    Et la seconde solution de Guyt54 qui me convenait parfaitement, sauf que j’utilise un TFileOpenDialog ou un TFileSaveDialog et hélas contrairement au TOpenDialog, ils ne possèdent pas d’event OnShow ....

    merci encore c’était vraiment bien sympathique de votre part.

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Peut tu preciser quelle version de BCB tu utilise
    Quand tu parle d'ecran, tu parle d'ecrans par exemple de 19 pouces, ou tu parle d'une fenetre sur laquelle s'affiche deux Forms

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    Salut blondelle

    j'utilise Embarcadero® RAD Studio XE.

    Et j'ai 2 écrans physiques 19 pouces, l'application tourne sur l'écran n°2 (le secondaire) et les fenêtres de dialogue s'affichent sur l'écran n°1 (le principal)

  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Deux ecrans 19 pouces je l'ai compris a ta derniere reponse, malheureusement cela depasse mes competences, mais probablement que quelqu'un te proposera une solution ou une piste
    Desole

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    Pas de problème, en tout cas merci te ton aide et de ton intérêt à ma question.

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    J'ai fait quelques recherches apparament il faut utiliser les API
    EnumDisplayMonitors()
    GetMonitorInfo()

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    Merci pour tes recherches, en fait j'utilise déjà ce principe pour forcer l'affichage des forms sur l'un ou l'autre des moniteurs :
    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
     
              int nb,num;
              Forms::TMonitor *m;
              TForm *form;
              if (  ((form=dynamic_cast<TForm*>(Owner))!=NULL)
                  &&((nb=Screen->MonitorCount)>1)
                  &&((num=(form->Monitor->MonitorNum+1)%nb)>=0)
                  &&((m=Screen->Monitors[num])!=NULL))
              {
                 Left=m->Left;
                 Top=m->Top;
                 Height=m->Height;
                 Width=m->Width;
              } else if (form) {
                 Left=form->Left+form->Width/4;
                 Top=form->Top+form->Height/4;
                 Height=form->Height/2;
                 Width=form->Width/2;
              }
    mais c'est pas suffisant pour les fenêtres de dialogue...

  11. #11
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Tu peu recuperer le Handle de l'ecran du moniteur comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HANDLE hndl = Screen->Monitors[NumeroMonitor]->Handle;
    Regarde dans l'aide en ligne du TFileOpenDialog et duTFileSaveDialog sue HANDLE, sur TOpenDialog j'ai ceci
    Spécifie le handle de fenêtre de la boîte de dialogue.
    __property HWND Handle = {read=FHandle, nodefault};
    Description
    La propriété Handle, qui fournit un accès au handle de fenêtre de la boîte de dialogue après un appel à Execute, peut être utilisée dans les gestionnaires d'événements OnShow et OnClose. Handle est initialisée à 0 après la fermeture de la boîte de dialogue
    Il y a surement un Evenement sur lequel tu pourra adapter l'astuce de Guyt54

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    J'ai bien essayé ce matin d’initialiser la position de la fenetre de dialogue avec l'astuce à Guyt54 avant de faire l'Execute() mais ça marche pas non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                RECT r1,r2;
                OpenDialog->DefaultFolder=ExtractFilePath(s);
                OpenDialog->FileName  =ExtractFileName(s);
                GetWindowRect(FormMain->Handle, &r1 );
                GetWindowRect(OpenDialog->Handle, &r2 );
                MoveWindow(OpenDialog->Handle,
                            r1.left,r1.top, r2.right-r2.left,
                             r2.bottom-r2.top, true );
                OpenDialog->Execute(Application->Handle);

  13. #13
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Il faut que ce soit dans un Evenement de TFileOpenDialog ou du TFileSaveDialog

  14. #14
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 055
    Par défaut
    Je vois que ceci a été tenté OpenDialog->Execute(Application->Handle);,
    mais il savoir que le Execute() sans paramètre, utilise Application->ActiveFormHandle ou Application->Handle.
    Cela ne doit pas changer grand chose

    as-tu tenté ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenDialog->Execute(Form1->Handle);
    Normalement OpenDialog->Handle AVANT OpenDialog->Execute est égal à Zéro !
    Guyt54 a bien mis le code dans le OnShow un évènement du TOpenDialog
    le TFileOpenDialog n'a pas de OnShow mais un OnExecute !

    TOpenDialog = Win32 (95 à XP)
    TFileOpenDialog = Vista !
    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

  15. #15
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut ShaiLeTroll
    Le probleme est qu'il utilise deux moniteurs de 19 pouces un pour l'appli un pour les boites de dialog

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Je vois que ceci a été tenté
    as-tu tenté ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenDialog->Execute(Form1->Handle);
    bien joué, ça marche !!!!!!!!!




    Merci à tous !!!!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2013, 07h03
  2. [XSLT]position d'un element de valeur specifique
    Par squat dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/07/2002, 16h42
  3. Position du curseur dans Edit
    Par MrJéjé dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 17h09
  4. Réponses: 2
    Dernier message: 17/05/2002, 20h37
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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