Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Fehler TPageControl und TPanel! (https://www.delphipraxis.net/194496-fehler-tpagecontrol-und-tpanel.html)

sko1 30. Nov 2017 05:40

Fehler TPageControl und TPanel!
 
Hallo,

ich habe hier einen blöden Fehler:
Auf einem TPageControl liegt ein TPanel mit Anchors [akLeft,akTop,akRight,akBottom].

Dieses wird nur bei einer Bildschirmanzeige in Windows 10 von 100% korrekt dargestellt, bei 125 oder 150% ist es viel zu groß, größer als das Pagecontrol!

Diese falsche Darstellung ändert sich auch nicht durch Ändern der Bildschirmeinstellung, erst nach Programmneustart bei 100% ist das Panel in der korrekten Größe!

Kann das jemand nachstellen (Berlin 10.1 Update 2) und viel wichtiger, wie bekomme ich das korrigiert?

Ciao
Stefan

Jasocul 30. Nov 2017 06:06

AW: Fehler TPageControl und TPanel!
 
Ist das Problem in der 10er immer noch drin? Unfassbar.
Du musst dich um die Skalierung selbst kümmern.

Setze die Property "Scaled" der Form auf False.
Danach berechnest du den Skalierungsfaktor und machst selbst ein ScaleBy im OnCreate der Form.

Für den Skalierungsfaktor habe ich mir eine kleine Funktion geschrieben:
Delphi-Quellcode:
Function GetScaleFactor : Integer;
var
  Reg : TRegistry;
begin
  Reg := TRegistry.Create(KEY_READ);
  try
    if Reg.OpenKeyReadOnly('\Control Panel\Desktop') then
    begin
      if Reg.ValueExists('LogPixels') then
        Result := Reg.ReadInteger('LogPixels')
      else
        Result := 96;
    end
    else
    begin
      Result := 96;
    end;
    Reg.CloseKey;
    Result := Round(Result * 100 / 96);
  finally
    Reg.Free;
  end;
end;
Im OnCreate steht dann:
Delphi-Quellcode:
  ScaleBy(GetScaleFactor, 100);
Das hat bei mir bisher immer gut funktioniert.

sko1 30. Nov 2017 09:30

AW: Fehler TPageControl und TPanel!
 
Danke, aber das kann doch alles gar nicht wahr sein, oder?

Auf dem Panel sitzt ein anderes Control (Align = alClient) und icvh habe einen halben Tag gesucht warum das keine Scrollbars anzeigt (warum auch wenn sein ParentPanel riesig ist...)!

Ciao
Stefan

Jasocul 30. Nov 2017 11:54

AW: Fehler TPageControl und TPanel!
 
Zitat:

Zitat von sko1 (Beitrag 1387560)
Danke, aber das kann doch alles gar nicht wahr sein, oder?

Leider doch. Ich arbeite schon seit Jahren mit dieser Lösung. Aktuell noch mit XE2. XE10 kommt in den nächsten Wochen. Muss ich das Problem also schon nicht mehr überprüfen. :roll:

LTE5 30. Nov 2017 12:12

AW: Fehler TPageControl und TPanel!
 
Zitat:

Leider doch. Ich arbeite schon seit Jahren mit dieser Lösung.
Ich ebenfalls. Ich berechne die Monitor-DPI im FormCreate jedes Formulars, setze ScaleBy in derselben Funktion und ändere danach händisch ein paar Controls bei denen ich weiß, dass die unter DPI > 100% nicht korrekt dargestellt werden.
Scaled ist selbstverständlich auf False.

sko1 1. Dez 2017 05:50

AW: Fehler TPageControl und TPanel!
 
Muss ich daraus schlussfolgern, dass es weitere Controls gibt die solche Fehler haben?

Gibt es irgendwo eine Liste dieser betroffenen Kandidaten?

Ich verwende gern Alignment, Anchors, Margins um Elemente bei Formgrößenänderungen entsprechend anzupassen, muss man dafür jetzt den gesamten Code selbst schreiben?

Zur Entwurfszeit sieht man ja nicht dass die Skalierung nicht stimmt, da wird alles ordentlich dargestellt, wenn man die Form vergrößert / verkleinert, die Fehldarstellung kommt dann ja erst zur Laufzeit!

Ciao
Stefan

Jasocul 1. Dez 2017 07:29

AW: Fehler TPageControl und TPanel!
 
Ja, auch andere Controls haben da Probleme.
TButton und TEdit sind solche Kandidaten, wenn ich mich richtig erinnere.

Aber dafür musst du keinen Extra-Code schreiben. Mit der oben beschriebenen Lösung wird das berücksichtigt.

CCRDude 1. Dez 2017 09:15

AW: Fehler TPageControl und TPanel!
 
@Jasocul: Deine Lösung scheint aber nur die Desktop-Auflösung zu berücksichtigen. LTE5 ist da korrekter - es muss natürlich spezifisch für den Monitor, auf dem die Form liegt, umgerechnet werden.

Jasocul 1. Dez 2017 09:26

AW: Fehler TPageControl und TPanel!
 
Stimmt.

LTE5 1. Dez 2017 10:35

AW: Fehler TPageControl und TPanel!
 
Zitat:

ScaleBy(GetScaleFactor, 100);
Warum genau 100?

100% od er 100 DPI?

Ich habe deine Funktion eben an einem existieren Projekt mit 150% Skalierung Windows 7 getestet.
Bei Übergabe von 100 für D wird vieles falsch dargestellt. Übergebe ich 96, die ursprüngliche Größe unter der ich entwickle, ist alles korrekt.
Ich denke hier sollte man also eher die Original-DPI des Entwickler-Rechners angeben statt 100.

Ich nutze da pro Formular eher
Delphi-Quellcode:
uFormX.ScaleBy(Screen.PixelsPerInch, "Original-DPI");
Und dann noch Anpassungen pro Control. Aufwändige Anwendungen sehen unter DPI >100 nämlich sonst schäbig aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:08 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz