我在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;
儿童表格在近距离活动时自我释放。
答案 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?