【问题标题】:How to keep only single form open in delphi如何在delphi中只打开单个表单
【发布时间】:2012-09-13 16:38:57
【问题描述】:

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

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

【问题讨论】:

  • Form.Parent 相当危险的 hack。也许更好地使用 MDI 并确保它总是最大化? docwiki.embarcadero.com/RADStudio/en/…
  • @Arioch,虽然我看不出将父母身份分配给自己创建的表单有什么危险,但你是对的,看起来 OP 试图以错误的方式制作 MDI 应用程序。跨度>
  • 是的,你是对的。我尝试制作 MDI 应用程序。但我希望子表单只填写主表单的一小部分。因此,我将子窗体设置为无边框,并将子窗体的父窗体设置为主窗体。
  • @TLama QC108580 - 一步错了你就瘫痪了。
  • 那不是 MDI 应用程序。 Windows中的MDI由可见主窗口+不可见主宿主窗口+子窗口组成。我宁愿用标准的 MDI 方式做 MDI。

标签: delphi


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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


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

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

    也许你只需要 TForm.ShowModal ?

    【讨论】:

    • 这是一个痛苦世界的开始。它会按照用户的要求执行,并且会创建一些非常酷的错误。特别是如果应用于现有的代码库,这可能是 OP 正在尝试做的事情,这可能是为了实现一个疯狂的坏 hack 而不是修复错误。但由于我要进入读心术领域,我会避免直接向 OP 提供建议。
    【解决方案3】:

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

    两个音符:

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

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

    【讨论】:

    • 正如我在上面的评论中提到的,我希望子表单只填写主表单的一小部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多