Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Formularinhalte bei OnResize neu skalieren (https://www.delphipraxis.net/182030-formularinhalte-bei-onresize-neu-skalieren.html)

LokutusvB 25. Sep 2014 08:09

Delphi-Version: 5

Formularinhalte bei OnResize neu skalieren
 
Guten Morgen,

mir ist zwar bekannt, wie ich bei FormCreate ein Fenster auf die Bildschirmgröße anpassen und den Inhalt skalieren kann, aber ich bastel nun schon eine Zeit lang an einer Lösung, wie ich bei onResize den Formularinhalt neu skalieren kann, komme aber auf keine brauchbare Lösung. Zudem erzeugt ScaleBy bei OnResize einen "Flackereffekt", der negativ auffällt. Geht das auch anders? Hat jemand eine Lösung oder einen Lösungsansatz?

TiGü 25. Sep 2014 09:35

AW: Formularinhalte bei OnResize neu skalieren
 
Lade hier ein kleines Beispielprojekt hoch, um dein Problem zu verdeutlichen!

In der Regel (!) muss man sehr selten visuelle Komponenten über das OnResize-Event des Formulars neu ausrichten und in der Größe anpassen.
Oft sind viele Probleme mit den Propertys Anchors, Constraints und Align der jeweiligen Komponente gut zu lösen.

LokutusvB 25. Sep 2014 10:00

AW: Formularinhalte bei OnResize neu skalieren
 
Danke dir. Wo finde ich dein kleines Beispielprojekt?

Der schöne Günther 25. Sep 2014 10:09

AW: Formularinhalte bei OnResize neu skalieren
 
Du solltest ein Beispielprojekt hochladen um zu verdeutlichen was dein Problem ist ;-)

Bitte nicht krumm nehmen, aber eine ganz dumme Frage: Layout-Helfer wie TGridPanel und Eigenschaften wie Align (die jedes Control hat) kennst du aber, oder?
Weil ich kann mir eigentlich nur wenige Fälle vorstellen, wo einem das Resize des Formulars sonst überhaupt kümmern würde...

LokutusvB 25. Sep 2014 10:52

AW: Formularinhalte bei OnResize neu skalieren
 
Ja, das Panel und die Eigenschaft Align kenne ich. Nur nützt mir das nichts, weil durch das Nutzen dieser Eigenschaften die Größe der Komponenten nicht bei einer Größenänderung der Form geändert werden. Aber genau das möchte ich erreichen.

Viel beinhaltet mein Beispielprojekt noch nicht. Das ist ein Formular mit ein paar Buttons und einer Procedure bei OnCreate, die man häufig im Netz findet:

Code:
procedure TF_Form1.FormCreate(Sender: TObject);
var
  x, y : Integer;
begin
  x := Screen.Width;
  y := Screen.Height;
  if (x <> breite) or (y <> hoehe)then begin
    F_Form1.width := (F_Form1.ClientWidth * x DIV breite)
                  + F_Form1.Width - F_Form1.ClientWidth;
    F_Form1.height := (F_Form1.ClientHeight * y DIV hoehe)
                  + F_Form1.Height - F_Form1.Clientheight;
    Scaleby(x, breite);
  end;
end;
Den nicht funktionierenden Code bei OnResize habe ich immer wieder verwurfen. War ja eh fehlerhaft.

Der schöne Günther 25. Sep 2014 11:12

AW: Formularinhalte bei OnResize neu skalieren
 
Ich stelle mich da beim Verstehen immer dumm an. Deswegen das Beispielprojekt- Was ist das konkrete Problem: Das ein Memo, ein ListView sich mit in der Größe ändern soll?

Ich habe immer alles in Gridpaneln und 90% meiner Komponenten sind immer alClient- Skalieren also in ihrem Bereich (das Gridpanel-Feld) mit. Und das Gridpanel sorgt immer dafür dass die Felder immer relative oder absolute Größen haben.

LokutusvB 25. Sep 2014 12:14

AW: Formularinhalte bei OnResize neu skalieren
 
