【问题标题】:How to create splitter containing components?如何创建包含组件的拆分器?
【发布时间】:2011-05-24 10:25:57
【问题描述】:

如果可能的话,我想在两个可调整大小的面板之间或直接在拆分器上放置一些按钮。我如何实现它们将与分离器一起移动;如何锚定它们?

编辑:
也许是我忘记提及的最重要的事情。该拆分器必须与屏幕截图一样宽,并且按钮应位于其上;所以这些按钮现在实际上是“浮动在拆分器上”。

非常感谢

【问题讨论】:

  • 由于TSplitter 不是窗口控件,因此您不能在其上放置控件。我会完全放弃TSplitter,并使用TPanel 并编写一些使其表现得像分离器的逻辑。这可能相当容易,但由于我现在没有可用的 Deplhi IDE/RTL/编译器,我无法尝试(至少现在不是)。
  • @Andreas 这不是你的做法。您需要同时使用拆分器和面板。这就是拆分器的工作原理。
  • @Andreas 另一方面,你似乎已经理解了这个问题,而我没有。我已经阅读并重新阅读它,但我无法弄清楚你是如何做到的,但你似乎已经推断出 Q 的预期含义!
  • 你可以设置这个分割器的宽度,设置beveled:= true这样它不会太小打不着,而且会在视觉上突出。
  • @Johan - 这就是我放一个组件名称的原因;恕我直言,3D 面板之间的 3D 分离器可能比实际不那么明显

标签: delphi delphi-2009 splitter


【解决方案1】:

你不能自动完成。
您可以在拆分器的 OnMoved 事件中手动更改 Buttons 的 Left 属性。
没有一个好的解决方案(拖动时刻的可视化效果不好),但它可以得到你需要的结果。你可以解决这个问题,试试 ResizeStyle=rsUpdate;这样,当您拖动拆分器时,按钮也会移动。

procedure TForm1.Splitter1Moved(Sender: TObject);
begin
  SpeedButton1.Left := Splitter1.Left + 40;
  SpeedButton2.Left := Splitter1.Left + 40;
  SpeedButton3.Left := Splitter1.Left + 40;
  SpeedButton4.Left := Splitter1.Left + 40;
end;

Here you can view 结果。

问候

【讨论】:

  • 这就是我的想法,而不是尝试编写自己的控件。这是一个有点肮脏的解决方案,但它正在工作;在我问这里之前,我已经尝试过同样的方法。所以+1(明天)阅读我的想法:)
【解决方案2】:

这是我的应用程序的屏幕截图:

此表单在左侧窗格中的树视图右侧有一个 TSplitter。拆分器右侧是一个 TPanel,其中包含按钮。

这是在设计时,您可以看到用虚线绘制的拆分器:

诀窍在于拆分器不包含控件——因为您使用面板。

因此,使用您的命名,您需要将 Splitter1 替换为包含按钮的面板,并在 Panel1 和新面板之间添加一个拆分器。左右面板和分离器对齐alLeft,右侧手柄面板对齐alClient。 设置splitter1.autosnap:= false

【讨论】:

  • 问题是我想让用户在面板之间拖动整个窗格。我知道这是不常见的行为,但这就是项目的其余部分已经是什么。同样,我不喜欢拆分器太窄,以至于您需要集中注意力将其拖动一段时间。我忘了在我的问题中提到这一点;所以我会在那里添加它。当我明天得到一些积分时 +1。
  • -1 目前,已对此进行了测试,但拆分器不会停留在两个左对齐面板之间。
  • @Johan 感谢您的反对,但恐怕是你犯了错误。
  • 修复了它autosnap需要从它的默认值(true)更改为false,它会像你描述的那样工作。
【解决方案3】:

您可以将面板相互嵌套。

+--------------+#+------------+
|+---------+ p |#|  panel3    |
|| panel1  | a |#|            | 
||         | n |#|            |
||         | e |#|            |
||         | l |#|            |
||         | 2 |#|            |

# 是拆分器。

将按钮放在 panel2 的右侧。
或者甚至更好地在 panel2 上放置一个额外的 panel4,做那个

panel4.align:= alRight;
panel1 align:= alClient;
panel2.Align:= alClient;
splitter1.align:= alright or alLeft //experiment here
panel3.Align:= alRight;

这应该可以解决问题。

【讨论】:

  • 这里为什么需要嵌套?
  • @David 面板的对齐方式将让 panel1 和 panel3 使用拆分器调整大小,同时保持 panel2 的固定大小。还有其他方法可以做到这一点,但我喜欢嵌套面板。它适用于所有版本的 Delphi,无需代码。
  • @Johan 您无需嵌套面板即可实现所需的功能,而无需代码。
  • @David,我知道你可以使用锚点,但我更喜欢嵌套。
  • @Johan 你不需要锚。您需要左侧面板和中间面板具有 alLeft,右侧面板具有 alClient。然后分离器位于左面板和中间面板之间,一切都很好。
【解决方案4】:

有一个重要的通知。 Splitter 之间的两个面板都应具有相同的参数AlignWithMargins。 (都为真或都为假)。否则分离器不起作用。我与这个问题斗争了几天

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2021-05-17
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多