【问题标题】:Panel's Anchor Property not working as desired面板的锚属性未按预期工作
【发布时间】:2012-11-15 22:49:32
【问题描述】:

我有一个尺寸为 (600 * 400) 的德尔福形式,即宽度 = 600 和高度 = 400。我在其上保留了 3 个尺寸相同的面板,尺寸为 (150 * 300),彼此等距。

现在,我需要在调整表单大小(手动或通过最大化按钮变小或变大)时,面板应随表单调整自身大小。

我为此使用了 anchors 属性。但它没有按预期工作。面板彼此重叠。我很困惑将哪个锚属性设置为 true 或将哪个锚属性设置为 false 来完成此功能。请帮帮我。

【问题讨论】:

  • 你读过anchors documentation吗?锚点可能无法按您的意愿工作,但会按记录工作!
  • 是的,我确实读过。我将面板的 Anchors 属性设置为 [akTop, akBottom, akLeft]。这通过保持左侧相对位置将我的每个面板拉伸到底部和顶部。但是我应该如何让它们也向右伸展,或者我应该为此编写代码?
  • 您还需要 akRight 才能使它们拉伸,但我认为它不会解决重叠问题,因为锚点所做的是将绝对距离固定到表单的一侧。因此,如果左侧面板的右侧与右侧相距 450,它将保持这种状态,而不管右侧面板的左侧与左侧相距 450...

标签: delphi delphi-xe2 panel


【解决方案1】:

我倾向于以另一种方式(无论是对还是错)来攻击这一点,您可以使用“对齐”属性将面板“对齐”到表单的一侧或另一侧。然后,我经常选择一个与“客户端”对齐的主面板,以在调整大小时占用大部分可用空间(因此,一个面板与左侧对齐,另一个与顶部对齐,第三个与客户端对齐。您可以在面板中拥有面板,并且与此一起使用拆分器组件以允许用户根据需要调整大小。这可能不是您想要的结果,但肯定会避免重叠问题,这只是我猜想的地方。

也许您希望事物可以缩放,所以每个面板都保持相同的纵横比?鉴于您标记了 XE2,如果这是一个 FireMonkey 表单,那么我认为缩放表单将是一种选择(见此处:http://edn.embarcadero.com/article/42560

【讨论】:

    【解决方案2】:

    您必须手动定位和调整它们的大小。您可以使用面板所有者的 OnReSize-Method。

    procedure TOwnerForm.OnResize(Sender : TObject);
    begin
      panel1.width := Self.Width div 3;
      panel2.width := Self.width - 2*panel1.Width;
      panel3.width := Self.Width - panel1.Width - panel2.Width;
      panel1.Left := 0;
      panel2.Left := panel1.left + panel1.width;
      panel3.left := panel2.left + panel2.width;
      panel1.top := 0;
      panel2.top := panel1.top;
      panel3.top := panel1.top;
    end;
    

    【讨论】:

    • 感谢您的解决方案。我在想我必须为此编写代码。接受你的回答。
    • 在 VCL 中我更喜欢使用 TGridPanel 而不是在表单调整大小事件中设置大小和位置。
    • 您好,我没有 TGridPanel,所以我仍然会使用上面的手工编码。这也不是什么大问题,但在现代 Delphi 中,我会推荐您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2011-08-28
    相关资源
    最近更新 更多