Abstände/Größen ändern sich

Für Fragen rund um die Ide und zum Debugger
Antworten
Adromir
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

Abstände/Größen ändern sich

Beitrag von Adromir »

Wenn ich mein Projekt auf verschiedenen Rechnern (beide Win10 bei FullHD Auflösung) bearbeite, verändern sich die Abstände/Größe der Elemente. Gibt es da irgendeine Einstellung mit der man das unterbinden kann?

Mathias
Beiträge: 4749
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Abstände/Größen ändern sich

Beitrag von Mathias »

Gibt es, da dies erst kürzlich eingefügrt wurde.
Nur weis ich nicht wo. :oops:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

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

Re: Abstände/Größen ändern sich

Beitrag von wp_xyz »

Im Idealfall verwendest du Lazarus > 1.8, dann musst du dich um Skalierung der Formulare bei unterschiedlichen Pixels-per-Inch nicht mehr kümmern, wenn in den Projekt-Optionen "Manifest-Resource verwenden" markiert ist und darunter als "DPI-Bewusstsein" (welch scheußliche Übersetzung!) etwas anderes als "aus (False)" gewählt ist. Mit diesen Einstellungen werden alle Dimensionen so umgerechnet, dass die Verhältnisse beibehalten werden. Wenn du Icons in ImageListen verwendest, dann übernimmt die IDE von Lazarus-Trunk auch deren Skalierung, wenn ImageList.Scaled=true gesetzt ist.

Adromir
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

Re: Abstände/Größen ändern sich

Beitrag von Adromir »

Ah okay. Das DPI Bewusstsein habe ich sogar ausgeschaltet, da ich vermutet hatte, dass das der schuldige ist

BeniBela
Beiträge: 267
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Abstände/Größen ändern sich

Beitrag von BeniBela »

Was macht denn die Use LCL Scaling Option darüber? Und was ist der Unterschied zwischen den drei möglichen DPI Bewusstseins?

Betrifft das nur Windows? Unter Linux kann man die Schriftgröße auch ohne DPI Änderung ändern.

Ich mache das ganz anders:

Bei allen Komponenten AutoSize aktivieren und dann Align/Anchors entsprechend setzen, so dass sich alles an die Schrift anpasst.


Nur habe ich noch nicht ganz rausgefunden wie man macht, dass Autosize es nur vergrößern und nicht im Normalzustand verkleinert und alle Ränder abschneidet

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

Re: Abstände/Größen ändern sich

Beitrag von wp_xyz »

BeniBela hat geschrieben:Was macht denn die Use LCL Scaling Option darüber?

Natürlich! Das habe ich übersehen, und dabei ist es das wichtigste (es ist einfach zu heiß...). Also: Wenn man diese Checkbox setzt, wird in die Projektdatei "Application.Scaled := true" geschrieben, und alle Dimensionen werden entsprechend den DPI des Monitors skaliert. Je nach DPI-"Bewusstsein" wird - nur für Windows - die entsprechende Manifest-Datei verwendet, wobei man ab Win 8.1 auch unterscheiden kann, ob bei mehreren Monitoren die DPI pro Monitor ausgewertet werden - d.h. wenn man ein Fenster von einem 96dpi-Monitor auf einen 144dpi-Monitor schiebt, wird die Pixelzahl auf letzterem so hochgerechnet, dass sich die Größe nicht ändert. Hab' ich selbst nicht getestet, wurde mir aber von Ondrej Pokorny, der all dies geschrieben hat, auf eine entsprechende Anfrage bestätigt.

BeniBela
Beiträge: 267
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Abstände/Größen ändern sich

Beitrag von BeniBela »

Ich habe jetzt das in meinem OnCreate:

Code: Alles auswählen

 
const REFERENCE_FONT = 19;
var
  fontHeight, i: Integer;
  bounds, oldbounds: TRect;
begin
  guiScaleFactor := 1;
  fontHeight := Canvas.GetTextHeight('Hm,.|');
 
  if fontHeight > REFERENCE_FONT then begin
    guiScaleFactor := fontHeight / REFERENCE_FONT;
    oldbounds := BoundsRect;
    bounds := oldbounds;
    bounds.Width := MulDiv(bounds.Width, fontHeight, REFERENCE_FONT);
    bounds.Height := MulDiv(bounds.Height, fontHeight, REFERENCE_FONT);
 
    if bounds.Width > screen.Width then bounds.Width := screen.Width;
    if bounds.Height > screen.Height then bounds.Height := screen.Height;
    if (bounds.width = oldbounds.Width) and (bounds.height = oldbounds.Height) then exit;
 
    if bounds.Left + bounds.Width > screen.Width then bounds.Left := screen.Width - bounds.Width;
    if bounds.Top + bounds.Height > screen.Height then bounds.Top := screen.Height - bounds.Height;
 
    BoundsRect := bounds;
  end;                 
end;
 



Aber kann man canvas überhaupt in OnCreate verwenden? Das bringt alles durcheinander: https://bugs.freepascal.org/view.php?id=34044

Woher kriege ich die System-Schriftgröße?

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

Re: Abstände/Größen ändern sich

Beitrag von wp_xyz »

Wenn ich mich jetzt recht erinnere, berechnet Ondrej den Skalierungsfaktor aus den DesigntimePPI des Formulars und den PixelsPerInch des Fonts des Formulars.

BeniBela
Beiträge: 267
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Abstände/Größen ändern sich

Beitrag von BeniBela »

Ich will ja aber die Schriftgröße und nicht DPI.

Hier unter Linux hat die Standardschrift 19 Pixel hoch und unter Windows 15 Pixel, bei derselben DPI

Und in der ~/.gtkrc-2.0 kann man die Schrift ändern. Dann ist die Schrift doppelt so groß, aber die DPI ändert sich nicht

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

Re: Abstände/Größen ändern sich

Beitrag von wp_xyz »

BeniBela hat geschrieben:Woher kriege ich die System-Schriftgröße?

Screen.SystemFont ?

BeniBela
Beiträge: 267
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Abstände/Größen ändern sich

Beitrag von BeniBela »

Das hat immer Größe 0

Antworten