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 :

Taille des fiches par rapport à l’écran


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut Taille des fiches par rapport à l’écran
    Bonjour
    Quel est le meilleur moyen qui permet d’adapter les tailles de toutes les fiche par rapport à l’écran
    C’est à dire le logiciel prend la même taille qu’un écran 13*pouce ou 21

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    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 124
    Par défaut
    En fait, tu parles de concevoir une application qui est indépendante du DPI

    Que l'écran 13" ou 21" ce n'est qu'un aspect, il manque la notion de résolution et le nombre de pixel, les deux écrans peuvent être à 72 DPI, ton application aura ainsi la même taille sur le deux, puisque physiquement les pixels sont de la même taille.
    Ce qui est change c'est que selon l'écran, tu auras une résolution différente, entre 72 et 96 DPI la plupart du temps, sauf sur les écrans 4K qui seraient plutôt en 240 DPI

    Tu as plusieurs méthodes, laisser l'OS gérer pour toi le HIGH DPI et le Zoom de 100 à 150% voire 200% pour un Windows récent.
    Utiliser la méthode ScaleBy pour zoomer l'application, cela ne modifie que la taille des composants mais pas les images, en VCL en tout cas.
    Maitrisez-vous Anchors, Align ou la propriété Scaled ?


    En FMX, profiter du dessin vectoriel pour agrandir aussi bien composants que image, cela demande un certain travail.

    Avez-vous fait une recherche Google "Delphi Taille des fiches par rapport à l’écran site:developpez.net" ?
    Vous auriez déjà eu très vite :
    - l'affichage de mes fenetre par rapport à la résolution de l'ecran
    - Ajustement des composants d'une forme selon la résolution de l'écran
    ...
    Tellement de fois répété !

    Le support du High DPI est l'une des nouveautés de l'IDE Delphi 11 que l'IDE soit lui même non pas zoom par Windows pour compenser la résolution mais gérer par l'application pour aspect visuel plus fin.

    Sur un Delphi sans support High DPI
    Il vous faut donc développer et concevoir votre application pour quelle puisse tenir dans la résolution et le dpi de l'écran 13" où un pixel logique = pixel physique, car sinon cela sera peu utilisable.
    C'est sur l'écran 21" avec un pixel logique = plusieurs pixel physique, et plusieurs mécanisme entre le Scaled\ScaleBy, votre application sera dilaté en terme de pixel pour occuper à l'écran la même surface (soit 13" pouce au maximum, donc n'oubliez pas aussi de gérer le plein écran aussi)

    Sur un Delphi avec support High DPI, lisez la documentation High-DPI on Windows 10 avec une gestion des vos images via TImageCollection dont on a parlé récemment sur le forum.
    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 très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut
    après recherche et suivi des liens partagé par vous j'ai trouvé ici ce code:

    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
    procedure ScaleForm
        (F: TForm; ScreenWidth, ScreenHeight: LongInt) ;
    begin
       F.Scaled := True;
       F.AutoScroll := False;
       F.Position := poScreenCenter;
      // F.Font.Name := 'Arial'; 
       if (Screen.Width <> ScreenWidth) then begin
         F.Height :=
             LongInt(F.Height) * LongInt(Screen.Height)
             div ScreenHeight;
         F.Width :=
             LongInt(F.Width) * LongInt(Screen.Width)
             div ScreenWidth;
         F.ScaleBy(Screen.Width,ScreenWidth) ;
       end;
    end;
    hélas, je ne sais pas ou le placer ! quelqu'un pourra me guider et surtout m'illustrer par un exemple ?
    dois je mettre le code dans un évènement OnShow par exemple ? sachant que ça génère une exception

  4. #4
    Membre émérite
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Par défaut
    Bonjour,

    dans le OnCreate de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm3.FormCreate(Sender: TObject);
    begin
      ScaleForm(Form3, 800, 600);
    end;
    Cordialement,

    @+

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut
    Merci pour votre réponse
    Toutefois pour quoi avez vous utilisé les valeurs 800 et 600 ?
    Si j’ai un écran 13*pouces et un autre 21 pouces, comment dois-je gérer ça ?

  6. #6
    Membre émérite
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    Merci pour votre réponse
    Toutefois pour quoi avez vous utilisé les valeurs 800 et 600 ?
    Si j’ai un écran 13*pouces et un autre 21 pouces, comment dois-je gérer ça ?
    j'ai choisi ces valeurs arbitrairement pour illustrer l'utilisation de la procedure
    mais je n'ai pas testé le code et je ne suis pas certain qu'il réponde à tes attentes !

    je te renvois sur le message de ShaiLeTroll qui explique bien ce qu'il faut prendre en compte:
    Citation Envoyé par ShaiLeTroll Voir le message
    ...
    Que l'écran 13" ou 21" ce n'est qu'un aspect, il manque la notion de résolution et le nombre de pixel, les deux écrans peuvent être à 72 DPI, ton application aura ainsi la même taille sur le deux, puisque physiquement les pixels sont de la même taille.
    Ce qui est change c'est que selon l'écran, tu auras une résolution différente, entre 72 et 96 DPI la plupart du temps, sauf sur les écrans 4K qui seraient plutôt en 240 DPI

    Tu as plusieurs méthodes, laisser l'OS gérer pour toi le HIGH DPI et le Zoom de 100 à 150% voire 200% pour un Windows récent.
    Utiliser la méthode ScaleBy pour zoomer l'application, cela ne modifie que la taille des composants mais pas les images, en VCL en tout cas.
    Maitrisez-vous Anchors, Align ou la propriété Scaled ?

    ...
    Cordialement,

    @+

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut
    Citation Envoyé par Cirec Voir le message
    j'ai choisi ces valeurs arbitrairement pour illustrer l'utilisation de la procedure
    mais je n'ai pas testé le code et je ne suis pas certain qu'il réponde à tes attentes !

    je te renvois sur le message de ShaiLeTroll qui explique bien ce qu'il faut prendre en compte:

    Cordialement,

    @+
    la réponse de ShaiLeTroll n'est toujours pas claire !
    je veux un exemple illustratif, genre la procédure doit prendre en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ScreenWidth := Fprinc.Width;
      ScreenHeight := Fprinc.Height;
    au lieu de 600 et 800
    normalement ça devrait marché ainsi !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 968
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    la réponse de ShaiLeTroll n'est toujours pas claire !
    C'est le besoin qui ne l'est pas vraiment. Qu'est-ce qui ne va pas à laisser l'application se dimensionner automatiquement en fonction du DPI ?

    La fonction que tu proposes, c'est la comparaison entre le moniteur de l'utilisateur et celui utilisé pour le développement. Forcément qu'il faudra stocker en dur la résolution de ton écran.

  9. #9
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est le besoin qui ne l'est pas vraiment. Qu'est-ce qui ne va pas à laisser l'application se dimensionner automatiquement en fonction du DPI ?

    La fonction que tu proposes, c'est la comparaison entre le moniteur de l'utilisateur et celui utilisé pour le développement. Forcément qu'il faudra stocker en dur la résolution de ton écran.
    VOICI l'image ci-dessous qui illustre mon besoin,
    moi étant développer j'ai un écran 21 pouce, parfois je trouve des clients ayant des petit écran dont l'affichage est brouillé
    Images attachées Images attachées  

  10. #10
    Membre émérite
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    la réponse de ShaiLeTroll n'est toujours pas claire !
    je veux un exemple illustratif, genre la procédure doit prendre en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ScreenWidth := Fprinc.Width;
      ScreenHeight := Fprinc.Height;
    au lieu de 600 et 800
    normalement ça devrait marché ainsi !
    Bon,

    pour adapter un simple changement de résolution, taille écran avec les mêmes dpi
    j'opterai pour quelque chose comme ça:

    Hypothèse:"Dison que j'ai créé un programme sur mon PC avec une résolution d'écran de 1280 en largeur
    et je veux l'exécuter sur un PC avec un écran en 800 de largeur.
    "
    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
    procedure ScaleFormEx(F: TForm; CurrentWidth, NewWidth: Integer) ;
    var
      R: Real;
    begin
      F.Scaled := False;
      F.AutoScroll := True;
      R := NewWidth / CurrentWidth;
      F.ScaleBy(NewWidth, CurrentWidth);
      F.Width := Round(R * F.Width);
      F.Height := Round(R * F.Height);
      F.Position := poScreenCenter;
      F.Scaled := True;
      F.AutoScroll := False;
    end;
     
    procedure TForm3.FormCreate(Sender: TObject);
    begin
      ScaleFormEx(Form3, 1280, 800);
    end;
    et pour revenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ScaleFormEx(Form3, 800, 1280);
    pour le reste (dpi) je ne suis pas en mesure de faire des testes par manque de matériel adapté
    et comme mes dev sont perso je n'ai pas encore été confronté à ceci.

    j'espère que ça t'aidera quand même un peu.

    Cordialement,
    @+

  11. #11
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut
    Citation Envoyé par Cirec Voir le message
    Bon,

    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
    procedure ScaleFormEx(F: TForm; CurrentWidth, NewWidth: Integer) ;
    var
      R: Real;
    begin
      F.Scaled := False;
      F.AutoScroll := True;
      R := NewWidth / CurrentWidth;
      F.ScaleBy(NewWidth, CurrentWidth);
      F.Width := Round(R * F.Width);
      F.Height := Round(R * F.Height);
      F.Position := poScreenCenter;
      F.Scaled := True;
      F.AutoScroll := False;
    end;
     
    procedure TForm3.FormCreate(Sender: TObject);
    begin
      ScaleFormEx(Form3, 1280, 800);
    end;
    et pour revenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ScaleFormEx(Form3, 800, 1280);
    étant donné que le PC du client est de même résolution que le mien l'affichage dans ce cas l'affichage doit rester le même 'grand pour une meilleure visibilité par rapport à l'écran) n'est ce pas ?
    il doit y avoir une condition de test, genre si cet écran est petit donc exécuter la procédure sur l'évènement OnCreate ou OnShow

Discussions similaires

  1. [XL-2003] Taille des shape par rapport à columswidth
    Par luckyalan dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/02/2014, 12h14
  2. Réponses: 7
    Dernier message: 19/08/2013, 10h30
  3. Réponses: 1
    Dernier message: 22/02/2012, 18h32
  4. taille du menu par rapport au corps du site
    Par kykyn dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 25/07/2005, 20h42
  5. [débutant]Desactiver des champs par rapport a un select
    Par Pymm dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/02/2005, 17h24

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