Delphi Can';无法在主窗体中完全看到MDI子窗体

Delphi Can';无法在主窗体中完全看到MDI子窗体,delphi,Delphi,有一个MDI应用程序,它包含主表单fMain和子表单fChartAcc和fReal。 主窗体被最大化,主窗体的客户端区域在屏幕大小上受到限制。 打开子窗体时,在主窗体的客户端区域中,我看不到子窗体的底部,并在子窗体上显示水平滚动条。我希望在主窗体的客户端区域中完全粘贴子窗体,以屏幕大小,并相应地以主窗体大小粘贴子窗体,而无需在水平滚动条中粘贴 主窗体:窗体样式:MDIForm 儿童表格: Formstyle:MDIChild 对齐-alClient或alCustom Position已尝试

有一个MDI应用程序,它包含主表单fMain和子表单fChartAcc和fReal。 主窗体被最大化,主窗体的客户端区域在屏幕大小上受到限制。 打开子窗体时,在主窗体的客户端区域中,我看不到子窗体的底部,并在子窗体上显示水平滚动条。我希望在主窗体的客户端区域中完全粘贴子窗体,以屏幕大小,并相应地以主窗体大小粘贴子窗体,而无需在水平滚动条中粘贴

主窗体:窗体样式:MDIForm 儿童表格:
Formstyle:MDIChild 对齐-alClient或alCustom Position已尝试poDefaultPosOnly、poDefault、poDesigned
自动调整大小:false 尝试在OnCreate、OnShow和OnResize过程中设置冻结表单的大小,但未成功

Main form: Formstyle:MDIForm 
Childred forms:  
  Formstyle:MDIChild 
  Align- alClient or alCustom 
  Position-tried poDefaultPosOnly, poDefault, poDesigned  
  autoSize:false
  tried settings of size of chilled forms place in procedures OnCreate, 
    OnShow, OnResize but no success.
单位Umain

    procedure TFmain.MDIChildCreated(const childHandle : THandle);
    begin
      mdiChildrenTabs.Tabs.AddObject(TForm(FindControl(childHandle)).Caption, TObject(childHandle));
      mdiChildrenTabs.TabIndex := -1 + mdiChildrenTabs.Tabs.Count;
    end;

    procedure TFmain.MDIChildDestroyed(const childHandle : THandle);
    var
      idx: Integer;
    begin
      idx := mdiChildrenTabs.Tabs.IndexOfObject(TObject(childHandle));
      mdiChildrenTabs.Tabs.Delete(idx);
    end;



    procedure TFmain.NChartAccClick(Sender: TObject);
    begin
      application.CreateForm(TfChartAcc, fChartAcc);
     fChartAcc.Show;
    end;

    procedure TFmain.realisatia1Click(Sender: TObject);
    begin
      application.CreateForm(TFgas, Fgas);
      Fgas.Show;
    end;

    end.
    procedure TfChartAcc.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     action:=caFree;
    end;


    procedure TfChartAcc.FormCreate(Sender: TObject);
    begin
     Left:=0;
     Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
     Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
     Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);

      FMain.MDIChildCreated(self.Handle);
    end;


    procedure TfChartAcc.FormDestroy(Sender: TObject);
    begin
     FMain.MDIChildDestroyed(self.Handle);
    end;

    procedure TfChartAcc.FormResize(Sender: TObject);
    begin
     {
     Left:=0;
     Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
     Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
     Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);
     }
    end;





    procedure TfChartAcc.FormShow(Sender: TObject);
    begin
     Left:=0;
     Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
     Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
     Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);
    end;

    end.
