Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Formulare in hohen DPI korrekt anzeigen (https://www.delphipraxis.net/190598-formulare-hohen-dpi-korrekt-anzeigen.html)

Jim Carrey 19. Okt 2016 19:22

AW: Formulare in hohen DPI korrekt anzeigen
 
Ich werde das gleich in jedem Fall mal ausprobieren.
Dann habe ich zwar statt einem Label 2 + ein Panel, aber das ist es mir wert.

Ich gebe dann gleich Bescheid was draus geworden ist.

Jim Carrey 19. Okt 2016 20:15

AW: Formulare in hohen DPI korrekt anzeigen
 
Ich merke gerade erst...
ich kann das mit den Labels nicht machen, da ich einen RadioButton verwende und kein Label.

Jim Carrey 20. Okt 2016 15:52

AW: Formulare in hohen DPI korrekt anzeigen
 
Ich habe mir jetzt eine Funktion geschrieben, welche für mich die Arbeit mit dem Leerzeichen-Problem übernimmt.

Zur Erinnerung mein Aufbau:
[RadioButton_mit_einem___(EDIT_FELD)__ganz_langem_T ext]

Ihr dürft mich später erschlagen für meine Dummheit :thumb:
Delphi-Quellcode:
function calcSpacesNeeded(aEdit: TEdit): string;
var
 iEditWidth, iTmpWidth: Integer;
 i: Integer;
 s: string;
begin
 s := '';
 iEditWidth := aEdit.Width;

 for i := 0 to iEditWidth do
  begin
   s := s + ' ';

   iTmpWidth := Form3.Canvas.TextWidth(s);

   if iTmpWidth >= iEditWidth then
    begin
     s := s + '       ';
     Break;
    end;
  end;

 Result := s;
end;

RadioButton1.Caption := 'Radiobutton mit einem ' + calcSpacesNeeded(Edit1) + ' ganz langem Text';
Edit1.Left := 123;
Erklärung:
mein Code geht in einer for-Schleife von 0 bis "Width des Edits" in Pixeln durch.
Bei jedem Durchgang wird die aktuelle Width der Variablen "s" geprüft. Ist sie kleiner als die des Edits, so wird der Variablen "s" ein Leerzeichen angefügt.
Sobald Width des Konstrukts der Variablen "s" größer oder gleich der des Edits ist, ist Schluss. Vorher werden der Variablen "s" aber noch 8 weitere Leerzeichen angefügt (hat bei mir einen Sinn, da ich meine Edits modifiziere).

Das klappt bei 96 DPI und 120 dpi perfekt.

Aviator 20. Okt 2016 15:56

AW: Formulare in hohen DPI korrekt anzeigen
 
Ich würde keine Schleife zum Überprüfen machen. Ich würde mir einmal die Breite des Leerzeichens auf dem speziellen Canvas merken und dann die Größe des Editfeldes durch die Breite des Leerzeichens teilen. Somit bekommst du die Anzahl der Leerzeichen (plus eventuell noch 2 für einen Freiraum rechts und links vom Edit) und brauchst dann nur noch eine Schleife um die Anzahl der Leerzeichen zu erzeugen.

Ob es mit dem Format Befehl auch geht weiß ich nicht genau. Könntest du aber mal ausprobieren.

Vorteil dieser Methode ist, dass du nicht jedes Mal wieder die Breite auf dem Canvas überprüfen musst. Die ändert sich nämlich nicht mehr.

Jim Carrey 20. Okt 2016 16:01

AW: Formulare in hohen DPI korrekt anzeigen
 
Gute Idee, Danke dir =)

Delphi-Quellcode:
function calcSpacesNeeded(aControl: TControl): string;
var
 i, iTmpWidth, iSpaceWidth: Integer;
 sTmp: string;
 Canvas: TCanvas;
begin
 Canvas := TCanvas.Create;

 try
  Canvas.Handle := GetDC(0);

  try
   Canvas.Font := MainForm.Font;
   iSpaceWidth := Canvas.TextWidth(' ');
  finally
   ReleaseDC(0, Canvas.Handle);
  end;
 finally
  Canvas.Free;
 end;

 sTmp := '';
 iTmpWidth := aControl.Width div iSpaceWidth;

 for i := 0 to iTmpWidth do
  begin
   sTmp := sTmp + ' ';
  end;

 sTmp := sTmp + '       '; // 8 Leerzeichen, <Delphi> zeigt aber nur 1 an
 Result := sTmp;
end;

Jim Carrey 20. Okt 2016 16:33

AW: Formulare in hohen DPI korrekt anzeigen
 
Das würde mich auch brennend interessieren, ob man ein Control, sagen wir mal ein Edit, mit Format() an eine gewisse Stelle packen kann.

Aviator 20. Okt 2016 16:56

AW: Formulare in hohen DPI korrekt anzeigen
 
Zitat:

Zitat von Jim Carrey (Beitrag 1351526)
Das würde mich auch brennend interessieren, ob man ein Control, sagen wir mal ein Edit, mit Format() an eine gewisse Stelle packen kann.

Nein, das bestimmt nicht. Der Format Befehl ist dazu da, einen String entsprechend dem Wunsch zu formatieren und zurückzugeben. Ich dachte mit mit dem Format Befehl nur, dass der so in etwas aussehen könnte.

Delphi-Quellcode:
Format('%s.' + IntToStr(BlankCount), [' ']);
Aber keine Ahnung ob es da was passendes gibt. Eine For-Schleife ist in dem Fall ja auch gut.

Edit: Der Format Befehl kann ja führende Nullen ausgeben, deshalb kam ich da drauf.

Jim Carrey 20. Okt 2016 17:16

AW: Formulare in hohen DPI korrekt anzeigen
 
Ach so ok. Ja stimmt. Wäre auch zu schön gewesen, wenn es das geben würde. Wäre aber auch irgendwie idiotisch.

Habe mir das jedenfalls selber gebastelt. Ich muss zwar zwischen Label (ComboBox/RadioButton) und Edit unterscheiden, aber das macht mir nix.
Soweit ich das jetzt beurteilen kann, funktioniert es einwandfrei mit jeglicher DPI.

Vor dieser Aufgabe habe ich mich immer gescheut aber nun mache ich es, da immer mehr Anwender meiner Software hohe DPI-Einstellungen haben. Warum auch immer zum Teufel man das macht.

himitsu 20. Okt 2016 17:23

AW: Formulare in hohen DPI korrekt anzeigen
 
Zitat:

Delphi-Quellcode:
Format('%s.' + IntToStr(BlankCount), [' ']);

Delphi-Quellcode:
Format('%s.*', [' ', BlankCount]);
, aber sicher, daß es nach dem "s" stehen soll?


Delphi-Quellcode:
Format('%.*s', [BlankCount, ' ']);
:angle:
Delphi-Quellcode:
Format('%1.2s', ['3']) = Format('%*.*s', [1, 2, '3'])

Jim Carrey 20. Okt 2016 17:56

AW: Formulare in hohen DPI korrekt anzeigen
 
Zitat:

Zitat von himitsu (Beitrag 1351542)
Zitat:

Delphi-Quellcode:
Format('%s.' + IntToStr(BlankCount), [' ']);

Delphi-Quellcode:
Format('%s.*', [' ', BlankCount]);
, aber sicher, daß es nach dem "s" stehen soll?


Delphi-Quellcode:
Format('%.*s', [BlankCount, ' ']);
:angle:
Delphi-Quellcode:
Format('%1.2s', ['3']) = Format('%*.*s', [1, 2, '3'])

Jezt verstehe ich gar nichts mehr 8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz