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 :

Affichage soft correct avec l'agrandissement ergonomique W7


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Points : 27
    Points
    27
    Par défaut Affichage soft correct avec l'agrandissement ergonomique W7
    Bonjour,

    Nous développons depuis plusieurs années des programmes sous Delphi 7. Depuis l'arrivé de Windows 7, nous avons un problème d'affichage sous nos programmes.

    Je m'explique, avec Windows 7, l'utilisateur à la possibilité d'améliorer sa qualité de lecture en agrandissant l'ensemble à 125% (moyenne) ou 150% (grande). Lorsqu'il utilise la taille standard (100%) nos programmes s'affichent correctement, par contre avec l'un des deux agrandissement décrit ci-dessus, tout ne se met plus en place. Dans les fenêtres apparaissent des scrollbar partout, les boutons ne sont plus aux même endroits ou directement visibles, etc...

    Avez-vous déjà rencontré ce problème ? avez-vous trouver une solution ?

    Dans l'attente de vos réponses, meilleures salutations.

  2. #2
    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
    Tu utilises ScaleBy pour effectuer le zoom ?
    Si les Anchors et Align sont correctement choisi (très important), le redimensionnement provoque le décalage des composants pour compenser le zoom, c'est ce qui garanti que tes composants reste à la bonne place relative !
    Mais de mauvaises combinaisons peuvent avoir un effet pervers !

    J'ai maintenu une application avec cette fonctionnalité, j'avoue je ne l'ai pas testé sous Seven, et je ne suis pas sur que bcp de CC l'ont fait !
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    En fait le zoom est effectué par Windows directement. Je ne sais pas s'il est possible de le désactiver au démarrage du programme ?

  4. #4
    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
    Ah !
    Ce n'est pas une fonctionnalité de ton application mais celle de l'OS !
    Je ne savais pas ! et c'est bon à savoir !

    Je pense qu'une bonne gestion des Anchors et Align (test en redimensionnant tes fenêtres) reste d'actualité, car cela doit servir de base de travail à W7 !

    Voir aussi OnResize, Scaled, PixelsPerInch, tu peux avoir des infos qui te permettrait de corriger manuellement l'affichage, et peut-être même l'interdire avec Scaled à false ?
    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

  5. #5
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    C'est marrant je viens de me battre pendant presque 6 mois avec un problème similaire...

    Voici quelques éléments qui devraient t'aider :
    L'IDE mémorise la résolution de l'écran au moment de la conception des fiches. Il s'agit de la propriété PixelsPerInch de chaque TForm.
    Au lancement de l'appli, la VCL lit la résolution de l'écran du poste où elle s'exécute (concrêtement, c'est la taille de la police par défaut) et définit la propriété PixelsPerInch de TScreen.
    Si au moment de la création de la fiche, la valeur de son PixelsPerInch ne correspond pas à celle du TScreen, la fiche est automatiquement redimensionnée pour l'agrandir du même rapport.
    Si dans ta fiche tu crées certains composants dynamiquement, tu n'appliques probablement pas le même redimensionnement et tes composants sont toujours créé comme si l'écran était en 96 Dpi, ce qui se traduit par un affichage catastrophique...
    Cette fonctionnalité peut être désactivée fiche par fiche avec la propriété Scaled du TForm.

    Passe toutes tes fiches à Scaled = false et les écrans auront la même taille que tu sois en grandes polices ou en petites polices.

    Si tu veux faire un test rapide, tu peux égalements bidouiller TScreen pour forcer PixelsPerInch à 96 Dpi quelles que soit la résolution réelle du bureau (attention, la propriété est en lecture seule, il faut forcer la valeur de l'attribut privé... d'où quelques bidouilles).
    Dans W7, tu as également une option de compatibilité "désactiver le redimensionnement automatique". Tu peux essayer de la cocher. Mais je n'ai jamais vu la différence avec ou sans...

    Quel est le rapport avec W7 ? Ca reste encore un mystère pour moi. Sur les tests que j'ai réalisé, TScreen définissait toujours son PixelsPerInch à 96 Dpi avec Windows XP, quel que soit la résolution du bureau (ce qui reviendrait à dire que la fonctionnalité ne servait à rien dans Delphi ).
    Par contre sous W7, PixelsPerInch s'allimente en 96, 120, ou 150 en fonction de la taille de la police du bureau...

    Autre mystère, W7 semble faire exactement le contraire de ce que dit Microsoft dans ses docs :
    En principe W7 redimensionne automatiquement les écrans en fonction de la taille de la police, sauf si l'application s'est déclarée "dpiAware" (soit en appelant explicitement une API, soit dans le manifest de l'exe).
    Si l'appli ne s'est pas déclarée dpiAware, les API qui lisent la résolution de l'écran sont censés renvoyer toujours 96 dpi quelque que soit la taille de la police... En pratique dans mes tests, dpiAware n'a aucun effet.

    Sur mon problème, j'avais la même déformation d'affichage que si le poste était en grande police... alors que les postes en questions (pas tous) étaient configurés en petites polices...

  6. #6
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 593
    Points
    593
    Par défaut
    Cela mérite d'être applaudit merci Franck
    <On fait la science avec des faits, comme on fait une maison avec des pierres : mais une accumulation de faits n'est pas plus une science qu'un tas de pierres n'est une maison> **Poincaré**

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup pour ta réponse. Je vais prendre note de tout ce dont tu as parlé et mettre à jour mon programme.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Alors effectivement le fait de mettre "scaled" a False résoud la majorité de mes problèmes. Par contre je ne comprends pas pourquoi, mais sur certaines fenêtres, j'ai toujours le même souci, notamment avec les QuickReports... Auriez-vous une idée ?

  9. #9
    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
    Scaled à False, tu me rassures, c'est ce que j'avais dit ! avec moins de précision que Franck SORIANO

    Pour un QuickRep, c'est tout de même des fenêtres très particulières !
    Faudrait regarder sur le QuickRep lui même les PrinterSettings ! Mais cela serait suprenant qu'il y ait un lien entre le Preview et le Print

    ou Pas ?
    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

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Franck, saurais-tu comment bidouiller TScreen pour forcer PixelsPerInch à 96 Dpi quelles que soit la résolution réelle du bureau ?

    Je pioche un peu la-dessus car sur certaines fenêtres je positionne les label directement dans le code en donnant des positions. Le souci étant que comme les dpi ne sont pas tous les mêmes, les champs ne s'affichent pas au bon endroit si le bureau n'est pas en 96 dpi.

    Merci

  11. #11
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    C'est le principe pour accéder à un membre privé :
    Tu déclares une classe qui dérive du même ancêtre que TScreen, en lui déclarant les mêmes attributs et dans le même ordre que les attributs privés de TScreen, jusqu'à redéclarer l'attribut que tu veux modifier (autrement dit, tu fais un copier/coller des sources de TScreen jusqu'à FPixelsPerInch).

    Puis tu fais un cast sauvage de l'instance réelle de TScreen vers cette nouvelle classe. Comme tu as fait la même déclaration que TScreen, ton attribut FPixelsPerInch va se retrouver à la même adresse mémoire que celui de TScreen. Il ne te reste plus qu'à affecter sa valeur.

    En fait, tu peux faire n'importe quelle déclaration, du moment qu'au final l'attribut que tu modifies se retrouve sur la même adresse mémoire.

    Je ne vais pas te mettre les sources de la VCL, alors voici un exemple avec une déclaration quelconque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
      TPrivateHack = class(TComponent)
      public
        FDummy1 : cardinal;
        FDummy2 : cardinal;
        FDummy3 : cardinal;
        FDummy4 : cardinal;
        PixelsPerInch : integer;
      end;
     
    ...
      TPrivateHack(Screen).PixelsPerInch := 96;
    Attention, le jour ou tu changes de version de Delphi, si les sources de la VCL change, ça risque de faire tout drôle...

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/03/2009, 13h51
  2. Affichage caractères asiatique avec composants standard
    Par FransTreb dans le forum Composants VCL
    Réponses: 5
    Dernier message: 05/12/2005, 17h20
  3. PB affichage d'image avec IE
    Par arturo dans le forum Modules
    Réponses: 6
    Dernier message: 25/09/2003, 17h28
  4. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19
  5. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h44

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