单位UChartAcc

    procedure TFmain.MDIChildCreated(const childHandle : THandle);
    begin
      mdiChildrenTabs.Tabs.AddObject(TForm(FindControl(childHandle)).Caption, TObject(childHandle));
      mdiChildrenTabs.TabIndex := -1 + mdiChildrenTabs.Tabs.Count;
    end;

    procedure TFmain.MDIChildDestroyed(const childHandle : THandle);
    var
      idx: Integer;
    begin
      idx := mdiChildrenTabs.Tabs.IndexOfObject(TObject(childHandle));
      mdiChildrenTabs.Tabs.Delete(idx);
    end;



    procedure TFmain.NChartAccClick(Sender: TObject);
    begin
      application.CreateForm(TfChartAcc, fChartAcc);
     fChartAcc.Show;
    end;

    procedure TFmain.realisatia1Click(Sender: TObject);
    begin
      application.CreateForm(TFgas, Fgas);
      Fgas.Show;
    end;

    end.
    procedure TfChartAcc.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     action:=caFree;
    end;


    procedure TfChartAcc.FormCreate(Sender: TObject);
    begin
     Left:=0;
     Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
     Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
     Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);

      FMain.MDIChildCreated(self.Handle);
    end;


    procedure TfChartAcc.FormDestroy(Sender: TObject);
    begin
     FMain.MDIChildDestroyed(self.Handle);
    end;

    procedure TfChartAcc.FormResize(Sender: TObject);
    begin
     {
     Left:=0;
     Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
     Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
     Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);
     }
    end;





    procedure TfChartAcc.FormShow(Sender: TObject);
    begin
     Left:=0;
     Top:=Fmain.Toolbar.Height+Fmain.MDIChildrentabs.height;
     Height:=Fmain.ClientHeight-Fmain.Toolbar.Height-Fmain.MDIChildrentabs.height-Fmain.StatusBar.Height-2*GetSystemMetrics(SM_CXEDGE);
     Width:=Fmain.ClientWidth- 2*GetSystemMetrics(SM_CXEDGE);
    end;

    end.

要获取
MDI
主窗体的当前
ClientRect
,您可以使用
WinApi.Windows.GetClientRect()
函数(适用于您的
uChartAcc
单元):

FChartAcc
表格中添加新程序,例如MyAdjustSize。我更改了名称,因为
AdjustSize()
TWinControl
的虚拟方法:

ClientHandle
引用的窗口已经排除了与表单侧面对齐的菜单栏、工具栏等,因此无需进一步计算

用调用
MyAdjustSize
替换先前从
TFChartAcc.FormCreate
中建议的代码:

procedure TFChartAcc.FormCreate(Sender: TObject);
begin
  MyAdjustSize;

  FMain.MDIChildCreated(self.Handle);
end;
然后在主窗体中为
OnResize
事件添加一个事件处理程序,如下所示。其目的是调用
MyAdjustSize
过程,用于所有当前存在的子表单:

procedure TFMain.FormResize(Sender: TObject);
var
  ix: integer;
  ob: TWinControl;
begin
  for ix := 0 to MDIChildrenTabs.Tabs.Count-1 do
  begin
      ob := FindControl(THandle(MDIChildrenTabs.Tabs.Objects[ix]));
      if ob is TFChartAcc then
        TFChartAcc(ob).MyAdjustSize;
  end;
end;
因为所有子窗口的大小都已经正确,所以在选择另一个子窗体时,我们不需要调用
MyAdjust

procedure TFMain.mdiChildrenTabsClick(Sender: TObject);
var
  ix: integer;
  ob: TWinControl;
begin
  ix := MDIChildrenTabs.TabIndex;
  if ix > -1 then
  begin
    ob := FindControl(THandle(MDIChildrenTabs.Tabs.Objects[ix]));
    ob.BringToFront;
  end;
end;

汤姆·布伦伯格,我也是。DDBMemos和DBEdit位于chiled表单的底部,不会出现在主表单的客户端区域。您问(表达了一个愿望):我希望子表单的大小等于主表单的客户端区域大小,而不是更多。我不知道为什么您现在开始谈论
DBMemo
DBEdit
组件。我已经告诉过您如何整理
FChartAcc
表单大小。如果您还有其他问题,请发布新问题。Tom Brunberg在子表单上从上到下依次放置:Panel1、dbgrid、dbedit和dbmemo。在主窗体的客户区中,我看到了面板和dbgrid的一部分。dbedit和dbmemo不会出现在桌面区域。你们可以看到这个项目。Tom Brunberg,主窗体的窗口状态设置为“wsMaximized”。Tom Brunberg,这一切都非常出色。谢谢你支持我D:D:DTom布伦伯格,我编辑添加问题的截图。您写道:“您是否考虑过如果用户的屏幕大小不同会发生什么情况?”。是的,我想要这样的解决方案,当屏幕大小改变时,可以调整子窗体的大小。汤姆·布伦伯格,非常感谢您的帮助。1) 在编译(F9)时,它以最大大小在整个桌面上创建。在那之后,为了美观,我把主窗体缩小了。然后我创建子窗体。2) 我在OnCreate of child表单(fChartAcc)中插入了您的代码,但没有任何更改。Tom Brunberg,我的左、上、高和下设置得到相同的结果:高881,宽1276。BoundsRect属性获取相同的值(0,01276881)。有什么区别。