我有一个主表单,有多个面板,其中一些是隐藏的。由于用户与主窗体交互,我需要使一些隐藏面板可见,并以模态方式显示它们,以便用户在与模式面板完成之前不能与主窗体的其他部分交互。
是否有一种方式以模态方式在窗体上显示现有面板?
我更喜欢而不是循环在主要窗体控件中,禁用/隐藏所有东西,除了一个面板,这是开发人员在其他人提出相同问题时给出的常见答案。
我的目标是简单地以模态的方式在主窗体上显示现有面板,而不必操纵主窗体上的其他控件。
发布于 2016-06-03 00:05:02
因为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;https://stackoverflow.com/questions/37604003
复制相似问题