![]() |
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? |
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. |
AW: Formularinhalte bei OnResize neu skalieren
Danke dir. Wo finde ich dein kleines Beispielprojekt?
|
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... |
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:
Den nicht funktionierenden Code bei OnResize habe ich immer wieder verwurfen. War ja eh fehlerhaft.
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; |
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. |
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. |
AW: Formularinhalte bei OnResize neu skalieren
Liste der Anhänge anzeigen (Anzahl: 2)
Nimm doch die Komponente EASYSIZE (Torry.net):
![]() |
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.
|
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; |
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 |
AW: Formularinhalte bei OnResize neu skalieren
Flickern tut es wahrscheinlich nur in älteren WINDOWS-Versionen -
...oder OHNE Panel. |
AW: Formularinhalte bei OnResize neu skalieren
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zusatz: Alle Komponenten auf einem Panel anlegen hat am Verhalten der Listview und des PageControl nichts verändert, leider. |
AW: Formularinhalte bei OnResize neu skalieren
In #8 habe ich die Komponente angefügt.
|
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. :)
|
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. |
AW: Formularinhalte bei OnResize neu skalieren
Bitte Sourcecode.
|
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. |
AW: Formularinhalte bei OnResize neu skalieren
ExtListViewCtrl + PDJButton hat nicht jeder.
|
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.
|
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; |
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? |
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