如何在delphi中只打开一个表单

如何在delphi中只打开一个表单,delphi,Delphi,我在delphi中有VCL应用程序。一个主窗体和多个子窗体。 如何确保一次只打开一个表单。换句话说,如果打开一个表单,它将关闭上一个表单。或者,若用户试图打开和上一个相同的表单,它将什么也不做。 在我的主窗体中打开窗体的代码: procedure TFMainForm.OpenForm(const classname: string); var c: TPersistentClass; f: TForm; begin c := GetClass(classname); i

我在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;
过程TFMainForm.OpenForm(const classname:string);
变量
c:TPC类;
f:TForm;
开始
c:=GetClass(类名);
如果c为零,则
开始
f:=TForm(TControlClass(c).Create(nil));
f、 父母:=自我;
f、 展示;
结束;
结束;

子窗体在关闭事件时自动释放。

如果在主窗体中将“f”设置为变量,而不是局部变量,则将有对当前打开窗体的引用。可以使用该引用关闭该窗体或检查其类

注二:

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

或者,您可以将子窗体设置为模态(使用showmodel而不是Show),但这样会在子窗体打开时阻止对主窗体的访问。

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

注二:

  • 如果关闭表单而不打开另一个表单,则必须重置变量
  • 我想知道你为什么要这么做。让用户决定是否要打开多个表单不是更友好吗
或者,您可以将子窗体设置为模态(使用showmodel而不是Show),但这样会在子窗体打开时阻止对主窗体的访问。

截获“新窗体正在激活”事件-

列举表格,并确保所有其他表格。可见为假-


或者,若用户试图打开和上一个相同的表单,它将什么也不做

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

也许您只需要TForm.showmodel?

拦截“新表单正在激活”事件-

列举表格,并确保所有其他表格。可见为假-


或者,若用户试图打开和上一个相同的表单,它将什么也不做

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


也许您所需要的只是TForm.showmodel?

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

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


例如,如果您正在执行一项任务,并为每一条信息使用一个表单,那么您可以使用订阅列表来跟踪它们,而不是为每一条信息使用一个变量。

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

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


例如,如果您正在执行一个操作,并对每一条信息使用一个表单,那么您可以使用订阅列表来跟踪它们,而不是为每一条信息使用一个变量。

使用form.Parent相当危险。也许最好使用MDI并确保它总是最大化@Arioch,我看不出为自己创建的表单指定父级有什么危险,但你是对的,OP似乎试图以错误的方式创建MDI应用程序。是的,你是对的。我尝试制作MDI应用程序。但我希望子表单只填写主表单的一小部分。因此,我将子窗体设置为无边界,并将子窗体的父窗体设置为主窗体。@TLama QC108580-一个错误的步骤,您就瘫痪了。这不是MDI应用程序。windows中的MDI由可见主窗口+不可见主主窗口+子窗口组成。我宁愿用标准的MDI方式进行MDI。使用Form.Parent进行相当危险的黑客攻击。也许最好使用MDI并确保它总是最大化@Arioch,我看不出为自己创建的表单指定父级有什么危险,但你是对的,OP似乎试图以错误的方式创建MDI应用程序。是的,你是对的。我尝试制作MDI应用程序。但我希望子表单只填写主表单的一小部分。因此,我将子窗体设置为无边界,并将子窗体的父窗体设置为主窗体。@TLama QC108580-一个错误的步骤,您就瘫痪了。这不是MDI应用程序。windows中的MDI由可见主窗口+不可见主主窗口+子窗口组成。我宁愿用标准的MDI方式进行MDI。正如我在上面的评论中提到的,我希望子表单只填充主表单的一小部分。正如我在上面的评论中提到的,我希望子表单只填充主表单的一小部分。这是痛苦世界的开始。它会按照用户的要求做,并且会产生一些非常酷的bug。特别是如果应用到现有的代码库,这可能是OP试图做的,这可能是实现一个疯狂的坏黑客,而不是修复一个bug。但由于我正进入读心领域,我将避免直接为OP提供建议。这是痛苦世界的开始。它会按照用户的要求做,并且会产生一些非常酷的bug。Espe