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/)
-   -   Form Größe zur Laufzeit ändern klappt nicht richtig (https://www.delphipraxis.net/203254-form-groesse-zur-laufzeit-aendern-klappt-nicht-richtig.html)

TurboMagic 28. Jan 2020 16:07

Form Größe zur Laufzeit ändern klappt nicht richtig
 
Gegeben Delphi 10.3.2 und eine VCL FOrm mit diesen eigenschaften:

- 1 TPanel top aligned
- 1 TPanel client aligned
- 1 TPanel bottom aligned

Je nach dem welche Daten vorliegen möchte ich das Top oder das Client Panel verbergen
und die Form um deren Größe verkleinern bzw. beim Top Panel auch ggf. die Höhe
an die Menge des darzustellenden Texts anpassen. Im Form designer ist dieses Panel auf
die maximale Länge zu erwartenden Texts ausgelegt.

Im OnCreate der Form prüfe ich, ob das client aligned Panel versteckt werden muss und
falls ja rufe ich das hier auf:

SetBounds(Left, Top, Width, Height - ClientPanel.Height);

Rechnerisch scheint das in Ordnung zu sein, beim Ausführen ist die Form in der Höhe
aber so winzig, dass noch nicht mal die Titelleiste ganz dargestellt wird.

Bei der dynamischen Änderung des Top-Panels genau dasselbe, daher vermutlich der
selbe Fehler.

Woran liegt das?

Neutral General 28. Jan 2020 16:15

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Hast du mal geschaut welche Werte Height/ClientPanel.Height haben beim setzen der Bounds?

TurboMagic 28. Jan 2020 16:17

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Hallo,

ja, mit dem Debugger und das sah vernünftig aus.

hoika 28. Jan 2020 17:32

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Hallo,
müsste Du nicht ClientHeight statt Height nehmen?

TurboMagic 28. Jan 2020 17:50

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Hallo,

ich glaube nicht, dass das einen Unterschied bewirken würde ob ich
nun ClientHeight oder Height nehme.

Evtl. muss ich das mal morgen mit einem einfachen Testprogramm ausprobieren...

Grüße
TurboMagic

Neutral General 28. Jan 2020 18:38

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hab es eben ausprobiert und es klappt ohne Probleme:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    plClient: TPanel;
    Panel3: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetBounds(Left, Top, Width, Height - plClient.Height);
end;

end.
Design:

https://www.delphipraxis.net/attachm...1&d=1580232969

Laufzeit:

https://www.delphipraxis.net/attachm...1&d=1580232969

himitsu 28. Jan 2020 19:03

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Zitat:

ich glaube nicht, dass das einen Unterschied bewirken würde ob ich
nun ClientHeight oder Height nehme.
Wenn man aktuelle Höhe minus Höhe der entfernten Komponente nimmt und es der selben Höhen-Eigenschaft zurückübergibt, dann ist es egal.
Selbes = Client-Bereich (Innenmaße) oder Fenster-Bereich (Außenmaße)



Bei Höhe ausrechnen (ohne aktuelle Höhe zu beachten) und irgendeiner Höhen-Eigenschaft zuweisen, das geht schnell schief.
Hier besser ClientHight/ClientRect verwenden, anstatt und Hight/BoundRect, denn bei Letzeterem sind auch TitelLeiste und Rahmen drin, die mit jeder Windowsverions andere Dimensionen hatten.
PS: Das ist auch der Grund, warum Delphi inzwischen ClientHeight/ClientWidth bei den TForm in den DFMs speichert, weil es früher echt blöd war, wenn das Programm in einer Windowsversion, bzw. mit einer gewissen Benutzereinstellung des Desktops kompilert wurde, später und woanders plötzlich der Inhalt des Fensters schnell nicht mehr passte.

Im Windows 10 besonders gut zu bemerkten, denn der FormDesigner arbeitet immernoch mit dem Windows-7-Style und zur Laufzeit hat das Fenster nun außen eine andere Größe, aber innen stimmt es. (falls man keine alte DFM mit Width/Heigt lädt und vorher noch nicht neu gespeichert hat)
Oder DevExpress-Styles und MDI ... eingebettet alter Style und ausgebettet/freifliegend der Neue. :freak:

TurboMagic 29. Jan 2020 12:56

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Inzwischen klappt es auch bei mir.

Ich hatte Height etwas zugewiesen was eigentlich in eine temporäre Variable sollte,
da es nicht immer zu verwenden war. Duh!

Der Tipp mit dem ClientHeight war aber auch ein nützlicher! Da hatte ich gar nicht
mehr dran gedacht.

Grüße
TurboMagic

himitsu 29. Jan 2020 17:34

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Bei ClientHeight muß man leider manchmal aufpassen, z.B. wenn man im Contructor der Form darauf zugreifen will, oder bei Komponenten, die grade keinen Parent haben oder unsichtbar sind.
Manchmal kann dort der ClientOffest nicht bestimmt werden und dann kommt dort eine Exception aus dessen Getter/Setter.

TurboMagic 29. Jan 2020 20:59

AW: Form Größe zur Laufzeit ändern klappt nicht richtig
 
Danke für diese Zusatztipps!


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