Autor Beitrag
LonghornUser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: Sa 04.04.09 21:57 
Hallo,

ich habe von einem Bekannten gehört, dass es viele User gibt, die Ihren Rechner in 120 DPI darstellen lassen, sprich größerer Schrift. Teile meiner Anwendung sahen in dieser Darstellung richtig schlimm aus, weil ich mich nie drum gekümmert habe.

Nun frage ich mich: Was muss man da beachten ? Muss man die ganze GUI für 120 DPI nochmal machen ?

Und dann ist noch etwas komisch: Meine Hauptform wird auch beim Umstellen auf 120 DPI nicht anders. Das Optionsfenster aber schon. Und im Optionsfenster aber auch nur gewisse Teile. Ein Speedbutton zB. bleibt im Schriftgrad genauso klein wie in 96 DPI.

Woran liegt das ? Gibts eventuell ein Tutorial ?

Ciao LHUser
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: So 05.04.09 15:02 
Ich habe in der Zwischenzeit rausgefunden, dass man die Methode ScaleBy für sowas nutzen kann.

Ich habe folgendes gefunden:
ausblenden Delphi-Quelltext
1:
2:
if Screen.PixelsPerInch <> PixelsPerInch then
  ScaleBy(Screen.PixelsPerInch, PixelsPerInch);

Das dumme ist nur, mein Programm erkennt bei Screen.PixelsPerInch und auch bei PixelsPerInch 120 DPI bzw. 96 DPI. Damit passiert sowohl bei der If-Abfrage als auch by ScaleBy nichts (Streckung um den Faktor 1...).

Ich habe irgendwie den falschen Ansatzpunkt. Habt ihr ne Idee ?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 05.04.09 15:09 
Warum benutzt du für den zweiten Wert nicht eben 96DPI? Das ist schließlich dein Ausgangswert.

_________________
>λ=
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: So 05.04.09 15:19 
Ja, das habe ich in der Zwischenzeit schon probiert ;)

Nur muss ich nochmal nachfragen, ob ich das richtig verstanden habe. Es wird doch nur *skaliert*. An den Werten für Width und Height ändert sich nichts ? Weil dann müsste man sämtliche Größenänderungen im Programm zur Laufzeit dynamisch anpassen lassen und das würde Rundungsfehler en masse mit sich bringen, wenn jemand etwas anderes als 96 oder 120DPI nimmt.

