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