Delphi 如何在设计时处理多个TPanel?

Delphi 如何在设计时处理多个TPanel?,delphi,design-time,Delphi,Design Time,我的主窗体上有几个TPanel,根据用户选择的选项显示/隐藏。问题是,在设计时,我必须不断地移动它们来编辑它们。其他人是否有更简单/更好的方法来处理这种情况?如果面板是堆叠的,您可以通过右键单击其中一个面板,然后从关联菜单中选择Control->Bring to Front或Control->Send to Back对其进行重新排序。使用找到您想要的面板,然后将其放到前面 资料来源: 但不要效法上面Embarcadero的例子;为控件指定有意义的名称,以便更容易区分控件。如果一次只能看到一个面

我的主窗体上有几个TPanel,根据用户选择的选项显示/隐藏。问题是,在设计时,我必须不断地移动它们来编辑它们。其他人是否有更简单/更好的方法来处理这种情况?

如果面板是堆叠的,您可以通过右键单击其中一个面板,然后从关联菜单中选择Control->Bring to Front或Control->Send to Back对其进行重新排序。

使用找到您想要的面板,然后将其放到前面

资料来源:


但不要效法上面Embarcadero的例子;为控件指定有意义的名称,以便更容易区分控件。

如果一次只能看到一个面板,则可能需要使用TPageControl来组织内容。您可以单击选项卡以选择在设计时使用哪个选项卡,然后在运行时隐藏选项卡,或者始终隐藏选项卡并通过设置选择页面。

我还使用了TPageControl,并在设计时保持选项卡可见。这给了我一个设计时的可用性,通过点击我想要的标签。然后在运行时,我隐藏页面选项卡,并使用代码切换页面控件上的活动页面,以切换哪个窗格可见。然而,这导致了一些可怕的巨大和复杂的形式,这反过来又导致了许多问题

对于您的情况,我建议您考虑将每个窗格重构成自己的窗体或框架。我倾向于使用表单,而不是框架,其原因在Delphi世界中是众所周知的,并且有很好的文档记录

在我的结构最完善的应用程序中,每个使用TForm实现的窗格(而不是TFrame)都被划分为不同的单元,这既解决了设计时控制问题,也带来了结构更完善的总体解决方案


虽然我认为其他人指出的结构窗格对你来说是一个很大的帮助,但是当你想使用复杂的普通设计器视觉工具开始使用的形式时,考虑到使用表单设计器的收益递减这一点,考虑打破你的表单也是一个好主意。在一个超级复杂的表单上。

我使用“对象检查器”组合选择框架或面板,然后在主菜单上单击“编辑”->“置于前面”


这类似于打开结构视图

为此,使用框架要容易得多。我通常在运行时创建它们,并根据需要将它们添加到表单中。它还可以使代码更具可读性,因为您可以在不同的框架上使用相同的组件名称,例如ed_Name或l_Welcome,而不必使用ed_NameForPanel1、ed_NameForPanel3等,而不会产生名称冲突。在运行时,我发现在执行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;
简单地隐藏面板可能会破坏您在Designtime中构建的仔细对齐 特别是在使用拆分器时。 这段代码防止这种情况发生。
只有当面板未设置斜面且面板颜色等于其顶部控件的颜色时,它才真正在视觉上起作用。

+1秒。到目前为止,这是一种更好的控制方式。如果您不需要选项卡标题,您可以创建自己的Decentant,或者使用一些已经开发的,并在运行时将Tabheight设置为0。如果我理解正确的话,这样做的缺点是,运行时容器中的空间将比设计时多。因此,如果你有一个固定大小的布局,那么它将不会很好地工作。还是我拿错了棍子的一端?是的,大卫,这肯定是一个副作用。不过,我并不认为这是个问题,因为可调整的表单、锚和对齐总是使它与我所设计的任何形式无关。“我的很多表单都是不可调整大小的表单。@david,您也可以在设计时隐藏选项卡,然后在“活动页面”属性中选择活动页面。+1;我喜欢这种完全重叠控件的方式。您只需选择项目,右键单击并按O+F键即可将控件置于最前面。