2

わかりました、レイアウトの寸法に基づいてコントロールのサイズを変更する必要があります。また、レイアウトのサイズが変更されたときにサイズを変更する必要があります (たとえば、デバイスをプロファイルからランドスケープに変更する)。

デバイスの寸法を確認し、それに応じて調整するだけだと思いました

例えば

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;
4

2 に答える 2

3

これは機能します

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;
于 2016-12-29T00:30:31.367 に答える
3

オブジェクト パスカルの観点からは奇妙に思える、ブラウザーによって課せられる規則がいくつかあります。InitializeForm と InitializeObject の違いはその 1 つです。「形」の奇妙さもそうです。

John が指摘するように、InitializeForm は適切な場所です。このメソッドは、JS オブジェクトが構築され、DOM 要素がオブジェクト モデルに挿入された後に呼び出されます。これら 2 つは同じものではないため、少し混乱する可能性があります。また、 createElement() を呼び出したとき、またはコンストラクターが終了した後に要素が作成されるかどうかはブラウザー次第です。したがって、これに対処するためにいくつかの新しい手順を導入する必要がありました。

TApplication をもう少し詳しく調査することをお勧めします。TApplication -> Display -> View があります。フォームは「view」コンテナ内に作成されます。フォームの向きやサイズが変わるたびに、Application.Display.View.OnReSize() イベントを介して通知を受けるのが最速の方法です。

于 2016-12-30T11:21:47.640 に答える