我有一个主窗体,有多个面板,其中一些是隐藏的。当用户与主窗体交互时,我需要使一些隐藏的面板可见并以模态方式显示它们,这样用户就无法与主窗体的其他部分进行交互,直到它们完成模态面板。
有没有办法以模态方式在表单上显示现有面板?
我希望不循环使用主窗体控件并禁用/隐藏除一个面板之外的所有内容,这是开发人员在其他人提出同样问题时给出的常见答案。
我的目标是以模态方式简单地在主窗体上显示现有面板,而无需操纵主窗体上的其他控件。
答案 0 :(得分:1)
由于TForm
有.ShowModal()
,我们可以轻松创建临时表单,将TPanel
移动到表单,将表单显示为模式,等待用户关闭表单,然后在销毁TPanel
之前将TForm
移回原始父级。
如果您创建一个名为 pnl 的隐藏TPanel
表单以及该面板上名为 btnCloseModalPanel 的按钮,则以下代码显示 pnl 作为模态,直到用户点击按钮。
begin
DisplayModalPanel(pnl);
// do something with 'pnl.data...'
end;
procedure TForm1.DisplayModalPanel(Panel: TPanel);
var
frm: TForm;
old_top, old_left: Integer;
old_parent: TWinControl;
old_visible: Boolean;
begin
frm := TForm.Create(Panel.Parent);
try
frm.BorderStyle := bsNone;
frm.Position := poOwnerFormCenter;
frm.Tag := 12921; // test in close button click, so we don't close the wrong form
// Rememer properties we can change and then restore them
old_top := Panel.Top;
old_left := Panel.Left;
old_parent := Panel.Parent;
old_visible := Panel.Visible;
// Move the panel to the modal form
Panel.Parent := frm;
Panel.Top := 0;
Panel.Left := 0;
Panel.Visible := True;
// Display the modal form
frm.AutoSize := True;
frm.ShowModal;
// Restore everything
Panel.Visible := old_visible;
Panel.Parent := old_Parent;
Panel.Left := old_left;
Panel.Top := old_top;
finally
FreeAndNil(frm);
end;
end;
procedure TForm1.btnCloseModalPanelClick(Sender: TObject);
var
frm: TForm;
begin
if pnl.Parent is TForm then
begin
frm := pnl.Parent as TForm;
if frm.Tag = 12921 then // don't close the wrong form
frm.Close;
end;
end;