我有一个“宽”TPanel,上面有几个按钮(基本上是一个工具栏)。所有按钮都有Align = Left。我创建了一个函数,它将按钮大小调整到相同的大小并计算它们的宽度,以便它们填充整个TPanel。我在TPanel的OnResize事件处理程序中调用此函数。
procedure ScaleButtonsOnPanel;
var i: Integer;
begin
for i:=0 to mPanel.ControlCount-1 do begin
mPanel.Controls[i].Width := round(mPanel.width/mPanel.ControlCount-1)
end;
end;
问题是如果我最小化然后恢复表单,按钮的布局会从设计布局中改变。
任何人都可以提供解决方案,让面板上的按钮可以调整大小但保持设计时间顺序(从左到右放置)?
答案 0 :(得分:4)
我真的没有看到你的问题。但是,当然,您必须设置按钮的位置,而不仅仅是它们的大小。
procedure TForm1.Panel1Resize(Sender: TObject);
var
i: Integer;
btnWidth: integer;
begin
btnWidth := Panel1.Width div Panel1.ControlCount;
for i := 0 to Panel1.ControlCount - 1 do
begin
Panel1.Controls[i].Left := i * btnWidth;
Panel1.Controls[i].Width := btnWidth;
end;
end;
这非常有效。
请参阅http://privat.rejbrand.se/panelresize.wmv。
好的,现在我明白了。我认为alLeft
实际上是你的问题。具有相同对齐的控件倾向于改变它们的顺序。这是一个众所周知的德尔福烦恼。就像我上面那样做。只需确保按正确顺序浏览按钮即可。如果您不能依赖Panel1.Controls
的排序,那么您可以这样做:将每个工具栏按钮的Tag
属性设置为工具栏中的位置(0,1,...)然后执行
procedure TForm1.Panel1Resize(Sender: TObject);
var
i: Integer;
btnWidth: integer;
begin
btnWidth := Panel1.Width div Panel1.ControlCount;
for i := 0 to Panel1.ControlCount - 1 do
begin
Panel1.Controls[i].Left := Panel1.Controls[i].Tag * btnWidth;
Panel1.Controls[i].Width := btnWidth;
end;
end;
答案 1 :(得分:2)
您是否尝试过查看TFlowPanel是否更符合您的需求?