如何在delphi中只保留单个表单

时间:2012-09-21 09:05:16

标签: delphi

我在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;

儿童表格在近距离活动时自我释放。

3 个答案:

答案 0 :(得分:2)

如果在主窗体中将'f'变为变量,而不是局部变量,则将引用当前打开的窗体。您可以使用该引用关闭该表单或检查其类。

两个注释:

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

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

答案 1 :(得分:1)

可能不是相同的场景,但您可以拥有 SubscriptionList ,其中每个创建的表单都是在创建时订阅并在销毁时取消订阅。这样你可以检查你的窗口是否在列表中,如果它不存在则创建,如果已存在则将焦点移动到表单中。

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

如果您正在做一个Dashboard并使用每个信息的表单,您可以使用订阅列表跟踪所有信息,而不是每个信息都有一个变量。

答案 2 :(得分: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?