以前複数の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のサイズ設定をどの場所、どのタイミングで行うのか教えてください。
フォームやコンポーネントのサイズはFormCreate時に設定して変更されると思いますが?
FormShowイベントに書いたらどうでしょうか?
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);
.......
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;
その①
--------------------------------------------
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;
Position = poDesigned にしておく
・・・のを忘れているとか?
皆様、大変ご親切にお教えいただきありがとうございました。
頂いたアドバイスを一つづつテストをしてみましたが結果的にどれも正常に動くことが確認できました。
最終的にはOnShowイベントにサイズ、位置の指定をすることで進めるようにしました。当初はVBのForm_LoadがFormCreateに相当するものであろうとの誤解した先入観からResizeに書いたりしましたが自信が持てず質問させていただきましたのですがその結果OnShowイベントやPsition=ぽDesignedなどのプロパティーの存在とその内容を知ることができましたので今後大いに役立つ知識が得られました。皆様どうもありがとうございました。
(各所をいじりすぎて正常に動作しなかった時の状態を再現できなくなってしまい当初の不具合の原因は究明できませんでした)
ツイート | ![]() |