Ich habe nämlich den Verdacht, dass sich dadurch auch Height und Width meiner Form ändern (obwohl ja eigentlich nur die Pixel gestreckt werden sollten).
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 05.04.09 15:28 
user profile iconLonghornUser hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe nämlich den Verdacht, dass sich dadurch auch Height und Width meiner Form ändern (obwohl ja eigentlich nur die Pixel gestreckt werden sollten).
Ich würde behaupten das ist völlig logisch, dass sich width und height ändern :nixweiss: Ich meine, die Form wird ja Größer. Pixel werden keine gestreckt, das würde dem Bildschirm nicht gut tun :mrgreen: Es wird nur berechnet, welche Größe die Elemente die auf der Form liegen nach der Skalierung haben müssen.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: So 05.04.09 15:35 
Das heißt also, ich müsste permanent alle Width's und Height's mit AktuelleDPI div 96 multiplizieren. Geht das nicht irgendwie eleganter ? Ich kann irgendwie nicht glauben, dass das mit Delphi nicht besser geht (zumal es die DPI-Einstellung ja schon ewig gibt und auch von einem bestimmten Benutzerkreis stark gebraucht wird) ?? [Edit: Sowas müsste Delphi doch intern machen -> beim Eintragen der Width/Height-Attribute?]
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 05.04.09 15:44 
user profile iconLonghornUser hat folgendes geschrieben Zum zitierten Posting springen:
Das heißt also, ich müsste permanent alle Width's und Height's mit AktuelleDPI div 96 multiplizieren. Geht das nicht irgendwie eleganter ?
Ja, du lässt es ScaleBy erledigen? :gruebel:
DOH:
ScaleBy skaliert ein Steuerelement, ohne die Position seiner oberen linke Ecke zu verändern. Die Wirkung ist ähnlich wie bei einer Änderung der Eigenschaften Height und Width, es wird aber versucht, die relative Größe und Position der untergeordneten Steuerelemente durch eine entsprechenden Neuskalierung bzw. Neuanordnung beizubehalten.
Wie ich das verstehe, macht das ScaleBy selber :nixweiss:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: So 05.04.09 15:52 
Ich poste am besten mal den Inhalt meines OnResize-Events:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
  if ((Form1.ClientWidth > 948and (MutexA <> 0)) or (MutexC <> 0then begin
    MutexA := 0;
    MutexB := 1;
    MuteXC := 0;
    Label1.Left := 786;
    Label1.Top := 91;
    Image4.Left := 758;
    Image4.Top := 88;
    ButtonUp.Top := 137;
    ListView1.Top := 128;
    ListView1.Height := Form1.ClientHeight-211;
  end;
  if ((Form1.ClientWidth <= 948and (MutexB <> 0)) or (MutexC <> 0then
  begin
    MutexA := 1;
    MutexB := 0;
    MuteXC := 0;
    if AppLang = 'English' then begin
      Label1.Left := 653;
      Image4.Left := 624;
    end
    else
    begin
      Label1.Left := 614;
      Image4.Left := 585;
    end;
    Label1.Top := 125;
    Image4.Top := 122;
    ButtonUp.Top := 168;
    ListView1.Top := 156;
    ListView1.Height := Form1.ClientHeight-235;
  end;

  Shape2.Top := Form1.ClientHeight-24;
  Image1.Left := Form1.ClientWidth-22;
  Image5.Left := Form1.ClientWidth-96;
  Image5.Top := Form1.ClientHeight-20;
  Image6.Left := Form1.ClientWidth-96;
  Image6.Top := Form1.ClientHeight-20;
  Shape6.Left := Form1.ClientWidth-102;
  Shape6.Top := Form1.ClientHeight-24;
  ButtonUp.Left := Form1.ClientWidth-54;
  ButtonDown.Top := Form1.ClientHeight-103;
  ButtonDown.Left := Form1.ClientWidth-54;
  LabelA.Top := Form1.ClientHeight-68;
  Image8.Top := Form1.ClientHeight-73;
  Image3.Left := Form1.ClientWidth-326;
  Image3.Top := Form1.ClientHeight-73;
  Label2.Left := Form1.ClientWidth-300;
  Label2.Top := Form1.ClientHeight-68;

  StatusbarLabel1.Left := Form1.ClientWidth-180;
  StatusbarLabel1.Top := Form1.ClientHeight-20;
  LabelDeactivated.Left := Form1.ClientWidth-75;
  LabelDeactivated.Top := Form1.ClientHeight-20;
  if AppLang = 'English' then
    Label7.Left := Form1.ClientWidth-262
  else L7.Left := Form1.ClientWidth-454;
  Label7.Top := Form1.ClientHeight-144;
  Label8.Top := Form1.ClientHeight-141;
  Checkbox1.Top := Form1.ClientHeight-141;


Diese Änderungen macht ScaleBy leider nicht. Ich müsste, wie ich es verstanden habe, wohl so vorgehen, dass ich die ganzen absoluten Werte mit AktuelleDPI/96 multipliziere. Dann sollte es stimmen, aber das kann kein sauberer Weg sein, oder doch ?
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: So 05.04.09 15:54 
Wofür brauchst du so ein Resize Event ?? :shock:

Du kennst aber schon die Anchors-Property, oder?
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: So 05.04.09 16:23 
Hast du schon mal Anchors verwendet um den Abstand (wohlgemerkt der Abstand der *Schrift*, nicht der Abstand des Controls zum Rand) eines Labels zum rechten Rand konstant zu halten :) ?

Edit: Argh, ich habs auch gerade gesehen, dass man ja die ersten beiden Anchors auf True und die anderen auf False stellen muss.

Dann sollte das Problem erledigt sein.
Ich mache mal weiter ;)
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: Mo 06.04.09 01:01 
OK, habs nun doch alles hinbekommen. Die meisten Resizings konnte ich mit den Anchors entfernen, aber nicht alle, da ich 2 verschiedene Anordnungen der Komponenten habe (je nach Form1.Width-Wert). Das musste man dann doch "von Hand" machen.