わかりました、レイアウトの寸法に基づいてコントロールのサイズを変更する必要があります。また、レイアウトのサイズが変更されたときにサイズを変更する必要があります (たとえば、デバイスをプロファイルからランドスケープに変更する)。
デバイスの寸法を確認し、それに応じて調整するだけだと思いました
例えば
if ClientHeight > ClientWidth then
fHeader.Height:= ClientHeight Div 6
else
fHeader.Height:= ClientHeight Div 8;
しかし、これをどこに置くのが最適ですか?
レイアウトのサイズ変更前とレイアウトのサイズ変更後に Resize メソッドで試しました。うまくいかないようです!
フォームの最初のアクティブ化では機能しますが、フォームのサイズが変更されると機能しません。IDE にいる間は、動作させるために RELOAD ボタンを押す必要さえあります。
以下は、フォーム上に 2 つのコンポーネントがある例です。フォームの上部に配置された TW3HeaderControl と、クライアントに配置された TW3ListBox。TW3HeaderControl の高さを、プロファイルかランドスケープかに基づいて調整したいと思います。
例えば
unit Form1;
interface
uses
SmartCL.System, SmartCL.Graphics, SmartCL.Components, SmartCL.Forms,
SmartCL.Fonts, SmartCL.Borders, SmartCL.Application, SmartCL.Layout,
SmartCL.Controls;
type
TForm1 = class(TW3Form)
private
{$I 'Form1:intf'}
fLayout: TLayout;
fHeader: TW3HeaderControl;
fList: TW3ListBox;
protected
procedure InitializeForm; override;
procedure InitializeObject; override;
procedure Resize; override;
end;
implementation
{ TForm1 }
procedure TForm1.InitializeForm;
begin
inherited;
// this is a good place to initialize components
fLayout:= Layout.Client([Layout.Top(fHeader), Layout.Client(fList)]);
end;
procedure TForm1.InitializeObject;
begin
inherited;
{$I 'Form1:impl'}
fHeader:= TW3HeaderControl.Create(self);
fList:= TW3ListBox.Create(self);
end;
procedure TForm1.Resize;
begin
inherited;
if assigned(FLayout) then
begin
fLayout.Resize(self);
if ClientHeight > ClientWidth then
fHeader.Height:= ClientHeight Div 6
else
fHeader.Height:= ClientHeight Div 8;
end;
end;
initialization
Forms.RegisterForm({$I %FILE%}, TForm1);
end.
「FormActivated」をオーバーライドしてそこに配置し、Resize を呼び出してみました。
何を与える?
アップデート!!!!!
InitializeForm でレイアウトを割り当てる代わりに
例えば
procedure TForm1.InitializeForm;
begin
inherited;
// this is a good place to initialize components
fLayout:= Layout.Client([Layout.Top(Layout.Height(ClientHeight Div 6),fHeader), Layout.Client(fList)]);
end;
代わりに Resize メソッドで割り当てますか??
例えば
procedure TForm1.Resize;
begin
inherited;
if ClientWidth > ClientHeight then
fLayout:= Layout.Client([Layout.Top(Layout.Height(ClientHeight Div 6),fHeader), Layout.Client(fList)])
else
fLayout:= Layout.Client([Layout.Top(Layout.Height(ClientHeight Div 8),fHeader), Layout.Client(fList)]);
fLayout.Resize(self);
end;
更新 # 2
そして、フォームに別のコントロールを追加すると、別の問題があります:(
サイズを静的な値として設定すると、うまく機能します
procedure TForm1.InitializeObject;
begin
inherited;
{$I 'Form1:impl'}
fHeader:= TW3HeaderControl.Create(self);
fHeader.Height:= 50; //******************************
fHeader.BackButton.Visible:= False;
fHeader.Title.Caption:= 'Menu';
fHeader.Title.AlignText:= taCenter;
fFooter:= TW3HeaderControl.Create(self);
fFooter.Height:= 50; //******************************
fFooter.BackButton.Visible:= False;
fFooter.Title.Caption:= 'Copyright (C) 2016';
fFooter.Title.AlignText:= taCenter;
fList:= TW3ListBox.Create(self);
end;
これは動作します
procedure TForm1.InitializeForm;
begin
inherited;
// this is a good place to initialize components
fLayout:= Layout.Client([Layout.Top(fHeader),
Layout.Bottom(fFooter),
Layout.Client(fList)]);
end;
ただし、寸法に基づいて実行時に高さを動的に設定すると、そうではありません
procedure TForm1.InitializeForm;
begin
inherited;
// this is a good place to initialize components
fLayout:= Layout.Client([Layout.Top(Layout.Height(ClientHeight Div 6), fHeader),
Layout.Bottom(Layout.Height(ClientHeight Div 6),fFooter),
Layout.Client(fList)]);
end;