| Autor | Beitrag | 
| LonghornUser 
          Beiträge: 796
 
 
 
 
 | 
Verfasst: Sa 04.04.09 20: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  
          Beiträge: 796
 
 
 
 
 | 
Verfasst: So 05.04.09 14:02 
 
Ich habe in der Zwischenzeit rausgefunden, dass man die Methode ScaleBy für sowas nutzen kann.
 Ich habe folgendes gefunden:
 		                       Delphi-Quelltext 
 									| 1:2:
 
 | if Screen.PixelsPerInch <> PixelsPerInch thenScaleBy(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 
          Beiträge: 3803
 Erhaltene Danke: 176
 
 Arch Linux
 Python, C, C++ (vim)
 
 | 
Verfasst: So 05.04.09 14:09 
 
Warum benutzt du für den zweiten Wert nicht eben 96DPI? Das ist schließlich dein Ausgangswert. _________________ >λ=
 | 
|  | 
| LonghornUser  
          Beiträge: 796
 
 
 
 
 | 
Verfasst: So 05.04.09 14: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 
          Beiträge: 2971
 
 Windows Vista Ultimate
 D7 Enterprise
 
 | 
Verfasst: So 05.04.09 14:28 
 
	  |  LonghornUser hat folgendes geschrieben  : |  	  | 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    Ich meine, die Form wird ja Größer. Pixel werden keine gestreckt, das würde dem Bildschirm nicht gut tun    Es wird nur berechnet, welche Größe die Elemente die auf der Form liegen nach der Skalierung haben müssen._________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
 [>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
 | 
|  | 
| LonghornUser  
          Beiträge: 796
 
 
 
 
 | 
Verfasst: So 05.04.09 14: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 
          Beiträge: 2971
 
 Windows Vista Ultimate
 D7 Enterprise
 
 | 
Verfasst: So 05.04.09 14:44 
 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
 [>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
 | 
|  | 
| LonghornUser  
          Beiträge: 796
 
 
 
 
 | 
Verfasst: So 05.04.09 14:52 
 
Ich poste am besten mal den Inhalt meines OnResize-Events:
 												| 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 > 948) and (MutexA <> 0)) or (MutexC <> 0) then beginMutexA := 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 <= 948) and (MutexB <> 0)) or (MutexC <> 0) then
 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 
          Beiträge: 918
 Erhaltene Danke: 158
 
 Win 10
 VS 2013, VS2015
 
 | 
Verfasst: So 05.04.09 14:54 
 
Wofür brauchst du so ein Resize Event ??    Du kennst aber schon die Anchors-Property, oder? | 
|  | 
| LonghornUser  
          Beiträge: 796
 
 
 
 
 | 
Verfasst: So 05.04.09 15: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  
          Beiträge: 796
 
 
 
 
 | 
Verfasst: Mo 06.04.09 00: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. | 
|  |