将 TPanel 显示为模态

Display TPanel as Modal

我有一个主窗体,有多个面板,其中一些是隐藏的。当用户与主窗体交互时,我需要使一些隐藏的面板可见并以模式方式显示它们,以便用户在完成 [=18= 之前无法与主窗体的其他部分交互]模态面板.

有没有办法以模态方式在表单上显示现有面板?

我宁愿不要循环浏览主要表单控件和disable/hide除了一个面板之外的所有内容,这是开发人员在其他人有时给出的常见答案问了同样的问题。

我的目标是简单地以模态方式在主窗体上显示现有面板,而无需操作主窗体上的其他控件。

由于TForm.ShowModal(),我们可以轻松创建一个临时表单,将TPanel移动到表单中,将表单显示为模态,等待用户关闭表单,然后在销毁 TForm.

之前将 TPanel 移回其原始父级

如果您创建一个带有名为 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;