0

私はデルファイにVCLアプリケーションを持っています。1つのメインフォームと多くの子フォーム。一度に1つのフォームのみが開かれるようにする方法。つまり、フォームを開くと、前のフォームが閉じます。または、ユーザーが以前と同じフォームを開こうとしても、何もしません。メインフォームでフォームを開くためのコード:

procedure TFMainForm.OpenForm(const classname: string);
var
  c: TPersistentClass;
  f: TForm;
begin
    c := GetClass(classname);
    if c <> nil then
    begin
      f := TForm(TControlClass(c).Create(nil));
      f.Parent := Self;
      f.Show;
    end;
end;

子フォームは、クローズイベントで自己解放されます。

4

3 に答える 3

2

'f' をローカル変数ではなくメインフォームの変数にすると、現在開いているフォームへの参照が作成されます。その参照を使用して、そのフォームを閉じたり、そのクラスを確認したりできます。

2 つの注意事項:

  • 別のフォームを開かずにフォームを閉じた場合は、変数をリセットする必要があります。
  • なぜあなたはこれをしたいのだろうか。ユーザーが複数のフォームを開くかどうかを決定できるようにした方が使いやすいと思いませんか?

別の方法として、子フォームをモーダルにする (Show の代わりに ShowModal を使用する) こともできますが、子フォームが開いているときにメイン フォームへのアクセスがブロックされます。

于 2012-09-21T09:10:25.233 に答える
1

同じシナリオではないかもしれませんが、SubscriptionListを作成できます。この場合、作成されたすべてのフォームは、作成時にサブスクライブされ、破棄時にサブスクライブ解除されます。このようにして、ウィンドウがリストにあるかどうかを確認できます。ウィンドウが存在しない場合は作成し、すでに存在する場合はフォーカスをフォームに移動します。

このアプローチを使用して、異なるデータ(請求書など)で同じフォームを開き、同じ請求書を2回開かないように追跡します。

たとえばダッシュボードを実行していて、各情報のフォームを使用している場合は、各情報に変数を設定する代わりに、サブスクリプションリストを使用してそれらすべてを追跡できます。

于 2012-09-21T23:55:55.960 に答える
0

「新しいフォームがアクティブになっています」イベントを傍受 - http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TScreen_Events

フォームを列挙し、他のすべてのフォームを確認します。Visible が false - http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TScreen.CustomForms


または、ユーザーが以前と同じフォームを開こうとしても、何もしません

どう言う意味ですか ?また、他のフォームが非表示になっていて、他のフォームを開くためのボタン/メニューが表示されない場合、ユーザーはどのようにそれを行うことができますか?

必要なのは TForm.ShowModal だけでしょうか?

于 2012-09-21T09:17:20.333 に答える