【问题标题】:Resizing buttons so they are all the same width调整按钮大小,使它们都具有相同的宽度
【发布时间】:2010-10-05 13:42:44
【问题描述】:

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

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

谁能提供一个解决方案,让面板上的按钮可以调整大小但保持设计时间顺序(就从左到右的位置而言)?

【问题讨论】:

  • 也许我遗漏了一些东西,但按钮应该有它们的设计时大小或调整后的大小?或者您只想调整按钮的大小,除非表单从最小化状态恢复?
  • 在设计时,我们对按钮进行布局以建立它们应该处于的顺序(从左到右)。大小无关紧要,因为它们会在运行时调整大小以填充整个面板。
  • “布局”变化是什么意思?你说的是什么布局?有什么不同?
  • @Rob Kennedy:我认为他的意思是按钮的顺序发生了变化。这是一个众所周知的烦恼,因为两个或多个控件具有相同的Align

标签: delphi


【解决方案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 := i * btnWidth;
    Panel1.Controls[i].Width := btnWidth;
  end;
end;

这很好用。

https://privat.rejbrand.se/panelresize.wmv

好的,现在我明白了。我认为alLeft 实际上是你的问题。具有相同对齐的控件往往会改变它们的顺序。这是众所周知的 Delphi 烦恼。像我上面那样做,而不是。只要确保您按正确的顺序浏览按钮即可。如果您不能依赖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;

【讨论】:

  • 这就是“Align=Left”的目的,所以我们不需要担心设置位置。他们只会“到位”。当您在控件上循环时,您能确定它们是“从左到右”吗?
  • 好的。我懂了。但是问题到底出在哪里呢? :)
  • 好的,现在我明白了。我认为alLeft 实际上是你的问题。具有相同对齐的控件往往会改变它们的顺序。这是众所周知的 Delphi 烦恼。像我上面那样做,而不是。
  • 我会试试这个。但是我确实有一个“侧面”问题:当循环遍历控件时,它假设索引为 0 的控件是最左边的控件,与 1 相关联的控件位于 0 上的控件索引的右侧。这是一个有效的假设吗?还是随意的?
  • 我明白了 - 您正在使用“标签”属性来处理这个问题。但是无论如何不依赖“标签”属性?这将导致开发人员的双重工作。我们喜欢在设计期间只使用 align 属性来建立顺序。我想我必须编写一个预处理器函数,在任何事情之前调用它来找出布局顺序。
【解决方案2】:

您是否尝试过查看TFlowPanel 是否更适合您的需求?

【讨论】:

  • 我得去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
相关资源
最近更新 更多