![]() |
Nicht nur Form vergrößern, sondern auch Elemente
Hi !
Ich stehe mal wieder vor einem kleinen großen Problem :-D Ich möchte, das meine Form sich an die Bildschirmauflösung anpasst. Dank der vielen Einträge im Forum, klappt das alles soweit. Nur ... jetzt kommt es ... Meine Panels sollen sich auch mit vergrößern. An sich wäre das ja kein Problem, wenn ich ihnen einfach die Bildschrimgröße zuweise. Aber die Buttons sitzen ja dann nicht mehr richtig auf dem Panel. Oder seh ich das falsch ? Gibt es da nen einfachen Trick, wie ich das gesamte Programm auf Bildschirmgröße stretchen kann, ohne jedem Element ne neue Größe und Position zuzuweisen ? Vielen Dank schon mal im voraus für die Hilfe :) |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Schau mal bei .Anchors
|
Re: Nicht nur Form vergrößern, sondern auch Elemente
Hmm ... mit Anchors geht das irgendwie nicht.
Er zieht mir das zwar alles auf Vollbild, aber die Elemente behalten ihre Ursprungsgröße .. Das ist etwas blöd ... |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Du musst diese Einstellungen bei jeder Komponenten setzen. :)
|
Re: Nicht nur Form vergrößern, sondern auch Elemente
Meinst Du alle Anchors auf true oder alle auf false ?
Das haut irgendwie auch nicht so ganz hin ... :? |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Wenn du willst, dass die Größe berücksichtigt wird, muss es auf "True" stehen. :)
|
Re: Nicht nur Form vergrößern, sondern auch Elemente
Klappt nicht so ganz :(
Ich erklär am besten mal, wie ich es gemacht habe :) In meiner Form, auf der die Panels und Buttons sitzen habe ich geschrieben:
Delphi-Quellcode:
Dann habe ich bei der Form und bei allen Elementen
procedure TForm2.FormCreate(Sender: TObject);
// ... Form2.Height := Screen.Height; Form2.Width := Screen.Width; // ... Anchors auf true gesetzt (alle 4). Ja. Vollbild hab ich. Aber nur die Hintergrundfarbe geht über den ganzen Bildschirm. Die Elemente sind immernoch in Ursprungsgröße .. Oder hab ich was entscheidendes vergessen ? :coder2: P.S.: Was hat es eigentlich mit diesem onResize auf sich ? Hab ich auch hier im Forum gelesen. Muss ich das vielleicht noch verwenden ? Falls ja wie ... bin leider daran gescheitert :shock: |
Re: Nicht nur Form vergrößern, sondern auch Elemente
OnResize wird halt ausgelöst, wannimmer sich die Formulargröße ändert..
Wäre also durchaus sinnvoll event. notwendige Anpassungen in diesem Event vorzunehmen |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Bei mir meistens:
PageControl = Align := alClient (immer formfüllend) Statusbar & MainMenu = Align Top bzw. Bottom rest (knöpfe, Groupboxen & co) mit Anchors bzw. onResize Die Anchors (Anker) halten immer den abstan zum entsprechendem Rand: Anchors := [] (alle False) lässt die Kompo "mittig" rumschweben. Bei Anchors := [akLeft,akTop,akRight,akBottom] (alle true) wächst die Komponente mit der Form. Kannste dir auch schon in der IDE angugn! |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Vielen Dank erst mal für eure Hilfe :)
Also, ich hab es für`s erste so gelöst, das ich beim onResize des entsprechenden Elements eine Position angebe. Z.B. so:
Delphi-Quellcode:
Irgendwie hab ich das Gefühl, das ist ziemlicher Pfusch was ichprocedure TForm2.LMDBackPanel4Resize(Sender: TObject); begin LMDBackPanel4.Height := Screen.Height; LMDBackPanel4.Width := Screen.Width - LMDBackPanel1.Width; end; da gemacht habe :lol: Naja. Wer weiß. Denn angenommen, ich hab 100 Panels ... Das kann ich doch nicht für jedes einzelne Panel machen ? :shock: Das geht doch sicher einfacher ... |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Liste der Anhänge anzeigen (Anzahl: 1)
Ich denke, dass was er sucht ist das wirkliche Scaling. Folgende Methode erledigt die Aufgabe. Im Anhang ist auch ein Beispielprojekt.
Delphi-Quellcode:
...:cat:...
procedure TForm1.MaximizeAndScale;
var sWidth: Double; sHeight: Double; begin sWidth := Screen.MonitorFromWindow(Handle).Width / Width; sHeight := Screen.MonitorFromWindow(Handle).Height / Height; if sWidth < sHeight then begin ScaleBy(Round(Screen.MonitorFromWindow(Handle).Width * 1.02), Width); end else begin ScaleBy(Round(Screen.MonitorFromWindow(Handle).Height * 1.02), Height); end; WindowState := wsMaximized; end; |
DP-Maintenance
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
|
Re: Nicht nur Form vergrößern, sondern auch Elemente
:dancer: Coooool :thumb:
Das war genau das was ich gesucht hatte !!!!!!!!!! Vielen Dank !!!!! :) |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Kannst Du mir noch erklären, was genau in diesem Abschnitt passiert ?
Zitat:
|
Re: Nicht nur Form vergrößern, sondern auch Elemente
Moin, moin,
Zitat:
Dadurch zerlegt es das Formular, wenn es häufig vergrößert/verkleinert wird. |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Zitat:
...:cat:... |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Liste der Anhänge anzeigen (Anzahl: 1)
Die im Anhang befindliche Unit sollte da etwas "geschmeidiger" Funktionieren, als ScaleBy :hi:
|
Re: Nicht nur Form vergrößern, sondern auch Elemente
Zitat:
Sitzen die Buttons dann nicht mehr richtig ? Oder verschwinden sie komplett ? Also, ich nutze das schon häufig mit der Größe (das sie verändert werden muss). |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Zitat:
Dito was die Größe der Buttons angeht. Irgendwann ist das Form dann nur noch Schrott. |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Zitat:
@ cats: Wenn Du die ScaleBy-Funktion nutzt, solltest Du Dein Form beim Schließen freigeben und es beim Aufruf neu erzeugen. Dann hast Du auch keine Rundungseffekte, jedenfalls wenn Du BorderStyle bsSingle setzt. Grüße, Messie |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Vielen Dank für Eure Hilfe !!
Für`s erste läuft alles :) :dp: Gruß, -=cats=- :coder: |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Zitat:
Zitat:
|
Re: Nicht nur Form vergrößern, sondern auch Elemente
Zitat:
Grüße, Messie |
Re: Nicht nur Form vergrößern, sondern auch Elemente
Sooo, ich habe mal
Delphi-Quellcode:
durch
if (FComponent = nil)
or (FComponent.Align = alClient) then Exit;
Delphi-Quellcode:
ersetzt. Jetzt wird die Schriftgröße so angepaßt wie bei den anderen Controls. Wenn alclient zu sehr großen Änderungen des Controls führt, wird das natürlich nicht optimal. Aber das soll die Kompo ja eigentlich durch die Skalierung verhindern.
if FComponent = nil then exit;
if FComponent.Align = alClient then begin if FHasFontProp then begin NewFontSize := InitFontSize; FCompFont.Size := NewFontSize; SetCompFont(Component, FCompFont); end; if (Round(OwnerHeight) = InitOwnerHeight) and (Round(OwnerWidth) = InitOwnerWidth) then begin if FHasFontProp then begin NewFontSize := InitFontSize; FCompFont.Size := NewFontSize; SetCompFont(Component, FCompFont); end; end else begin if FHasFontProp then begin NewFontSize := Round(InitFontSize * HeightRatio - 0.5); if NewFontSize > FSglMaxFontSize then NewFontSize := FSglMaxFontSize; if NewFontSize < FSglMinFontSize then NewFontSize := FSglMinFontSize; FCompFont.Size := NewFontSize; SetCompFont(Component,FCompFont); end; end; FComponent.Align := alClient; FComponent.Repaint; Application.ProcessMessages; Exit; end; Es bleibt noch ein Problem: ich habe zwei Elemente, die albottom sind, ein Panel und einen Statusbar. Nach ResizeAll wird der Statusbar über das Panel gesetzt. Dies passiert nur, wenn das Form ein untergeordnetes ist! In einem Testprojekt lief das glatt solange ich im MainForm war... Trotzdem meiner Meinung nach ein sehr gutes Projekt was die Weiterentwicklung auch berechtigt Grüße, Messie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 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