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 :

Affichage sur deux écrans


Sujet :

Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Affichage sur deux écrans
    Bonjour

    N'ayant qu'un seul écran, je suis bien ennuyé pour résoudre le problème suivant soulevé par un utilisateur :


    Je travaille avec 2 écrans. L'écran en étendu se trouvant à gauche. Seule une portion gauche de la fenêtre de votre programme se place toujours en bas à droite et est bloquée. Il me faut chaque fois changer le paramétrage de mes écrans pour avoir accès. A savoir disposer mon écran étendu à droite. Ce qui me gène beaucoup. Auriez-vous une solution pour que le programme se place directement au centre de mon écran principal?
    Merci de bien vouloir prendre en compte mes souhaits.
    Ce programme mesure environ 750px L x 400px H. Il est lancé en poDesktopCenter.

    Quelle méthode verriez-vous ?

    Merci d'avance de toute idée.

  2. #2
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Salut

    poScreenCenter... il se centre alors sur un des écrans du bureau...

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Citation Envoyé par Whiler Voir le message
    Salut

    poScreenCenter... il se centre alors sur un des écrans du bureau...
    Bonjour à toi aussi,

    Logiquement oui (?) mais à en lire le mail...

  4. #4
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Comprends pas.. Desktop <> Screen...
    et vu la taille de ton appli... elle passe sur UN écran sans problème....

    http://docwiki.embarcadero.com/VCL/X...TForm.Position

  5. #5
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Citation Envoyé par Droïde Système7 Voir le message
    Ce programme mesure environ 750px L x 400px H. Il est lancé en poDesktopCenter.
    Citation Envoyé par Whiler Voir le message
    poScreenCenter

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    suis mal réveillé ce matin, je confond en effet DeskTop et Screen.

    Merci à toi, je vais compiler et donner cette mouture à tester

    poScreenCenter :
    La fiche conserve la taille définie à la conception mais elle est placée au centre de l'écran. Dans les applications multi-écran, la fiche peut être déplacée de cette position centrale afin de tenir complètement sur un écran, comme spécifié par la propriété DefaultMonitor.
    Je regarde...

  7. #7
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Depuis que j'ai eu un second moniteur, je n'utilise plus que poScreenCenter...
    Avec poDesktopCenter, la fiche est comme son nom l'indique, centrée sur le bureau.. donc à cheval sur les deux écrans lorsqu'on en a 2... si on en a 3, c'est moins gênant

    Ce qui me dérange dans l'email de ton utilisateur, c'est qu'il dise qu'il soit obligé de modifier le paramétrage de ses écrans... car cela voudrait dire qu'elle n'est pas centrée sur le bureau... ce qui est étrange à moins que tu n'aies du code qui la déplace ou que tu mémorises mal sa position pour la replacer via ton code au lancement suivant...

  8. #8
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Re,

    J'ai compilé une nouvelle mouture et ai indiqué l'endroit à cet utilisateur afin qu'il la teste. Je viendrais revenir donner des nouvelles.

    En effet désormais j'éviterai le poDesktopCenter.

    Ce qui me dérange dans l'email de ton utilisateur, c'est qu'il dise qu'il soit obligé de modifier le paramétrage de ses écrans... car cela voudrait dire qu'elle n'est pas centrée sur le bureau... ce qui est étrange à moins que tu n'aies du code qui la déplace ou que tu mémorises mal sa position pour la replacer via ton code au lancement suivant...
    Mais oui à cause de l'ajout d'un SplachScreen ça me donne bien des choses à modifier sur ma form principale. En effet par répercussion, le positionnement en est out !

    @+

  9. #9
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Citation Envoyé par Droïde Système7 Voir le message
    Mais oui à cause de l'ajout d'un SplachScreen ça me donne bien des choses à modifier sur ma form principale. En effet par répercussion, le positionnement en est out !
    Ah... ? ma fiche principale et ma splash sont en général tous les deux en poScreenCenter... je ne les positionne jamais (rarement) à la main...

  10. #10
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Dans ma modif, du coup tout est passé en poScreenCenter !

    tu me mets encore la puce à l'oreille, puisque ma Form principale est mémorisée en position par l'utilisateur, ce poScreenCenter ne doit pas être adapté.

    Edit : voici la réponse reçue à l'instant de l'utilisateur en question :

    Impeccable!!
    Bien centré plein milieu de l'écran.
    Formidable plus aucun problème.
    Merci pour tout !!

  11. #11
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    si pas mémorisé.. alors poScreenCenter...
    sinon poDesigned en vérifiant que tes limites soient bien comprises dans le bureau... sinon, poScreenCenter (ça lui évitera de devoir modifier sa config)

  12. #12
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Re

    sinon poDesigned en vérifiant que tes limites soient bien comprises dans le bureau...
    En effet je pensais à poDesigned.

    Mais que veux-tu dire par : "en vérifiant que tes limites soient bien comprises dans le bureau" ?

    Les limites de quoi ?

    @+

  13. #13
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Si l'utilisateur déplace ou redimensionne ta fiche... elle va avoir de nouvelles valeurs que tu stockes quelque part... (width, top, ...)

    Au lancement, avant d'affecter ces valeurs sauvegardées, il faut vérifier que celle-ci soit bien comprise dans les dimensions du bureau actuel...

    Exemple concret pour illustrer le problème :
    J'ai deux écrans en 800x600... Mon second écran est configuré comme étant à droite du premier... sa position sur le bureau est donc : 800,0;1599-599
    Je place ta fiche sur ce second écran... elle va donc avoir un Left >= 800...

    Je quitte ton appli... je change la position de mes écrans.. je mets le second au-dessus du premier... j'ai donc un écran : (0-800;0-1200)

    Je relance ton appli.. je ne vois plus ta fiche...

    Il faut donc vérifier que ta fiche est entièrement incluse dans le bureau (pas l'écran)... si ce n'est pas le cas, tu la recentres ou tu t'amuses à la décaler (mais c'est à peine plus chiant à coder)

  14. #14
    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 Droïde Système7 Voir le message
    Dans ma modif, du coup tout est passé en poScreenCenter !
    Sans être une erreur, ce n'est pas l'idéal. Seule la fiche principale est concernée. Les autres devraient être relatives soit à la fiche principale, soit à la fiche propriétaire.

    En tant qu'utilisateur, si je "tire" la fiche sur un autre écran, j'aimerais que les nouvelles fiches suivent
    Citation Envoyé par Whiler Voir le message
    Je quitte ton appli... je change la position de mes écrans.. je mets le second au-dessus du premier... j'ai donc un écran : (0-800;0-1200)
    Là, tu parles de la taille du bureau, mais pas de ses coordonnées. Le bound du desktop vaudra 0,800/-600,600

  15. #15
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Sans être une erreur, ce n'est pas l'idéal. Seule la fiche principale est concernée. Les autres devraient être relatives soit à la fiche principale, soit à la fiche propriétaire.
    c'est pas faux... quoique, la splash est un cas particulier car elle peut s'ouvrir avant que la fiche principale ne soit visible.. et donc, être relatif à de l'invisible, j'suis pas fan...

    Citation Envoyé par Andnotor Voir le message
    En tant qu'utilisateur, si je "tire" la fiche sur un autre écran, j'aimerais que les nouvelles fiches suivent
    et tu gères ça comment ? déjà, est-ce que tu le gères, et si oui, à la main ? avec des libs spécifiques, ... ?

    Citation Envoyé par Andnotor Voir le message
    Là, tu parles de la taille du bureau, mais pas de ses coordonnées. Le bound du desktop vaudra 0,800/-600,600
    Pas sûr ;o) ça doit dépendre de qui a la barre des tâches, non ?
    (de toute façon, pas grave pour l'exemple, vu que c'est le Left qui pose pb ;o))

  16. #16
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    J'ai "réactivé" les méthodes mémorisant le positionnement de certaines fiches.

    Andnotor disait :
    En tant qu'utilisateur, si je "tire" la fiche sur un autre écran, j'aimerais que les nouvelles fiches suivent
    Ouiiiiii je vois Faudrait donc ici une notion de "Client". Quel paramètre est l'idoine (y compris si multi-écrans) :
    1. poMainFormCenter ?
    2. poOwnerFormCenter ?

    Je redonne le lien de Whiler :
    http://docwiki.embarcadero.com/VCL/X...TForm.Position

    Andnotor disait aussi :
    Je quitte ton appli... je change la position de mes écrans.. je mets le second au-dessus du premier... j'ai donc un écran : (0-800;0-1200)
    là je suis un peu largué sur ce coup, comme s'y prendre ?
    Je ne parle pas du "comment mémoriser hein" mais du comment "mesurer sur les 2 écrans". Et si j'ai des users travaillant sur trois écrans ?

    Ça rejoint un peu ce que disait Whiler :
    Exemple concret pour illustrer le problème :
    J'ai deux écrans en 800x600... Mon second écran est configuré comme étant à droite du premier... sa position sur le bureau est donc : 800,0;1599-599
    Je place ta fiche sur ce second écran... elle va donc avoir un Left >= 800...

    Je quitte ton appli... je change la position de mes écrans.. je mets le second au-dessus du premier... j'ai donc un écran : (0-800;0-1200)

    Je relance ton appli.. je ne vois plus ta fiche...


    @+

  17. #17
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut Testé avec 3 écrans sous 7
    J'viens de coder ça vite fait, en testant depuis un bouton... ( = j'ai pas testé au lancement de l'appli.. = formcreate...)

    Si ça marche pas avant que la Form ne soit visible, ça te donnera tout de même des idées
    De même, c'est un premier jet.. n'hésitez pas à l'améliorer

    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
    uses ..., MultiMon;
     
    function TForm1.HasAllVisible: Boolean;
    var
      rDesktop: TRect;
      rCurrent: TRect;
      AppMon  : HMONITOR;
      iLoop   : Integer;
    begin
      Result := False;
     
      // Handle du moniteur contenant la fiche active
      AppMon := Screen.ActiveCustomForm.Monitor.Handle;
     
      for iLoop := 0 to Screen.MonitorCount - 1 do
      begin
        if (Screen.Monitors[iLoop].Handle = AppMon) then
        begin
          rDesktop := Screen.Monitors[iLoop].WorkareaRect;
     
          if GetWindowRect(Screen.ActiveCustomForm.Handle, rCurrent) then
          begin
            Result := ( rDesktop.Left <= rCurrent.Left ) and (rDesktop.Top <= rCurrent.Top)
                  and (rCurrent.Right <= rDesktop.Right) and (rCurrent.Bottom <= rDesktop.Bottom);
          end;
          Break;
        end;
      end;
    end;
    Pour info, ma source d'inspiration a été le code source de la procédure TCustomForm.SetWindowToMonitor; de l'unité Forms...

    Je renvoie True, uniquement si la fiche active est entièrement incluse sur un écran... en d'autres termes, si elle est entièrement visible mais à cheval sur 2 écrans, cela renvoit False...

  18. #18
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Bon, m'en doutais, ça marche pas sur FormCreate, car il n'y a pas encore de form active...

  19. #19
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut testé sur 3 écrans sous 7
    Fonctionne sur le FormCreate...

    Cette fois, si la fenêtre est complètement visible, même à cheval sur 2 écrans,cela renvoit True...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function TForm1.InDesktop: Boolean;
    begin
      Result := (Screen.DesktopLeft      <= Self.Left)
            and (Screen.DesktopTop       <= Self.Top )
            and (Self.Left + Self.Width  <= Screen.DesktopLeft + Screen.DesktopWidth)
            and (Self.Top  + Self.Height <= Screen.DesktopTop  + Screen.DesktopHeight);
    end;
    Comme pour l'autre code, c'est améliorable par exemple, si les résolutions différent entre les écrans... il se peut que le test renvoie True alors que la fiche n'est pas visible (et il faut donc utiliser Screen.Monitors pour s'en sortir...)

  20. #20
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut Exemple complet
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ManagePosition;
    end;
     
    procedure TForm1.ManagePosition;
    var
      iPreviousLeft , iPreviousTop   : Integer;
      iPreviousWidth, iPreviousHeight: Integer;
    begin
      // Charger les valeurs précédentes
      // ...
      iPreviousLeft   := -3000;  // depuis tes données... au lieu de ces constantes...
      iPreviousTop    := 50;
      iPreviousWidth  := 750;
      iPreviousHeight := 400;
     
      // Positionner la fenêtre
      Left   := iPreviousLeft;
      Top    := iPreviousTop;
      Width  := iPreviousWidth;
      Height := iPreviousHeight;
     
      Position := poDesigned;
     
      if not InDesktop then
      begin
        Position := poScreenCenter;    // Je préfère cette ligne si c'est pour la fiche principale
    //    Position := poOwnerFormCenter; // Celle-ci devrait fonctionner pour toutes les fiches... même la principale puisque :
                                       // Si la propriété Owner ne spécifie pas de fiche, cette position agit comme poMainFormCenter.
                                       // Si elle est définie pour une fiche principale, elle agit comme poScreenCenter.
      end;
    end;
     
    function TForm1.InDesktop: Boolean;
    begin
      Result := (Screen.DesktopLeft      <= Self.Left)
            and (Screen.DesktopTop       <= Self.Top )
            and (Self.Left + Self.Width  <= Screen.DesktopLeft + Screen.DesktopWidth)
            and (Self.Top  + Self.Height <= Screen.DesktopTop  + Screen.DesktopHeight);
    end;

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/11/2010, 19h32
  2. [Écran] Affichage sur deux écrans
    Par vlksoft dans le forum Périphériques
    Réponses: 1
    Dernier message: 17/11/2009, 11h55
  3. Réponses: 2
    Dernier message: 28/10/2008, 16h18
  4. [Ecran] Problème d'affichage sur un écran
    Par sylsau dans le forum Périphériques
    Réponses: 5
    Dernier message: 09/08/2006, 09h58
  5. Problème d'affichage sur un écran 16/9ème
    Par kurul1 dans le forum C++Builder
    Réponses: 2
    Dernier message: 23/01/2006, 11h51

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