【问题标题】:How can I find all subforms of main TForm Application object?如何找到主 TForm Application 对象的所有子表单?
【发布时间】:2014-02-19 14:44:36
【问题描述】:

我正在开发适用于 Windows 和 OSX 的应用程序,我想在应用程序中找到主 TForm 对象的所有子表单。

有没有办法在 Delphi XE5 中做到这一点?简单地说,我想迭代应用程序的所有组件。

移至cmets的问题:

我正在寻找Application 中的每个TForm 后代。

【问题讨论】:

  • 你能定义“应用程序中主 TForm 对象的子表单”是什么意思吗?
  • 你能澄清一下这个问题吗?你想要你所在应用程序的主窗体的子窗体吗?还是外部应用程序?
  • 是的,应用程序主窗体的子窗体
  • 您认为什么是“子表单”?将 MainForm 设置为其 Owner 和/或 Parent 的 TForm?请更具体。
  • -1 因为您不清楚自己实际要问什么,并且在被问到时拒绝澄清您的问题。

标签: delphi firemonkey delphi-xe5


【解决方案1】:

您是指通过应用程序的主表单以这种方式创建的任何表单吗?

procedure TMyMainForm.CreateSubForm;
begin
   TMySubForm.Create(Self);
end;

试试这个

procedure FindMainFormSubForms(list : TList<TForm>);
var
    i : integer;
    mainForm : TForm;
begin
    mainForm := Application.MainForm;
    for i := 0 to mainForm.ComponentCount - 1 do
    begin
        if mainForm.Components[i] is TForm then
            list.Add(TForm(mainForm.Components[i]));
    end;
end;

【讨论】:

  • 如果MainForm是子TForm对象的Parent,可以使用类似的方法,通过迭代Controls[]列表而不是Components[]列表。
  • 那么在运行时创建并分配给项目主 Unit.pas 文件中的全局变量的表单呢?它们也在 Components[] 列表中吗?
  • 如果表单创建时没有所有者怎么办?我习惯性地这样做。
  • 如果它没有主窗体作为其所有者或父窗体,我不确定您是否可以将其称为主窗体的“子窗体”。那时,您必须在主窗体上维护自己的列表,在这种情况下,您已经有了对它们的引用,并且没有要回答的问题。我的回答确实说明了它的假设,这是一个措辞很糟糕的问题
  • @JTolley 从 cmets 到问题:“在 Application 中查找每个 TForm 后代”
【解决方案2】:

在 FMX 中,您使用 TScreen.Forms[] 属性枚举应用程序中的所有表单对象:

for i := 0 to Screen.FormCount-1 do
  DoSomethingWith(Screen.Forms[i]);

【讨论】:

    【解决方案3】:

    整个应用程序的所有形式都驻留在Screen.CustomForms。您可以使用Screen.CustomFormCount 对它们进行迭代。

    过滤器选项:

    • 如果您只想要主表单拥有的表单,请检查Screen.CustomForms[I].Owner = Application.MainForm;
    • 如果您只想要主窗体作为父窗体,请检查Screen.CustomForms[I].Parent = Application.MainForm;

    MDI:

    如果您的主窗体是 MDI 窗体,并且您想知道它的所有 MDI 子窗体,那么所有子窗体都位于 (Application.)MainForm.MDIChildren 中,您可以使用 (Application.)MainForm.MDIChildCount 对其进行迭代。

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 2016-07-25
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多