【问题标题】:Issues with GridPanel in Delphi XEDelphi XE 中的 GridPanel 问题
【发布时间】:2019-03-16 16:50:40
【问题描述】:

GridPanel 有问题! 难道我做错了什么? 第 2 列的第一行是调整表单大小的错误。用 Delphi XE 6 和 10.2.2 测试! 将 TGridPanel 放置到窗体并将“对齐”设置为“alClient”。启动并调整表单大小。

试试下面的代码:

procedure TForm5.Button1Click(Sender: TObject);
var
  Col,Row: Integer;
  CI: TControlItem;
  Panel: TPanel;
  Rows, Cols: Integer;
begin
  GridPanel1.RowCollection.BeginUpdate;
  GridPanel1.ColumnCollection.BeginUpdate;
  GridPanel1.ColumnCollection.BeginUpdate;

  GridPanel1.RowCollection.Clear;
  GridPanel1.ColumnCollection.Clear;

  Rows := 6;
  Cols := 4;

  for Row := 1 to Rows do
  begin
    with GridPanel1.RowCollection.Add do
    begin
      SizeStyle := ssPercent;
      Value := 100 / Rows;
    end;
  end;

  for Col := 1 to Cols do
  begin
    with GridPanel1.ColumnCollection.Add do
    begin
      SizeStyle := ssPercent;
      Value := 100 / Cols;
    end;
  end;

  for Row := 0 to GridPanel1.RowCollection.Count - 1 do
  begin
    for Col := 0 to GridPanel1.ColumnCollection.Count - 1 do
    begin
      Panel := TPanel.Create(Self);
      Panel.Parent := GridPanel1;
      CI := GridPanel1.ControlCollection.Add;
      CI.Column := Col;
      CI.Row := Row;
      Panel.Caption := 'Row ' + Row.ToString + ' Col ' + Col.ToString;
      CI.Control := Panel;
    end;
  end;
  GridPanel1.ColumnCollection.EndUpdate;
  GridPanel1.RowCollection.EndUpdate;
  GridPanel1.ColumnCollection.EndUpdate;
end;

【问题讨论】:

  • 嗯,有什么问题?你说的是Vcl还是Fmx。在标题中您谈到 Delphi XE,在有关 Delphi XE6 和 10.2.2 的文本中。您已添加标签 delphi-xe。所以你指的是哪个版本?如果 TGridPanel.Align = alClient ,按钮的父级是什么?我猜是网格面板,但您的问题在哪个面板中重要吗?
  • 在您的循环中,面板创建循环中,将CI.Column := Col; CI.Row := Row; 替换为CI.Column := 0; CI.Row := 0;
  • @Tom - 问题是第 3 句 “第 2 列的第一行是调整大小的错误...”。很明显,当您运行代码时,某些单元格不会效仿。按钮的父级是表单,因为代码首先删除了所有单元格。如果按钮被遮挡,您可以将其“放在前面”。

标签: delphi delphi-xe delphi-xe6 gridpanel


【解决方案1】:

正如 Tom Brunberg 所指出的,设置 Panel.Parent 将它们放在控件集合中并管理事物。

  for Row := 0 to GridPanel1.RowCollection.Count - 1 do
  begin
    for Col := 0 to GridPanel1.ColumnCollection.Count - 1 do
    begin
      Panel := TPanel.Create(Self);
      Panel.Parent := GridPanel1;
      Panel.Caption := 'Row ' + Row.ToString + ' Col ' + Col.ToString;
    end;
  end;

您的代码使集合最终得到 48 个控件而不是 24 个。

form1.Caption := 'ControlCollection.Count:' + IntToStr(GridPanel1.ControlCollection.Count);

【讨论】:

  • 实际上,删除创建CI 的行以及与CI 相关的所有内容。 controlcollection 是内部管理的。
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 2011-11-17
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多