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

时间:2011-04-27 14:46:52

标签: delphi design-time

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

7 个答案:

答案 0 :(得分:10)

如果一次只能看到一个面板,那么您可能希望使用TPageControl来组织事物。您可以单击选项卡以选择在设计时处理哪个选项卡,然后在运行时隐藏选项卡,或者始终隐藏选项卡并通过设置the ActivePage property来选择页面。

答案 1 :(得分:4)

使用Structure Pane找到您想要的那个,然后将其放在前面。

Structure pane http://edn.embarcadero.com/article/images/33289/8.png

(但不要遵循Embarcadero上面的示例;为控件提供有意义的名称,以便更容易区分控件。)

答案 2 :(得分:3)

如果面板已堆叠,您可以通过右键单击面板并从上下文菜单中选择Control->Bring to FrontControl->Send to Back来重新排序。

答案 3 :(得分:3)

我在运行时发现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中构建的仔细对齐 (尤其是使用分割器时) 此代码可防止这种情况发生 当面板没有设置斜面并且panelcolor等于它顶部的控件颜色时,它实际上只能在视觉上工作。

答案 4 :(得分:2)

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

(类似于打开结构视图)

答案 5 :(得分:1)

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

对于您的情况,我建议您将每个窗格的重构视为自己的表单或框架。我倾向于使用Forms,而不是框架,其原因众所周知,并在Delphi世界中有详细记载。

在我结构最完善的应用程序中,每个“窗格”(使用TForm实现,而不是TFrame)被分成不同的单元,这解决了您的设计时控制问题,并且结果更加完善整体解决方案。

虽然我认为结构窗格(其他人指出)对你有很大的帮助,当你想要使用那些复杂的表单以至于常规设计器可视化工具开始变得越来越难以使用时,它也是一个当你达到使用表单设计器的“收益递减”这一点时,考虑打破你的形式,这将成为一个超级超级复杂的形式。

答案 6 :(得分:1)

为此目的使用框架要容易得多。我通常在运行时创建它们并根据需要将它们添加到表单中。它还可以使代码更具可读性,因为您可以在不同的帧上使用相同的组件名称(例如ed_Name或l_Welcome)而不会出现名称冲突,而不是使用ed_NameForPanel1,ed_NameForPanel3等。