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