Я использую TGridPanel для управления несколькими панелями. Я создаю панели и добавить их к GridPanel с помощью кода, как следующее:Удаление элементов управления из TGridPanel
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;
Это хорошо работает, если панель является последней панелью в коллекции. Если я попытаюсь удалить панель с тегом = 1 или tag = 2, я получаю ошибку вне диапазона. Нажатие «continue» в отладчике оставляет место, где была удалена панель, поэтому удаляет панель.
Что бы я хотел видеть, скажем, панель 2 удалена и последующие панели перетасовываются на одно место, чтобы не осталось пробелов.
Как это сделать?
Я использую Delphi 10.1 Berlin, если это имеет значение.
Reverse свой цикл, 'GridPanel2.ControlCollection.Count -1 downto 0' –
спасибо, @DalijaPrasnikar. Я пропустил разрыв из петли. Поскольку каждое значение тега уникально, только одна панель будет удалена. Это исправляет ошибку вне диапазона, но не перетасовку остальных оставшихся панелей. Еще раз спасибо, –
Я откат вашего редактирования, потому что с ним вы удалили всю причину возникновения вопроса. С добавлением 'break' проблема, которую вы описываете, не возникает, и поэтому вопрос не имеет значения для будущих читателей здесь. Неправильно редактировать код и удалять всю причину публикации, особенно после того, как кто-то ответил на эту ошибку в сообщении. Вы не только тратите время на этого человека, но полностью отрицаете ответ, что может привести к тому, что этот человек потеряет репутацию из-за голосов по этому теперь неправильному ответу. –