Ja, die Form soll später mal eine ListView, ein paar Buttons und ein PageControl bekommen. Diese Komponenten, sollten wenn möglich bei Größenänderung der Form auch ihre Größe ändern, inklusive der Schrift.

Mit der Procedure des FormCreate klappt das zumindest beim Anpassen an die Bildschirmgröße, abgesehen von der Breite der Tabsheets und der Breite der Spalten der ListView. Diese müßte man dann wieder manuell anpassen.

hathor 25. Sep 2014 13:56

AW: Formularinhalte bei OnResize neu skalieren
 
Liste der Anhänge anzeigen (Anzahl: 2)
Nimm doch die Komponente EASYSIZE (Torry.net):
http://www.delphipraxis.net/74959-fo...skalieren.html

LokutusvB 25. Sep 2014 15:01

AW: Formularinhalte bei OnResize neu skalieren
 
EasySize funktioniert leider nur teilweise. Das Pagecontrol z.B. wird nicht skaliert und eine ListView leider auch nicht. Allerdings wurde das EasySize, so wie es aussieht, auch nur bis Delphi 3 getestet. Die Version, die man laden kann, ist von 1999.

hathor 25. Sep 2014 16:52

AW: Formularinhalte bei OnResize neu skalieren
 
Funktioniert mit XE2 und WINDOWS 8.
Wahrscheinlich hast Du nicht die ReadMe gelesen!

Setze alles auf ein Panel.

Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
begin
    FormResizer1.InitializeForm;
    FormResizer1.EnforceMinSize:= true;
    FormResizer1.ResizeFonts:= true;
    Panel1.align:= alClient;
end;

procedure TForm2.FormResize(Sender: TObject);
begin
    FormResizer1.ResizeAll;
end;

hoika 25. Sep 2014 19:31

AW: Formularinhalte bei OnResize neu skalieren
 
Hallo,

den Flacker-Effekte minimierst du mit LockWindowUpdate um das ScaleBy.
Ich habe auch mal einen Timer genommen, um erst nach dem OnResize das ScaleBy aufzurufen.

Heiko

hathor 25. Sep 2014 20:05

AW: Formularinhalte bei OnResize neu skalieren
 
Flickern tut es wahrscheinlich nur in älteren WINDOWS-Versionen -
...oder OHNE Panel.

LokutusvB 26. Sep 2014 07:09

AW: Formularinhalte bei OnResize neu skalieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von hathor (Beitrag 1273821)
Funktioniert mit XE2 und WINDOWS 8.
Wahrscheinlich hast Du nicht die ReadMe gelesen!

Setze alles auf ein Panel.

Danke fürden Tip. Doch, ich habe die Readme gelesen. Davon steht da nichts. Ich habe das Gefühl, von der Komponente eine ältere Version geladen zu haben. Diese lies sich z.B. in XE registrieren, hat aber kein Symbol für eine Komponente. Ist das im Anhang die richtige Komponente?

Zusatz:
Alle Komponenten auf einem Panel anlegen hat am Verhalten der Listview und des PageControl nichts verändert, leider.

hathor 26. Sep 2014 07:30

AW: Formularinhalte bei OnResize neu skalieren
 
In #8 habe ich die Komponente angefügt.

LokutusvB 26. Sep 2014 07:37

AW: Formularinhalte bei OnResize neu skalieren
 
Danke für die Info. Ich habe die Komponente direkt von Tory geladen. Die von die Eingestellte ist viel größer. Ich werde es mit deiner Komponente erneut versuchen und mich wieder melden. :)

LokutusvB 29. Sep 2014 08:21

AW: Formularinhalte bei OnResize neu skalieren
 
Morgen,

das verhalten bleibt leider auch mit der von dir hochgeladenen Komponente gleich. Die Breite der PageControls bleibt unverändert. So lang ich beim Größeändern die Maus gedrückt lasse, ändert sich auch die Größe des ListViews. Lasse ich die Maus los, setzt sich das ListView auf seine Originalgröße zurück.

Ist das ein bekannter Fehler oder liegt das an irgend einer Einstellung?

