2017-06-28 3 views
1

I ont la forme d'exemple suivant TForm1 avec deux boutons (BitBtn):Comment puis-je obtenir l'héritage visuel à des valeurs de ppp élevées?

base form

En outre, j'ai une deuxième forme TForm2 qui est dérivée de la première forme. Le deuxième bouton est déplacé vers la gauche et un autre bouton est ajouté:

derived form

Lors de l'exécution (Windows 7), la deuxième forme ressemble à ceci:

standard font size

Si je change taille de police à 125%, ma forme ressemble à ceci:

increased font size

D'une manière ou d'une autre, le nouveau bouton a la mauvaise position et la mauvaise taille. Que puis-je faire à ce sujet?

J'utilise les fichiers suivants .dfm (raccourcies):

object Form1: TForm1 
    Left = 0 
    Top = 0 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object BitBtn1: TBitBtn 
    Left = 8 
    Top = 8 
    Width = 105 
    Height = 105 
    Caption = 'BitBtn1' 
    end 
    object BitBtn2: TBitBtn 
    Left = 359 
    Top = 8 
    Width = 105 
    Height = 105 
    Caption = 'BitBtn2' 
    end 
end 

inherited Form2: TForm2 
    Caption = 'Form2' 
    PixelsPerInch = 96 
    TextHeight = 13 
    inherited BitBtn2: TBitBtn 
    Left = 191 
    Top = 7 
    ExplicitLeft = 191 
    ExplicitTop = 7 
    end 
    object BitBtn3: TBitBtn 
    Left = 359 
    Top = 8 
    Width = 105 
    Height = 104 
    Caption = 'BitBtn3' 
    end 
end 

fichiers de classe ne sont pas modifiés en tant que concepteur les génère. Ils ne contiennent aucun code pertinent.

Répondre

2

J'ai trouvé une solution moi-même: on doit remplacer ReadState avec le code suivant:

procedure TForm2.ReadState(Reader: TReader); 
begin 
    IntPtr(FReserved) := 0; 
    inherited; 
end;  

Cela semble étrange. Comment ça marche?

J'ai regardé le code source VCL et trouvé que la mise à l'échelle après le chargement du formulaire se fait en TForm.ReadState(...). Apparrently, un protégé champ FReserved de TControl est utilisé pour stocker la valeur DPI actuellement appliquée:

  • d'abord, tous les composants de ma classe de base dfm sont lus
  • ils sont mis à l'échelle et positionnés correctement
  • et la valeur actuellement appliquée DPI est stockée dans FReserved
  • ensuite ReadState est appelée à nouveau, pour le fichier dfm de la classe dérivée
  • mais à cause de la valeur FReserved, mise à l'échelle n'est pas appliquée aux composants de la forme dérivée

Alors, une idée serait de réinitialiser la valeur DPI en cache avant de lire les composants. Il met à l'échelle les composants de Form1 deux fois, mais cela ne fait pas de mal puisque les tailles et positions d'origine sont mémorisées comme valeur de base pour la mise à l'échelle et le résultat est exactement le même.

+5

Vous devriez le signaler à Embarcadero afin qu'ils puissent le réparer. –

+0

Je l'aurais signalé, mais comme il s'est avéré [il est déjà signalé] (https://quality.embarcadero.com/browse/RSP-12971). L'une des conséquences les plus fâcheuses d'exiger une connexion pour le portail de qualité est que les moteurs de recherche ne peuvent pas indexer le contenu. Même si j'ai trouvé le problème avec ma première requête de recherche, le moteur de recherche interne fonctionne correctement. – ventiseis

+0

En outre, cela semble être corrigé avec 'Delphi 10.1 Berlin'. – ventiseis