以编程方式设置停靠工具栏的位置

时间:2013-11-03 17:01:48

标签: delphi vcl delphi-xe3

我正在尝试重置TControlBar中的一组工具栏位置。用户可以拖动工具栏并将其取消停靠。我正在尝试创建重置按钮,重新排列工具栏是一种预设方式。

我无法按照我想要的顺序重置工具栏。我的ManualDock调用的结果似乎取决于我的代码执行之前的排列方式。

我有4个工具栏,我想要排成两行,如下所示:

[Toolbar1][Toolbar2]
[Toolbar3][Toolbar4]

我尝试过以下代码的变体但没有成功:

// I found some references to different docking issues when controls were visible
// Hide everything first and then show them in the order I want them added.
Toolbar1.Visible := false;
Toolbar2.Visible := false;
Toolbar3.Visible := false;
Toolbar4.Visible := false;

ToolBar1.Visible := true;
ToolBar1.ManualDock(DockSite);
ToolBar1.Left := 0;

Toolbar2.Visible := true;
Toolbar2.ManualDock(DockSite, Toolbar1, alRight);

Toolbar3.Visible := true;
Toolbar3.ManualDock(DockSite, Toolbar1, alBottom);
Toolbar3.Left := 0;

Toolbar4.Visible := true;
Toolbar4.ManualDock(DockSite, Toolbar3, alRight);

屏幕上的结果会有所不同,具体取决于代码执行前工具栏的起始位置。

我尝试了几种不同的方法   - 在手动停靠呼叫后设置工具栏的顶部和左侧   - alLeft / alTop而不是上面的选项   - 在ManualDock调用中使用Nil作为第二个parm并将所有内容设置为alTop

我尝试使用2个工具栏强制它们出现在同一行(并排)或两行中。我的结果再次取决于工具栏在我的代码执行之前的开始位置。

1 个答案:

答案 0 :(得分:3)

隐藏,对接,设置位置和显示应该会产生预期的结果。

begin
  ToolBar1.Visible := false;
  ToolBar2.Visible := false;
  ToolBar3.Visible := false;
  ToolBar4.Visible := false;
  ToolBar1.ManualDock(ControlBar1);
  ToolBar2.ManualDock(ControlBar1);
  ToolBar3.ManualDock(ControlBar1);
  ToolBar4.ManualDock(ControlBar1);

  ToolBar1.Left := 0;
  ToolBar1.Top := 0;
  ToolBar2.Left := ToolBar1.Width;
  ToolBar2.Top := 0;
  ToolBar3.Left := 0;
  ToolBar3.Top := MAX(ToolBar1.Height, ToolBar2.Height);
  ToolBar4.Left := ToolBar3.Width;
  ToolBar4.Top := ToolBar3.Top;

  ToolBar1.Visible := true;
  ToolBar2.Visible := true;
  ToolBar3.Visible := true;
  ToolBar4.Visible := true;
end;