フォームの表示に関するコーディング

解決


deldel  2006-02-20 19:39:49  No: 20111

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;


ん!?  2006-02-20 21:08:44  No: 20112

こんな感じ?
クラス型が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);


deldel  2006-02-20 22:28:12  No: 20113

早速、ありがとうございます(環境は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して欲しい)にはなりません・・・

どうすればいいのでしょうか?


おのおの型、電柱でご猿  2006-02-20 23:08:39  No: 20114

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;


Custom好みなら  2006-02-20 23:16:27  No: 20115

var
  Form2, Form2_1, Form2_2, Form2_3: TCustomForm;

procedure hogehoge(var FormX: TCustomForm; FormXClass: TFormClass);


deldel  2006-02-21 00:05:08  No: 20116

ありがとうございました。できました。
コードがかなりすっきりしました。


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

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






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