首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将TPanel显示为模态

将TPanel显示为模态
EN

Stack Overflow用户
提问于 2016-06-03 00:05:02
回答 1查看 1.8K关注 0票数 0

我有一个主表单,有多个面板,其中一些是隐藏的。由于用户与主窗体交互,我需要使一些隐藏面板可见,并以模态方式显示它们,以便用户在与模式面板完成之前不能与主窗体的其他部分交互。

是否有一种方式以模态方式在窗体上显示现有面板?

我更喜欢而不是循环在主要窗体控件中,禁用/隐藏所有东西,除了一个面板,这是开发人员在其他人提出相同问题时给出的常见答案。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-03 00:05:02

因为TForm.ShowModal(),所以我们可以很容易地创建临时表单,将TPanel移动到表单,将表单显示为模式,等待用户取消表单,然后在销毁TForm之前将TPanel移回原来的父级。

如果您创建一个具有名为pnl的隐藏TPanel的表单,并在该面板上创建一个名为btnCloseModalPanel的按钮,那么下面的代码将显示pnl作为模式,直到用户单击该按钮。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37604003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档