Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Nicht nur Form vergrößern, sondern auch Elemente (https://www.delphipraxis.net/78740-nicht-nur-form-vergroessern-sondern-auch-elemente.html)

-=cats=- 10. Okt 2006 14:34


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 :)

mkinzler 10. Okt 2006 14:37

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Schau mal bei .Anchors

-=cats=- 10. Okt 2006 14:44

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 ...

ste_ett 10. Okt 2006 14:57

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Du musst diese Einstellungen bei jeder Komponenten setzen. :)

-=cats=- 10. Okt 2006 15:02

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 ... :?

ste_ett 10. Okt 2006 15:03

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Wenn du willst, dass die Größe berücksichtigt wird, muss es auf "True" stehen. :)

-=cats=- 10. Okt 2006 15:08

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:
procedure TForm2.FormCreate(Sender: TObject);
 // ...
 Form2.Height := Screen.Height;
  Form2.Width := Screen.Width;

// ...
Dann habe ich bei der Form und bei allen Elementen
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:

Neon-chan 10. Okt 2006 15:14

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

TeronG 10. Okt 2006 15:26

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!

-=cats=- 10. Okt 2006 15:30

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:

procedure TForm2.LMDBackPanel4Resize(Sender: TObject);
begin
  LMDBackPanel4.Height := Screen.Height;
  LMDBackPanel4.Width := Screen.Width - LMDBackPanel1.Width;
end;
Irgendwie hab ich das Gefühl, das ist ziemlicher Pfusch was ich
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 ...

sakura 10. Okt 2006 15:30

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:
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;
...:cat:...

DP-Maintenance 10. Okt 2006 15:40

DP-Maintenance
 
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.

-=cats=- 11. Okt 2006 07:18

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
:dancer: Coooool :thumb:

Das war genau das was ich gesucht hatte !!!!!!!!!!

Vielen Dank !!!!! :)

-=cats=- 11. Okt 2006 08:09

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Kannst Du mir noch erklären, was genau in diesem Abschnitt passiert ?

Zitat:

Zitat von sakura
Delphi-Quellcode:
  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;

Warum *1.02 ?

kalmi01 11. Okt 2006 08:20

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Moin, moin,
Zitat:

Zitat von sakura
Ich denke, dass was er sucht ist das wirkliche Scaling. Folgende Methode erledigt die Aufgabe

Einzger Haken dabei ist die ScaleBy-interne Rundung auf ganze Pixel.
Dadurch zerlegt es das Formular, wenn es häufig vergrößert/verkleinert wird.

sakura 11. Okt 2006 08:26

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Zitat:

Zitat von -=cats=-
Warum *1.02 ?

Wie Kalmi schon geschrieben hat, wird intern viel gerundet und über die Zeit habe ich einfach festgestellt, dass beim Vergrößern ca. 2% Abweichung korrigiert werden wollen. Beim Verkleinern muss man diese wieder negativieren. Aber wenn es oft hin und her geht, dann geht das Layout verloren. Zum Starten ist es okay, aber häufig nutzen ist imo keine gute Idee.

...:cat:...

kalmi01 11. Okt 2006 08:37

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:

-=cats=- 11. Okt 2006 09:15

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Zitat:

Zitat von sakura
Aber wenn es oft hin und her geht, dann geht das Layout verloren.

Was meinst Du damit ?
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).

kalmi01 11. Okt 2006 10:03

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Zitat:

Sitzen die Buttons dann nicht mehr richtig ? Oder verschwinden sie komplett ?
Wenn die Koordinate mehrfach berechnet werden und das Ergebnis wir anschl. auf integer gerundet, dann veränder sich halt die Positionen.
Dito was die Größe der Buttons angeht.
Irgendwann ist das Form dann nur noch Schrott.

messie 11. Okt 2006 11:42

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Zitat:

Zitat von kalmi01
Die im Anhang befindliche Unit sollte da etwas "geschmeidiger" Funktionieren, als ScaleBy :hi:

Magst Du die Kompo mal mit ein paar Worten beschreiben? Woher, wohin, wozu?



@ 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

-=cats=- 11. Okt 2006 13:50

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:

kalmi01 11. Okt 2006 15:14

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Zitat:

Zitat von messie
Magst Du die Kompo mal mit ein paar Worten beschreiben?

Wenn Du die dynForm.txt liest, weist Du
Zitat:

Woher, wohin, wozu?
Sogar: Was und Wie stehen in den paar KB.

messie 12. Okt 2006 11:58

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Zitat:

Zitat von kalmi01
Zitat:

Zitat von messie
Magst Du die Kompo mal mit ein paar Worten beschreiben?

Wenn Du die dynForm.txt liest, weist Du
Zitat:

Woher, wohin, wozu?
Sogar: Was und Wie stehen in den paar KB.

Hmmm, da war wohl schon Mittagsschlaf. Ich habe die Kompo mal probiert: leider wird bei einigen Komponenten die Schriftgröße nicht angepaßt. Ich hab' es noch nicht ganz durchschaut aber es muß etwas mit alclient zu tun haben. Ich habe ein drei Panels, eins altop, eins albottom, ein alclient. Beim dem alclient und allen untergeordneten geht die Skalierung schief. Ohne diese Zuordnung läuft die Skalierung ganz schief.

Grüße, Messie

messie 12. Okt 2006 19:27

Re: Nicht nur Form vergrößern, sondern auch Elemente
 
Sooo, ich habe mal
Delphi-Quellcode:
if (FComponent = nil)
           or
           (FComponent.Align = alClient)
        then Exit;
durch
Delphi-Quellcode:
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;
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.
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 22:14 Uhr.

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