Bei der Anpassung meines Programmes ist mir aufgefallen, dass TForm.PixelsPerInch ist in OnCreate und OnShow unterschiedlich. In OnShow nimmt es den Wert des Screen.PixelsPerInch an, sollte das nicht von Anfang an geschehen? Weil TForm.PixelsPerInch und ScaleDesignToForm bis dahin nutzlos sind. Ich habe auf Basis von ScaleDesignToForm eigene Funktion geschrieben, damit funktionieren Anpassungen.
Sollte ich das als Fehler melden oder habe ich etwas Falsch verstanden?
Screenshot:
Testprogramm ist als Anhang beigefügt.
Edit:
Mir ist eben gerade einfallen, wann wird bei Multimonitorsysteme entschieden auf welchem Monitor es angezeigt wird, das sollte man auch bei Fehlerkorrektur berücksichtigen.
TForm.PixelsPerInch ist in OnCreate und OnShow unterschiedlich, Fehler?
-
Soner
- Beiträge: 814
- Registriert: Do 27. Sep 2012, 00:07
- OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
- CPU-Target: x86_64-win64
- Wohnort: Hamburg
TForm.PixelsPerInch ist in OnCreate und OnShow unterschiedlich, Fehler?
- Dateianhänge
-
FormPPIOnCreateBug-pub.zip- (48.09 KiB) 6-mal heruntergeladen
- af0815
- Lazarusforum e. V.
- Beiträge: 7440
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: TForm.PixelsPerInch ist in OnCreate und OnShow unterschiedlich, Fehler?
Ich verwende OnCreate nur sehr wenig, da zu diesem Zeitpunkt nicht alles so 100% initialisiert sein braucht. Ich verwende immer das erste OnActivate vom Mainform um meine Initialisierungen zu machen. Weil zu diesen Zeitpunkt sind sicher alle Initialisierungen durch (auch alle automatischen Forms erzeugt) und alles stabil.
Vor allen hat man hier einen Zeitpunkt, wo man die Applikation auch sauber gleich wieder herunterfahren kann, wenn bei den eigenen Initialisierungen was schiefläuft (Server oder DBs nicht erreichbar, Laufwerke nicht gemountet,....).
Ich vermute bei deinem Problem einen solchen Hintergrund, das OnCreate etwas zu früh ist, für manche Abfragen.
Vor allen hat man hier einen Zeitpunkt, wo man die Applikation auch sauber gleich wieder herunterfahren kann, wenn bei den eigenen Initialisierungen was schiefläuft (Server oder DBs nicht erreichbar, Laufwerke nicht gemountet,....).
Ich vermute bei deinem Problem einen solchen Hintergrund, das OnCreate etwas zu früh ist, für manche Abfragen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: TForm.PixelsPerInch ist in OnCreate und OnShow unterschiedlich, Fehler?
Die Umschaltung der PPI erfolgt in AutoAdjustLayout das erstmals in TCustomFrom.AfterConstruction aufgerufen wird, und zwar NACH DoCreate, wo das OnCreate-Event feuert:
Abgesehen davon, wird AutoAdjustLayout immer dann aufgerufen, wenn sich die PPI ändern (wie das bei einem Mehr-Monitor-System ist, weiß ich nicht, weil mein Schreibtisch nur Platz für einen hat...). Die Arbeitsmethode ist dann DoAutoAdjustLayout, das man überschreiben sollte, um besondere Skalierungen unterzubringen (z.B. bei internen Abmessungen von eigenen Controls). Durchsuche den LCL-Code nach "DoAutoAdjustLayout" - das wird an einer Vielzahl von Stellen aufgerufen.
Code: Alles auswählen
procedure TCustomForm.AfterConstruction;
var
MonPPI: Integer;
begin
SetRestoredBounds(Left, Top, Width, Height, True);
DoCreate;
EndFormUpdate; // the BeginFormUpdate is in CreateNew
inherited AfterConstruction;
if Monitor <> nil then
MonPPI := Monitor.PixelsPerInch
else
MonPPI := Screen.PixelsPerInch;
if Application.Scaled and Scaled and (MonPPI > 0) and (MonPPI <> PixelsPerInch)
and not (csDesigning in ComponentState) then
AutoAdjustLayout(lapAutoAdjustForDPI, PixelsPerInch, MonPPI,
Width, MulDiv(Width, MonPPI, PixelsPerInch));
end;