我有一个应用程序,我有一个MDI窗体作为主窗体和几个MDI子窗体打开应该为 我也有一些没有MDI子窗体,我希望能够只显示在MDI区域内。我可以获得非MDI表格作为MDI孩子吗?
我已经做了一个从Vcl.Forms继承的单元,并具有以下代码,使我可以控制窗体,如果我试图移动他们 但我不能让它像这样的函数工作时窗体我首先展示。当我尝试移动它,它跳到正确到位
procedure TForm.WMMoving(var aMessage: TWMMoving);
var
FormSquare: ^TRect;
WorkSquare: TRect;
begin
WorkSquare := GetWorkSquare;
FormSquare := Pointer(aMessage.DragRect);
if FormSquare^.Left < WorkSquare.Left then
begin
FormSquare^.Right := FormSquare^.Right - (FormSquare^.Left - WorkSquare.Left);
FormSquare^.Left := WorkSquare.Left;
end
else if FormSquare^.Right > WorkSquare.Right then
begin
FormSquare^.Left := FormSquare^.Left - (FormSquare^.Right - WorkSquare.Right);
FormSquare^.Right := WorkSquare.Right;
end;
if FormSquare^.Top < WorkSquare.Top then
begin
FormSquare^.Bottom := FormSquare^.Bottom - (FormSquare^.Top - WorkSquare.Top);
FormSquare^.Top := WorkSquare.Top;
end
else if FormSquare^.Bottom > WorkSquare.Bottom then
begin
FormSquare^.Top := FormSquare^.Top - (FormSquare^.Bottom - WorkSquare.Bottom);
FormSquare^.Bottom := WorkSquare.Bottom;
end;
end;
的GetWorkSquare是获取无论是MDI形式或桌面工作区的功能。 MinTop是我添加的一个值,可以让表单在我经常使用的功能区菜单下跳转。
function GetWorkSquare: TRect;
var
ClientRect: TRect;
begin
if Assigned(Application.MainForm) then
begin
if Application.MainForm.FormStyle = fsMDIForm then
begin
Winapi.Windows.GetWindowRect(Application.MainForm.ClientHandle, ClientRect);
if ClientRect.Top < MinTop then
ClientRect.Top := MinTop;
end
else
SystemParametersInfo(SPI_GETWORKAREA, 0, @ClientRect, 0);
end;
ClientRect.Top := ClientRect.Top + 5;
ClientRect.Left := ClientRect.Left + 5;
ClientRect.Right := ClientRect.Right - 5;
ClientRect.Bottom := ClientRect.Bottom - 5;
Result := ClientRect;
end;
澄清:所显示的代码工作已经显示出,如果我尝试将其移动 功能GetWorkSquare返回的形式被获准在移动屏幕上的区域在窗体上 - 醚MDI内容器或如果没有MDI的整个屏幕 我需要的是,当表格打开时,必须与在GetWorkSquare返回
正如我可以听到你说的是,我需要的是让我的开放功能检查主窗体是否为MDI容器,然后打开窗体不同 我有一个窗体,我打开它,如
function ShowUsers: boolean;
begin
with TfrmUsers.Create(nil) do
try
Result := ShowModal = mrOK;
finally
Free;
end;
end;
对代码更改有什么建议可以帮助我实现这一点?
你为什么不让这些其他形式为MDI儿童? –
主要是因为我在其他没有MDI主窗体的应用程序中使用它们,也是因为它们中的很多显示为模态窗体,因为我需要一个返回值,并且这无法用MDI子窗体来完成 – OZ8HP