gpt4 book ai didi

delphi - 从 TGridPanel 中删除控件

转载 作者:行者123 更新时间:2023-12-03 15:56:09 33 4
gpt4 key购买 nike

我正在使用 TGridPanel 来管理多个面板。我创建面板并使用如下代码将它们添加到 GridPanel:

var
pnl: TPanel;
begin
pnl := TPanel.Create(GridPanel2);
pnl.Caption := 'Panel One';
pnl.Tag := 1;
pnl.Parent := GridPanel2;
pnl.Name := 'pnlOne';

GridPanel2.ControlCollection.AddControl(pnl);


pnl := TPanel.Create(GridPanel2);
pnl.Caption := 'Panel Two';
pnl.Tag := 2;
pnl.Parent := GridPanel2;
pnl.Name := 'pnlTwo';

GridPanel2.ControlCollection.AddControl(pnl);


pnl := TPanel.Create(GridPanel2);
pnl.Caption := 'Panel Three';
pnl.Tag := 3;
pnl.Parent := GridPanel2;
pnl.Name := 'pnlThree';

GridPanel2.ControlCollection.AddControl(pnl);
end;

您会注意到每个面板都有不同的标签值。

我想根据面板标记属性中的值从 GridPanel 中删除面板。我尝试过以下代码:

var
ii: integer ;
pnl: TPanel;
begin
for ii := 0 to GridPanel2.ControlCollection.Count -1 do begin
if GridPanel2.ControlCollection[ii].Control.Tag = 1 then begin
pnl := GridPanel2.ControlCollection[ii].Control as TPanel;

GridPanel2.ControlCollection.RemoveControl(pnl);

freeandnil(pnl);
end;
end;
gridpanel2.Refresh();
end;

如果该面板是集合中的最后一个面板,则效果很好。如果我尝试删除带有 tag = 1 或 tag = 2 的面板,则会出现超出范围的错误。在调试器中单击“继续”会在已删除面板所在的位置留下一个空间,因此也会删除该面板。

我希望看到的是,假设第 2 个面板被移除,随后的面板被移到一个地方,不留任何间隙。

我该怎么做?

如果重要的话,我正在使用 Delphi 10.1 Berlin。

最佳答案

与往常一样,从列表或集合中删除项目时,您需要在计数发生变化时采取预防措施。 for 循环计数在循环开始时确定。现在,如果您从列表中删除一个项目,当 for 循环继续结束时,您将遇到一个不存在的索引。

您可以通过多种方式避免这种情况,例如。一旦您找到并删除了该项目,就可以跳出循环。

  freeandnil(pnl);
break;

另一种方法是向后运行 for 循环

  for ii := GridPanel2.ControlCollection.Count -1 downto 0 do begin

或者您可以使用 Repeat UntilWhile 循环来检查循环每轮继续的条件。

要在删除项目后更新网格面板,请调用其中一个或两个

  gridpanel2.UpdateControlsRow();
gridPanel2.UpdateControlsColumn();

但是,正确的顺序感觉很棘手

关于delphi - 从 TGridPanel 中删除控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37589677/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com