我的主窗体上有几个TPanel,根据用户选择的选项显示/隐藏。问题在于,在设计时,我必须不断地移动它们才能对它们进行编辑。有没有更简单/更好的方法来处理这种情况?
我的主窗体上有几个TPanel,根据用户选择的选项显示/隐藏。问题在于,在设计时,我必须不断地移动它们才能对它们进行编辑。有没有更简单/更好的方法来处理这种情况?
TPageControl
来组织内容。在设计时,您可以单击选项卡来选择要处理的页面,然后在运行时隐藏选项卡,或者始终隐藏选项卡并通过设置 ActivePage
属性 来选择页面。在运行时将Panel1.Visible设置为false时,我发现一个注意事项是它会影响布局。
我找到的解决方案是:
//Design time
//-----------
Panel1.BevelOuter:= bvNone; //Make the panel look flat.
//Run time when hiding the panel
//------------------------------
procedure HidePanel(APanel: TPanel);
var
H,W: integer;
begin
case APanel.Align of
alTop, alBottom: begin
APanel.Tag:= Max(APanel.Tag, APanel.Height);
APanel.Height:= 1;
end; {alTop, alBottom:}
alLeft, alRight: begin
APanel.Tag:= Max(APanel.Tag, APanel.Width);
Panel1.Width:= 1;
end; {alLeft, alRight:}
alNone: begin
H:= Max(APanel.Tag and $FFFF, APanel.Height);
W:= Max((APanel.Tag shl 16) and $FFFF0000, APanel.Width shl 16);
APanel.Tag:= (H or W);
APanel.Height:= 1;
APanel.Width:= 1;
end; {alNone}
//alClient: do nothing
end;
end;
//Run time when restoring the panel
//---------------------------------
procedure UnhidePanel(APanel: TPanel);
var
H,W: integer;
begin
case APanel.Align of
alTop, alBottom: begin
APanel.Height:= APanel.Tag;
APanel.Tag:= 0;
end; {alTop, alBottom:}
alLeft, alRight: begin
APanel.Width:= APanel.Tag;
APanel.Tag:= 0;
end; {alLeft, alRight:}
alNone: begin
H:= APanel.Tag and $FFFF;
W:= APanel.Tag shr 16;
APanel.Height:= H;
APanel.Width:= W;
APanel.Tag:= 0;
end; {alNone}
//alClient: do nothing
end; {case}
end;
简单地隐藏面板可能会破坏您在设计时构建的精细对齐方式(特别是在使用分隔器时)。这段代码可以防止这种情况发生。当面板没有设置斜面和面板颜色等于其所在控件的颜色时,它在视觉上才真正起作用。
如果面板被堆叠,您可以右键单击其中一个并从上下文菜单中选择控制->置于顶部
或控制->置于底部
来重新排序它们。
我使用对象检查器组合框选择框架或面板,然后在主菜单中点击"编辑" --> "置于顶部"
(这类似于打开结构视图)
我认为结构面板(如其他人所指出)对你来说是一个很好的帮助。但是,当你想处理复杂度超过常规设计视觉工具的表单时,考虑将表单拆分,并在使用表单设计器时达到“收益递减”点时,这也是一个不错的想法。因为表单变得越来越复杂。
使用框架实现这个目的要容易得多。我通常在运行时创建它们,并根据需要将它们添加到表单中。这也使代码更易读,因为您可以在不同的框架上使用相同的组件名称(例如 ed_Name 或 l_Welcome),而无需使用诸如 ed_NameForPanel1、ed_NameForPanel3 等名称来避免名称冲突。