0

我在delphi中有VCL应用程序。一种主要形式和许多子形式。如何确保一次只打开一个表单。换句话说,如果打开一个表单,它将关闭以前的表单。或者,如果用户尝试打开与以前相同的表单,它将什么也不做。在我的主表单中打开表单的代码:

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”设为变量,而不是局部变量,您将获得对当前打开窗体的引用。您可以使用该引用来关闭该表单或检查其类。

两个注意事项:

  • 如果您关闭表单而不打开另一个表单,则必须重置变量。
  • 我想知道你为什么要这样做。让您的用户决定是否要打开多个表单不是更友好吗?

作为替代方案,您可以将子窗体设为模态(使用 ShowModal 而不是 Show),但这会在子窗体打开时阻止对主窗体的访问。

于 2012-09-21T09:10:25.233 回答
1

也许不是相同的场景,但您可以有一个SubscriptionList,其中每个创建的表单在创建时订阅并在销毁时取消订阅。通过这种方式,您可以检查您的窗口是否在列表中,如果它不存在则创建,如果已经存在则将焦点移至表单。

我们使用这种方法打开具有不同数据的相同表单(例如发票)并跟踪它们以不打开相同的发票两次。

例如,如果您正在做一个仪表板并为每条信息使用一个表单,您可以使用订阅列表来跟踪它们,而不是为每个信息设置一个变量。

于 2012-09-21T23:55:55.960 回答
0

拦截“新表单正在激活”事件 - http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TScreen_Events

枚举表单并确保所有其他表单 .Visible 为假 - http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TScreen.CustomForms


或者,如果用户尝试打开与以前相同的表单,它将什么也不做

你什么意思 ?如果其他表单被隐藏并且他不能再看到按钮/菜单来打开其他表单,用户如何做到这一点?

也许您只需要 TForm.ShowModal ?

于 2012-09-21T09:17:20.333 回答