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 :

Stockage position application sur 2 écrans


Sujet :

Langage Delphi

  1. #1
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut Stockage position application sur 2 écrans
    Bonjour à tou(te)s

    Petit problème que beaucoup ont surement eu et ont sans doute déjà réglé mais là je cherche un peu la meilleure solution.

    Soit une application VCL en Delphi 10.3 qui retient sa position sur l'écran à la fermeture et qui se repositionne aux même coordonnées quand on la relance !

    Problème : Le matin, l'utilisateur travaille sur 2 écrans et positionne l'application sur le second écran à droite.
    L'après-midi, il n'a plus que son portable et relance l'application. Là, l'application se positionne aux coordonnées en dehors de l'écran visible.
    Il faudrait que je détecte si 2 écrans sont actifs et dans le cas contraire, repositionner l'application au milieu de l'écran principal.

    Je sais qu'il y a de nombreux éléments disponibles dans l'objet Screen mais je ne vois pas trop comment les utiliser au mieux.

    Est-ce qu'il suffit d'utiliser Screen.MonitorCount pour avoir le nombre de moniteurs "allumés" ??
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            if Screen.MonitorCount = 1 then
            begin
              if LeftPosition > Screen.Width then
                LeftPosition := (Screen.WorkAreaWidth - Form.Width) div 2;
            end;
    ???

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    J'avais fait ça (en lazarus en fait mais cela doit pouvoir s'appliquer à DELPHI).

    Le test se fait lors de l'activation de l'application car sur un portable tu peux débrancher l'UC et te retrouver en réunion et il faut également que l'appli se positionne comme il faut.

    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
    procedure TSqliteV.AppActivation(Sender : TObject);
    Var MaxSize : Integer;
        nI      : integer;
    begin
        // tester les positions et les écrans
        MaxSize := 0;
        for nI :=0 to Pred(Screen.MonitorCount) do
            MaxSize := MaxSize + Screen.Monitors[nI].Width;
        if Left > MaxSize then
        Begin
            top := 0;
            Left := 0;
        end;
     
    end;
    Cordialement

  3. #3
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Merci, ça me confirme que le MonitorCount indique bien le nombre de moniteur "actifs".
    Je vais donc régler le problème de cette façon.

    Bonne journée,

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Ce serait mieux de se baser sur la surface du bureau par Screen.DesktopRect. Ne pas oublier que les coordonnées peuvent être négatives suivant la position des écrans secondaires par rapport au principal.

    Et pour la détection "à chaud" des modifications d'affichage : WM_DISPLAYCHANGE (aussi pour la rotation des tablettes).

  5. #5
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ce serait mieux de se baser sur la surface du bureau par Screen.DesktopRect. Ne pas oublier que les coordonnées peuvent être négatives suivant la position des écrans secondaires par rapport au principal.

    Et pour la détection "à chaud" des modifications d'affichage : WM_DISPLAYCHANGE (aussi pour la rotation des tablettes).
    à l'origine je faisais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            LeftPosition := Reg.ReadInteger('Left');
            if LeftPosition > Screen.DesktopWidth then
              LeftPosition := (Screen.DesktopWidth - TForm(Form).Width) div 2;
    Mais un client s'est plaint que l'application disparait quand même.
    Comme je n'ai pas de solution facile pour tester ça au bureau , je cherche un peu à l'aveuglette :-(

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    As-tu géré MonitorCount pour que ton utilisateur puisse avoir une configuration si il travaille en Portable ou Portable + Ecran ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if MonitorCount = 1 then
      LeftPosition := Reg.ReadInteger('Left')
    else
      LeftPosition := Reg.ReadInteger(Format('Monitor[%d]_Left', [MonitorCount]))
    Idem pour le WriteInteger, tu as bien deux niveaux de configuration

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if MonitorCount = 1 then
      Reg.WriteInteger('Left', LeftPosition )
    else
      Reg.WriteInteger(Format('Monitor[%d]_Left', [MonitorCount]), LeftPosition )

    Pense aussi lorsque les écrans sont inversés, tu peux avoir un utilisateur avec un écran sur sa droite + centre, un autre utilisateur avec un écran sur sa gauche + centre
    Sous Windows, tu indiques l'écran principal, tu dois déja savoir quel est l'écran principal et te méfier comme le mentionne AndNotOr dans quel sens sont exprimés les dimensions.

    La mémoire de positions d'un programme a toujours été source d'emmerde de maintenance, je ne le faisais que si l'utilisateur le réclamait.
    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
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Mais un client s'est plaint que l'application disparait quand même.
    Comme je l'ai dit, si l'écran secondaire est à gauche du principal, son left est négatif. Pour deux écran disons de 1024, les X iront de -1024 à +1024. Tu ne peux donc tout simplement pas te baser sur la largeur de 2048.

    Même chose en hauteur si les écrans sont superposés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    uses Math;
     
    Left := EnsureRange(LeftPosition, Screen.DesktopLeft, Screen.DesktopRect.Right -Width);
    Top  := EnsureRange(TopPosition, Screen.DesktopTop, Screen.DesktopRect.Bottom -Height);

  8. #8
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    As-tu géré MonitorCount pour que ton utilisateur puisse avoir une configuration si il travaille en Portable ou Portable + Ecran ?


    Pense aussi lorsque les écrans sont inversés, tu peux avoir un utilisateur avec un écran sur sa droite + centre, un autre utilisateur avec un écran sur sa gauche + centre
    Sous Windows, tu indiques l'écran principal, tu dois déja savoir quel est l'écran principal et te méfier comme le mentionne AndNotOr dans quel sens sont exprimés les dimensions.

    La mémoire de positions d'un programme a toujours été source d'emmerde de maintenance, je ne le faisais que si l'utilisateur le réclamait.
    J'avoue que je n'avais pas pensé à gérer plusieurs config.
    Merci pour l'idée

  9. #9
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Comme je l'ai dit, si l'écran secondaire est à gauche du principal, son left est négatif. Pour deux écran disons de 1024, les X iront de -1024 à +1024. Tu ne peux donc tout simplement pas te baser sur la largeur de 2048.

    Même chose en hauteur si les écrans sont superposés.
    [/CODE]
    Merci , là aussi, l'idée des 2 écrans superposés ne me serait pas venu à l'idée

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

Discussions similaires

  1. Centrer Application sur l'écran
    Par donnadieujulien dans le forum Débuter
    Réponses: 8
    Dernier message: 13/04/2011, 17h51
  2. Exécuter application sur double écran
    Par willytito dans le forum Windows XP
    Réponses: 5
    Dernier message: 04/03/2010, 16h51
  3. position firefox sur configuration à écrans multiples
    Par bernard vacher dans le forum Firefox
    Réponses: 1
    Dernier message: 30/07/2008, 10h21
  4. position controle sur l'écran
    Par Papy214 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/05/2008, 15h20
  5. Application sur plusieurs écrans
    Par DR dans le forum C#
    Réponses: 5
    Dernier message: 24/07/2007, 10h07

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