TForm.PixelsPerInch ist in OnCreate und OnShow unterschiedlich, Fehler?

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
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?

Beitrag von Soner »

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:
screenshot.png
screenshot.png (77.09 KiB) 90 mal betrachtet
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.
Dateianhänge
FormPPIOnCreateBug-pub.zip
(48.09 KiB) 5-mal heruntergeladen

Benutzeravatar
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?

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 5490
Registriert: Fr 8. Apr 2011, 09:01

Re: TForm.PixelsPerInch ist in OnCreate und OnShow unterschiedlich, Fehler?

Beitrag von wp_xyz »

Die Umschaltung der PPI erfolgt in AutoAdjustLayout das erstmals in TCustomFrom.AfterConstruction aufgerufen wird, und zwar NACH DoCreate, wo das OnCreate-Event feuert:

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;
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.

Antworten