Zusatz:
Ich bin nun zusätzlich noch den Weg einer TScreenHelper Klasse gegangen, auch hier lässt sich nicht alles richtig skallieren, es tritt der selbe Effekt auf. Mir scheint, als wäre die VCL dafür nicht ausgelegt. Da werde ich mich wohl doch wieder mit dem Firemonkey auseinandersetzen müssen.

hathor 29. Sep 2014 19:04

AW: Formularinhalte bei OnResize neu skalieren
 
Bitte Sourcecode.

LokutusvB 1. Okt 2014 09:38

AW: Formularinhalte bei OnResize neu skalieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich lade das kleine Testprojekt hoch.

Das Align des MainPanel hat keine Auswirkung auf das Verhalten. Das Align des PageControl auch nicht. Die Splatenbreite des PageControl hat auch keine Auswirkung, ob ich sie auf 0 setze (variabel belasse) oder eine feste Breite vorgebe. Der ListView ist ganz und gar egal, was man vorgibt, die Spaltenbreite wird nur verändert, wenn ich das manuell durchführe oder aber im Quelltext.

hathor 1. Okt 2014 10:23

AW: Formularinhalte bei OnResize neu skalieren
 
ExtListViewCtrl + PDJButton hat nicht jeder.

LokutusvB 1. Okt 2014 10:33

AW: Formularinhalte bei OnResize neu skalieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Och, diese Seiten hier nerven ein wenig. Ich hatte das bereits gemerkt und eine neue Version hochgeladen. Anscheinend hat das System das aber nicht registriert. Ich lade den Anhang noch mal neu hoch.

hathor 1. Okt 2014 12:07

AW: Formularinhalte bei OnResize neu skalieren
 
Panel1.align:= alClient;


ListView-Spaltenbreite

Delphi-Quellcode:
procedure TF_Liste.FormResize(Sender: TObject);
begin
  eAS.ResizeAll;
  ListView1.Column[0].Width:= ColumnHeaderWidth;
  ListView1.Column[1].Width:= ColumnHeaderWidth;
end;

LokutusvB 1. Okt 2014 12:55

AW: Formularinhalte bei OnResize neu skalieren
 
Danke für Mühe!

Panel1.align=alClient hatte ich bereits probiert. Mit meinem letzten Text meinte ich, egal auf was die Eigenschaft laign steht, es hat keine Auswirkung auf die enthaltenen Komponenten.

Was genau meinst du mit ListView-Spaltenbreite? Der Trick mit der Headerbreite ist ein guter Trick, den muß ich mir merken. Das ist sicher auf den Inhalt der anderen Zeilen abbildbar unter Berücksichtigung einer maximalen Spaltenbreite. Bliebe noch das PageControl. Da habe ich noch immer keine passende Idee, außer das ganze immer wieder per Code nachzubessern.

Zusatz:
Bei einem Speed- oder Bit-Button wird leider das Bild nicht mit skaliert. Gibt es vielleicht auch dafür eine Lösung?

hathor 1. Okt 2014 15:52

AW: Formularinhalte bei OnResize neu skalieren
 
Wirf diese Zeile raus: Screen.SetPixelsPerInch(240);

Button-Komponente suchen, die das kann...

oder manuell: Mehrere BMP im Unterordner in versch. Größen

Delphi-Quellcode:
var  bmp1 : TBitmap; //globale var
...
procedure TF_Liste.FormCreate(Sender: TObject);
begin
bmp1 := TBitmap.Create; { Bitmap erzeugen }
...
procedure TF_Liste.FormShow(Sender: TObject);
begin
   bmp1.LoadFromFile('battery30.bmp'); //beispiel 30pixel
end;
...
procedure TF_Liste.FormResize(Sender: TObject);
begin
  eAS.ResizeAll;
  ListView1.Column[0].Width:= ColumnHeaderWidth;
  ListView1.Column[1].Width:= ColumnHeaderWidth;
   bmp1.LoadFromFile('batteryxx.bmp'); //beispiel xx-pixel - abhängig von der Form-Size
  SpeedButton1.Glyph:= bmp1;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:59 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