将TPanel显示为模态

时间:2016-06-03 00:05:02

标签: delphi modal-dialog panel

我有一个主窗体,有多个面板,其中一些是隐藏的。当用户与主窗体交互时,我需要使一些隐藏的面板可见并以模态方式显示它们,这样用户就无法与主窗体的其他部分进行交互,直到它们完成模态面板

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

我希望循环使用主窗体控件并禁用/隐藏除一个面板之外的所有内容,这是开发人员在其他人提出同样问题时给出的常见答案。

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

1 个答案:

答案 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;