Form1の他にForm2からForm9までありまして、
Form1からForm2・・・を表示するようにしています。
Form2を表示する場合、コードは以下のようにしています。
同様にForm3からForm9までも同じようなコードを
だらだらと書いていますが(Form2の代わりにForm3とか)、
もっとすっきり書く方法はないでしょうか?
if Form2 = nil then begin
Form2 := TForm2.Create(Application);
Form2.Top := Top + Height;
Form2.Left := Left;
Form2.Show;
end else begin
Form2.Close;
FreeAndNil(Form2);
end;
こんな感じ?
クラス型がD4かD5なので、それ以降のバージョンならたぶんOKな気がする
procedure hogehoge(var FormX:TCustomForm;
FormXClass: TCustomFormClass)
begin
if FormX = nil then begin
FormX := FormXClass.Create(Application);
FormX.Top := Top + Height;
FormX.Left := Left;
FormX.Show;
end
else begin
FormX.Close;
FreeAndNil(FormX);
end;
end;
呼び出し
var
Form1: TForm1;
Form2: TForm2;
...
Form9: TForm9;
hogehoge(Form1, TForm1);
hogehoge(Form2, TForm2);
...
hogehoge(Form9, TForm9);
早速、ありがとうございます(環境はD5です)。
以下のようにやってみましたが、Form2, のところで
「変数実パラメータと変数仮パラメータとは同一の型でなければなりません 」
というエラーが出ます。
procedure TForm1.Button1Click(Sender: TObject);
var
Form2: TForm2;
begin
hogehoge(Form2, TForm2);
end;
そこで、
procedure TForm1.hogehoge(var FormX: TCustomForm; 〜
の var を削除したところ、エラーは出なくなりました。
しかし、自動作成の対象から外しているにもかかわらず、
しょっぱなから nil と判断されず、else begin 以下が実行され、
何故か Button1 が消えてしまいます(訳が分かりません???)。
ならばと思い、
var
Form2: TForm2;
を削除してみたところ、
1回目のクリックではForm2が無事に表示されました。
しかし、2回目のクリックでも2個目のForm2が表示され、
期待した通り(Closeして欲しい)にはなりません・・・
どうすればいいのでしょうか?
var
Form2, Form2_1, Form2_2, Form2_3: TForm;
procedure hogehoge(var FormX: TForm; FormXClass: TFormClass);
begin
if FormX = nil then begin
FormX := FormXClass.Create(Application);
FormX.Top := Form1.Top + Form1.Height;
FormX.Left := Form1.Left;
FormX.Caption := FormX.Name;
FormX.Show;
end else begin
FormX.Close;
FreeAndNil(FormX);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
hogehoge(Form2, TForm2);
hogehoge(Form2_1, TForm2);
hogehoge(Form2_2, TForm2);
hogehoge(Form2_3, TForm2);
end;
var
Form2, Form2_1, Form2_2, Form2_3: TCustomForm;
procedure hogehoge(var FormX: TCustomForm; FormXClass: TFormClass);
ありがとうございました。できました。
コードがかなりすっきりしました。
ツイート | ![]() |