Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Динамически создаваемые Лэйблы


Автор: Fedor 24.12.2003, 22:54
Динамически создаю Label'ы:
if условие, то...
Labels[i,j]:=TLabel.Create
Это все понятно.
А далее нужно освободить все из них, тоесть label[i,j].free
проблема: если из-зи условия конкретный Label не создался, то при освобождении выается ошибка.
пробывал делать:
Код

try
for i:=1 to n do
 for j:=1 to n do
  Labels[i,j].free;
except
end;

выдается ошибка
Также пробовал:
Код

for i:=1 to n do
 for j:=1 to n do
   if labels[i,j]<>free then Labels[i,j].free;

Тоже выдается ошибка
помогите это сделать...

Автор: Illusion Dolphin 24.12.2003, 23:19
А попробуй по умолчанию задавать всем элементам массива значение nul, а потом проверять на него, и если он не nul, тогда делать freeandnil(labels[i,j])

Автор: zemfir 25.12.2003, 00:00
Вы пытаетесь освободить то, чего нетsmile.gif Естественно будет выдаваться ошибка. Если Вы с этим смирились и это по какой-либо причине нужно (не могу представить), и Вам просто нужно выполнить цикл, то заключите free в скобки исключения, или ещё лучше сделайте как советуют, а именно задайте null и проверяйте перед деструктором if assigned(l).

Автор: Fedor 25.12.2003, 00:45
Попробую все, что предложили...
zemfir а Вы не могли бы рассказать как именно заключать в скобки исключения. А то че-то у меня пока с ентим проблемы... Даже в хелпе нормально не могу найти...

Автор: zemfir 25.12.2003, 00:58
for i:=1 to n do
for j:=1 to n do
begin
try
Labels[i,j].free;
except
end;
end;
но вообще, это порочный путь.
Правльно изначально задать значения
Labels[i,j]=nil

а при уничтожении

if Assigned(Labels[i,j]) then Labels[i,j].Free,
В принципе, перехват исключения стоять должен, но только как "на всякий случай", а может и не должен, не должно быть в этому случае "всяких случаев".

Автор: Fedor 25.12.2003, 18:43
zemfir Дольшое спасибо! Буду пробовать.

Автор: Петрович 25.12.2003, 23:13
Illusion Dolphin
Цитата
а потом проверять на него, и если он не nul, тогда делать freeandnil(labels[i,j])

и zemfir
Цитата
if Assigned(Labels[i,j]) then Labels[i,j].Free,

Проверка вовсе не обязательна, если массив был проинициирован Nil. Дело в том, что Free для того сделан что-бы на Nil не ругаться. Иначе можно было просто дергать Destroy.
Вот выдержка из справки:
Цитата
Free is successful even if the object is nil; so if the object was never initialized, Free won’t result in an error.

Ну а для полной гарантии вот фрагмент из System.pas:
Код
procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)