如何创建包含组件的分隔器?

11

我希望在两个可调整大小的面板之间或直接放在分隔条上放置一些按钮。如何实现它们将随着分隔条移动而移动?如何锚定它们?

截图

编辑:
也许我忘了提到最重要的事情,就是那个分隔条必须像截图上一样宽,而且按钮应该放在上面;所以这些按钮实际上现在“漂浮在分隔条上”。

非常感谢!


4
由于TSplitter不是一个窗口控件,因此无法在其上放置其他控件。我建议完全放弃使用TSplitter,改为使用TPanel并编写一些逻辑使其像分隔符一样工作。这可能相当简单,但由于我现在没有Deplhi IDE/RTL/compiler,所以我无法尝试(至少现在不行)。 - Andreas Rejbrand
1
@Andreas 这不是正确的做法。你需要同时使用分隔器和面板。这就是分隔器的工作原理。 - David Heffernan
1
@Andreas 另一方面,你似乎已经理解了这个问题,而我没有。我已经反复阅读了它,但我无法弄清楚你是如何做到的,但你似乎已经推断出了问题的意图! - David Heffernan
你可以设置这个分隔条的宽度,并将 beveled:= true 这样它不会太小而难以点击,同时在视觉上也更加突出。 - Johan
@Johan - 这就是为什么我放置了一个组件名称; 在我看来,3D面板之间的3D分割器可能比它现在更不可见。 - user532231
4个回答

6

无法自动完成此操作。
您可以手动更改拆分器的OnMoved事件中按钮的左属性。
没有很好的解决方案(在拖动时进行可视化不太好),但它可以得到您需要的结果。您可以尝试使用 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;

点击此处查看结果。

祝好


这正是我所思考的,而不是试图编写自己的控件。 这个解决方案有点不太干净,但它能够工作; 在我在这里提问之前,我已经尝试过相同的解决方案。 因此,+1(明天)感谢你能够猜到我的想法 :) - user532231

6

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

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

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

窍门在于拆分器不包含控件-您需要使用面板来进行控件布局。

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


问题在于我想让用户在面板之间拖动整个窗格。我知道这不是常见的行为,但这就是项目的其余部分所做的。同样,我不喜欢分隔条太窄,以至于你需要集中注意力一段时间才能拖动它。我忘了在我的问题中提到这一点,所以我会在那里添加它。明天我得到一些积分时+1。 - user532231
目前为止,我已经测试过了,但是分隔符不能保持在两个左对齐面板之间。 - Johan
1
@Johan 谢谢你的投票,但恐怕是你犯了错误。 - David Heffernan
修复了,需要将“autosnap”从默认值(true)更改为“false”,然后它将按照您描述的方式工作。 - Johan

1

您可以将面板嵌套在另一个面板中。

+--------------+#+------------+
|+---------+ 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 Heffernan
@Johan,您无需嵌套面板即可实现所需的功能,而无需编写代码。 - David Heffernan
@David,我知道你可以使用锚点,但我更喜欢嵌套。 - Johan
@Johan,您不需要锚点。您需要将左侧和中间面板设置为alLeft,将右侧面板设置为alClient。然后,分隔条位于左侧和中间面板之间,一切都很好。 - David Heffernan
@David,是的,但如果你想要panel1内部的控件扩展,你需要进行一些嵌套(或锚定),否则中间的面板将会扩展(我刚测试过:),这不是你想要的,你想要最左边的面板扩展/收缩。 - Johan
显示剩余2条评论

1

有一个重要的提示。在分隔器之间的两个面板应该具有相同的参数AlignWithMargins。(都为true或都为false)。否则,分隔器将无法正常工作。我曾经为此问题苦战了几天。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接