![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при TLabel.Free
__DATA__ © (2005-10-14 13:39:00)Вылетает AV при выполненнии следующего кода
for i := 0 to 255 do
if lab[i] <> nil then
lab[i].Free;
Сначала создаю некоторые элементы маччива lab: array[0..255] of TLabel;
работаю с ними, ну а при повторном вызове процедуры освобождаю массив описаным выше способом, но при выполнении lab[i].Free; вылетает AV, почему?
Leonid Troyanovsky (2005-10-14 17:46:00) [1]
> jack128 © (14.10.05 15:55) [6]
> Бо она говорит о глобальности lab (хочется сказать "глобализме")
> Ничего это не говорит. Массив lab вполне может быть полем
> объекта.
Таковым он быть должен.
Более того, он должен быть полем компонента (его owner'а), или полем
TWinControl, назначаемого Parent его элементам.
Тогда и не возникает ни забот о его судьбе, ни нынешних вопросов.
Ну, а включение массива полем в объект, который не обладает механизмом,
схожим с TComponent.Notification - тот же грех глобализма.
--
Regards, LVT.
Vladimir88 (2005-10-14 16:34:00) [2]А вообще для такого лучше использовать TObjectList, при уничтожении которого он уничтожает и все содержащиеся в нём объекты.
t1 (2005-10-14 15:58:00) [3]
for i := 0 to 255 do FreeAndNil(lab[i]);
jack128 (2005-10-14 15:55:00) [4]Leonid Troyanovsky © (14.10.05 15:30) [5]
Бо она говорит о глобальности lab (хочется сказать "глобализме"),
Ничего это не говорит. Массив lab вполне может быть полем объекта.
Leonid Troyanovsky (2005-10-14 15:30:00) [5]
> evvcom © (14.10.05 15:20) [4]
> будет оптимальнее:
> for i := 0 to 255 do
> lab[i].Free;
> FillChar(lab[0], SizeOf(lab), 0);
Еще оптимальней, IMHO, будет отказаться от последней строки.
Бо она говорит о глобальности lab (хочется сказать "глобализме"),
или о том, что переменная используются повторно.
И то и другое не есть хорошо, т.к. являются источником
немалого количества багов.
--
Regards, LVT.
evvcom (2005-10-14 15:20:00) [6]Кстати, Free сам проверяет на nil, поэтому, возможно, так будет оптимальнее:
for i := 0 to 255 do
lab[i].Free;
FillChar(lab[0], SizeOf(lab), 0);
__DATA__ (2005-10-14 13:50:00) [7]
> [1] Плохиш © (14.10.05 13:46)
Спасибо!
Digitman (2005-10-14 13:47:00) [8]
> при повторном вызове процедуры
а при первом вызове тоже что ли "освобождаешь" ?
получается, что ты 2 раза подряд "освобождаешь" массив ?
for i := 0 to 255 do
if lab[i] <> nil then
begin
lab[i].Free;
lab[i] := nil;
end;
Плохиш (2005-10-14 13:46:00) [9]В массиве перед употреблением надо установить все элементы в nil, после уничтожения обйекта, на который ссылается lab[i] нужно установить lab[i] в nil.