0

我是这个德尔福的新手。我被赋予了动态创建按钮的任务。但问题是所有按钮都必须以适合整个屏幕的方式对齐。即,如果创建了 10 个按钮,则应该填充整个屏幕。或者如果给出 9,则 9 应该出现并填充在屏幕中。有可能这样做吗?我到处尝试和搜索。但是很无奈。

如果可能,请帮助我。一个很好的例子也值得赞赏,因为我之前提到过我对此很陌生。我做的代码如下。

procedure TfrmMovieList.PnlMovieClick(Sender: TObject);
begin
  for i := 0 to 9 do
  begin
    B := TButton.Create(Self);
    B.Caption := Format('Button %d', [i]);
    B.Parent := Panel1;
    B.Height := 23;
    B.Width := 100;
    B.Left := 10;
    B.Top := 10 + i * 25;
  end;
end;
4

1 回答 1

1

这对我来说看起来可行:

procedure TForm1.CreateButtons(aButtonsCount, aColCount: Integer; aDestParent: TWinControl);
var
  rowCount, row, col, itemWidth, itemHeight: Integer;
  item: TButton;
begin
  if aColCount>aButtonsCount then
    aColCount := aButtonsCount;
  rowCount := Ceil(aButtonsCount / aColCount);
  itemHeight := aDestParent.Height div rowCount;
  itemWidth := aDestParent.Width div aColCount;
  for row := 0 to rowCount-1 do begin
    for col := 0 to aColCount-1 do begin
      item := TButton.Create(Self);
      item.Caption := Format('Button %d', [(row*aColCount)+col+1]);
      item.Left := itemWidth*col;
      item.Top := itemHeight*row;
      item.Width := itemWidth;
      item.Height := itemHeight;
      item.Parent := aDestParent;
      Dec(aButtonsCount);
      if aButtonsCount=0 then
        Break;
    end; // for cols
  end; // for rows
end;

一个使用示例是:

procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateButtons(10, 4, Panel1);
end;

函数Ceil需要使用单位Math

该方法接收按钮计数和列数以计算行数。它还接收按钮所在的目标父级。

于 2013-08-01T11:20:04.850 回答