AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Skalierbare Fensterinhalte

Ein Thema von stalkingwolf · begonnen am 12. Mai 2023 · letzter Beitrag vom 16. Mai 2023
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.058 Beiträge
 
Delphi 12 Athens
 
#1

AW: Skalierbare Fensterinhalte

  Alt 12. Mai 2023, 14:53
Ich habe die DPI bezogene Skalierung damals von Hand gelöst...
Delphi-Quellcode:
var ScaleValue96Factor:Double;
Procedure InitScaleValue96factor;
begin
  ScaleValue96Factor := Screen.PixelsPerInch / 96;
end;

Function ScaleValue96(Value:integer):integer;
Begin
  Result := Round(ScaleValue96Factor * Value);
End;

Procedure ScaleControl(aControl:TControl; ScaleFonts:Boolean=false; NoWordWrap:Boolean=false);
var i,x:integer;
MetaRecord : PPropInfo;
o:Tobject;
begin
  aControl.Setbounds(
                      ScaleValue96(aControl.left),
                      ScaleValue96(aControl.top),
                      ScaleValue96(aControl.width),
                      ScaleValue96(aControl.height)
                    );

  if ScaleFonts then
  Begin
    MetaRecord := getpropinfo(aControl,'Font');
    if MetaRecord <> nil then begin
      o := getobjectProp( aControl,'Font');

      if getpropinfo(o,'Height') <> Nil then begin
       x := GetOrdProp(o, 'Height');
       x := ScaleValue96(x);
       SetOrdProp(o, 'Height',x);
      end else begin
       x := GetOrdProp(o, 'Size');
       x := ScaleValue96(x);
       SetOrdProp(o, 'Size',x);
      end;

    end;
  End;

  if NoWordWrap then
  begin
    MetaRecord := getpropinfo(aControl,'NoWrap');
    if MetaRecord <> nil then
      SetOrdProp(aControl, 'NoWrap',-1);
  end;

  if aControl is Twincontrol then
  Begin
    For i := 0 to Pred(Twincontrol(aControl).ControlCount) do
    Begin
      ScaleControl(Twincontrol(aControl).Controls[i],ScaleFonts,NoWordWrap);
    End;
  End;
end;
nachteil = In der Version werden glaube ich "Tabs" nicht richtig berücksichtigt.
Andreas
Nobody goes there anymore. It's too crowded!

Geändert von QuickAndDirty (12. Mai 2023 um 14:57 Uhr)
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
552 Beiträge
 
#2

AW: Skalierbare Fensterinhalte

  Alt 16. Mai 2023, 07:40
Moin,

das mit der DPI würde aber nur bewirken das auf HighDPI Monitoren die Fenster nicht winzig sind. Ich würde keinen Fensterinhalt dadurch gewinnen.

Da wir nun fast alle Kunden auf unseren neuen Programmstand umgestellt haben, kommen doch noch ein paar mehr mit so billigen 15" Notebooks und 1366x768 Auflösungen.

Wer in Gottesnamen gibt seinem Mitarbeitern für ein ERP Software Displays mit 1366x768. Ich hasse meine Branche

btw. weil es oben angesprochen wurde. Wir haben extra 27" 1920x1080 Schirme als Drittmonitore um darauf unsere Software zu testen. IMO sollte das heute überall Standard sein, aber man erlebt halt jeden Tag was neues.
Im POS Bereich haben einige Kunden sogar noch 1024x768. Weil da vor Jahren was zusammengezimmert wurde wo kein moderner Monitor Platz drin hat und umbauen kostet halt Geld.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.555 Beiträge
 
Delphi 12 Athens
 
#3

AW: Skalierbare Fensterinhalte

  Alt 16. Mai 2023, 08:43
Vermutlich bekommt diese Komponente die Änderung nicht mit, da die Message von Windows nur an die TopLevelFenseter gesendet wird.

* versuch die Message an die Komponente durchzureichen
* bau eine responsive Webseite, welche sich an die Größe des Fensters anpasst (CSS und/oder JavaScript)
* setze von deiner Anwendung (OnResize) via JavaScript passende Schriftgrößen und so
* lade bei Änderung einen neuen angepassten Seiteninhalt
* ...
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
striderx

Registriert seit: 11. Feb 2007
Ort: Bergisch Gladbach
207 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Skalierbare Fensterinhalte

  Alt 16. Mai 2023, 09:39
Für eine ähnlich gelagerte Anforderung habe ich mir damit beholfen, in die DPR der Anwendung folgende Funktion einzubauen:

Delphi-Quellcode:
  if Screen.WorkAreaHeight < 890 then
     SetProcessDPIAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
Bei der Zahl 890 handelt es sich um die Pixelhöhe der Main-Form. Das klappt problemlos, und es ist kein Gefummel mit "Align, Anchors und Constraints" erforderlich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.555 Beiträge
 
Delphi 12 Athens
 
#5

AW: Skalierbare Fensterinhalte

  Alt 16. Mai 2023, 09:46
Problem hier ist, dass es "erstmal" funktioniert. (also nichts in der DPR, OnCreate o.A. nötig.)
* Funktioniert es wirklich? Wie sieht es aus, wenn das Programm/Fenster auf dem anderen Monitor startet?

Laut Meldung stimmt es nichtmehr, wenn das Fenster zwischen zwei Monitoren mit unterschiedlichen DPI umhergeschoben wird.
* Auf was steht Projektoptionen > Anwendung > Manifest > DPI-Unterstützung ?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz