Delphi 10.3多种MDI表单

问题描述

在这里得到了两个都设置为fsMDIForm的窗体。还有两个子窗体fsMDIChild。

当我运行应用程序时,看起来好像正确创建了两个父窗体,因为我可以看到子窗体将出现的空间。

但是由于某种原因,从子MID主窗体创建的第二个MDI窗体没有显示,而是在主MDI窗体上创建了它们。

这是第二个MDI表单的创建方式

procedure TMain.menChefReportClick(Sender: TObject);
begin
  Timer1.Enabled:=false;
  CloseAllMDIChildren;

  Application.CreateForm(TChefReport,ChefReport);
  ChefReport.PopupParent:=Main;
  ChefReport.ShowModal;
  ChefReport.Free;
  ChefReport:=nil;

  OpenAllMDIChildren;
  Timer1.Enabled:=true;
end;

这将关闭所有主窗体的MDI子级,因为我显示的是实时数据,只要我在第二个MDI窗体中就不需要。

在第二个MDI表单上,我试图创建像这样的子级:

procedure TChefReport.OpenAllMDIChildren;
var AQuery : TADOQuery;
    Y : integer;
begin
  AQuery := TADOQuery.Create(nil);
  try
    AQuery.Connection:=dmConnection.XLR;
    AQuery.LockType:=ltReadOnly;
    AQuery.sql.Clear;
    AQuery.sql.Add('select Line from LINE_SETTINGS order by line');
    AQuery.Open;

    AQuery.disableControls;

    Y:=0;

    while not AQuery.Eof do
    begin
      Application.CreateForm(TChefReportLine,ChefReportLine);

      ChefReportLine.Caption:='Linie Nr. '+AQuery.FieldByName('Line').Asstring;
      ChefReportLine.FLine:=AQuery.FieldByName('Line').AsInteger;

      ChefReportLine.Top:=0;
      ChefReportLine.Left:=0;

      Y:=Y+ChefReportLine.Height;


      AQuery.Next;
    end;

  finally
    AQuery.Free;
  end;
end;

它确实创建了它们。但不幸的是在MDI主表单上。

是否可以以及如何在第二个MDI表单(ChefReport)上创建它们?

谢谢!

更新

解决方在这里Allow multiple MDI Parent Forms on same Application

然后我像这样创建子代:

procedure TChefReport.OpenAllMDIChildren;
var AQuery : TADOQuery;
    Y : integer;

    ChefReportLine : TChefReportLine;
begin
  AQuery := TADOQuery.Create(nil);
  try
    AQuery.Connection:=dmConnection.XLR;
    AQuery.LockType:=ltReadOnly;
    AQuery.sql.Clear;
    AQuery.sql.Add('select Line from LINE_SETTINGS order by line');
    AQuery.Open;

    AQuery.disableControls;

    Y:=0;

    while not AQuery.Eof do
    begin
      ChefReportLine := TChefReportLine.Create(ChefReport);

      ChefReportLine.Caption:='Linie Nr. '+AQuery.FieldByName('Line').Asstring;
      ChefReportLine.FLine:=AQuery.FieldByName('Line').AsInteger;

      ChefReportLine.Top:=Y;
      ChefReportLine.Left:=0;

      Y:=Y+ChefReportLine.Height;


      AQuery.Next;
    end;

  finally
    AQuery.Free;
  end;
end;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)