【发布时间】:2016-06-02 10:47:43
【问题描述】:
我正在使用 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;
您会注意到每个面板都有不同的标记值。
我想根据面板的 tag 属性中的值从 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。
【问题讨论】:
-
反转你的循环,
GridPanel2.ControlCollection.Count -1 downto 0 -
谢谢你,@DalijaPrasnikar。我错过了一次Break out of the loop。由于每个标签值都是唯一的,因此只会删除一个面板。这修复了超出范围的错误,但没有修复剩余面板的改组。再次感谢,
-
我回滚了您的编辑,因为您已经删除了问题存在的全部原因。添加
break后,您描述的问题不会发生,因此该问题对这里的未来读者没有任何价值。编辑代码并删除发布的全部原因是不合适的,尤其是在有人根据帖子中的错误回答之后。你不仅浪费了那个人的时间,而且你完全否定了这个答案,这可能导致那个人因为对那个现在不正确的答案投票而失去声誉。 -
@KenWhite 谢谢。