Formなどのサイズを指定する場所/タイミング

解決


勉強中  2007-12-17 02:28:11  No: 28967

以前複数のFormを追加する方法を教えていただいた者です。
最初はForm2のデザイン時に編集画面上でForm2のサイズ、ボタンなどのコンポーネントを配置していました。  その後ケースによってForm2のサイズ、ボタンなど各コンポーネントの位置、Formの表示位置などを変更する必要が出てきました。

そこで
Form2.Width:=500;  Form2.Button1.Width:=80;  Form2.Button1.Height:=20;
Form2.Buuton1.Left:=L+20;  などとサイズ、位置に関する指定をTForm2.FormCreateに書いたりしてみましたがFormのサイズなどが結果に反映されませんでした。Resizeに書くべきなのかActivateに書くべきかなど試しましたが正解がわかりません。通常はFormのサイズ設定をどの場所、どのタイミングで行うのか教えてください。


KHE00221  2007-12-17 05:00:24  No: 28968

フォームやコンポーネントのサイズはFormCreate時に設定して変更されると思いますが?


かず  2007-12-17 06:54:36  No: 28969

FormShowイベントに書いたらどうでしょうか?


イベントハンドラに固執?  2007-12-17 07:40:51  No: 28970

Form2を動的に生成して、その際に「ケースによって」フォームのサイズや内部部品の配置など変えたいのなら、生成時にそれを指定すべし。

//1番目のケース
>procedure TForm1.Button1Click(Sender: TObject);
>begin
> Form2 := TForm2.Create(Self);
  //ここで このケースのForm2のサイズ、内部部品の配置など変更
  ......
> Form2.ShowModal; //モーダルなウィンドウを表示。
> Form2.Release; //開放。
>end;
//2番目のケース
>procedure TForm1.Button2Click(Sender: TObject);
>begin
> Form2 := TForm2.Create(Self);
  //ここで このケースのForm2のサイズ、内部部品の配置など変更
  ......
> Form2.ShowModal; //モーダルなウィンドウを表示。
> Form2.Release; //開放。
>end;
..........

なにがなんでも Form2のイベントハンドラ内で変更したいのなら、Form2の動的生成時に その OnShowハンドラを書き換えることに。

  Form2 := TForm2.Create(Self);
  Form2.OnShow := Form2.FormShow001; //ケースごとのOnShowハンドラ
  Form2.ShowModal;

  Form2 := TForm2.Create(Self);
  Form2.OnShow := Form2.FormShow002; //ケースごとのOnShowハンドラ
  Form2.ShowModal;

  Form2 := TForm2.Create(Self);
  Form2.OnShow := Form2.FormShow003; //ケースごとのOnShowハンドラ
  Form2.ShowModal;

//これら↓の中でケースごとの Form2のサイズ、内部部品の配置など変更。
//面倒でも「ケースの数」だけ用意しておくこと。
procedure TForm2.FormShow001(Sender: TObject);
procedure TForm2.FormShow002(Sender: TObject);
procedure TForm2.FormShow003(Sender: TObject);
.......


そんな面倒....イヤ  2007-12-17 08:02:00  No: 28971

Tagを変えれば、複数のハンドラを呼び分けなくても...ネ

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.Tag := 1; //ケースごとのTag
  Form2.ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.Tag := 2; //ケースごとのTag
  Form2.ShowModal;
end;
...............

// Form2ユニット
procedure TForm2.FormShow(Sender: TObject);
begin
 case TForm(Sender).Tag of
   1: begin Width := 200; Height := 200; Button1.Top := 100; end;
   2: begin Width := 300; Height := 300; Button1.Top := 200; end;
   3: begin Width := 400; Height := 400; Button1.Top := 300; end;
   ......
  end;
end;


KHE00221  2007-12-17 18:45:57  No: 28972

その①
--------------------------------------------

Form2 := TForm2.Create(Self);
case Jouken do
begin
  0:Form2.Width := 100;
  1:Form2.Width := 200;
  2:Form2.Width := 300;
end;
Form2.ShowModal;

その②
------------------------------------
type
  TForm2 = class(TForm)
  private
    { Private 宣言 }
  public
    constructor Create(AOwner: TComponent;Jouken:Integer);overload;
  end;

var
  Form2: TForm2;

implementation

constructor TForm2.Create(AOwner: TComponent;Jouken:Integer);
begin
    inherited Create(AOwner);
    case Jouken of
      0:Width := 100;
      1:Width := 200;
      2:Width := 300;
    end;
end;

こうした上で

Form2 := TForm2.Create(Self,Jouken);
Form2.ShowModal;


ofZ  2007-12-17 19:59:12  No: 28973

Position = poDesigned にしておく
・・・のを忘れているとか?


勉強中  2007-12-17 22:49:11  No: 28974

皆様、大変ご親切にお教えいただきありがとうございました。
頂いたアドバイスを一つづつテストをしてみましたが結果的にどれも正常に動くことが確認できました。
最終的にはOnShowイベントにサイズ、位置の指定をすることで進めるようにしました。当初はVBのForm_LoadがFormCreateに相当するものであろうとの誤解した先入観からResizeに書いたりしましたが自信が持てず質問させていただきましたのですがその結果OnShowイベントやPsition=ぽDesignedなどのプロパティーの存在とその内容を知ることができましたので今後大いに役立つ知識が得られました。皆様どうもありがとうございました。

(各所をいじりすぎて正常に動作しなかった時の状態を再現できなくなってしまい当初の不具合の原因は究明できませんでした)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加