调整按钮大小,使它们的宽度相同

时间:2010-10-05 13:42:45

标签: delphi

我有一个“宽”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;

问题是如果我最小化然后恢复表单,按钮的布局会从设计布局中改变。

任何人都可以提供解决方案,让面板上的按钮可以调整大小但保持设计时间顺序(从左到右放置)?

2 个答案:

答案 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是否更符合您的需求?