Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Ошибка при 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
6-1122044361
vers
2005-07-22 18:59
2005.11.06
TIdTCPClient - InputBuffer


14-1129150278
Германн
2005-10-13 00:51
2005.11.06
Непонятный глюк на форуме


2-1129434980
DimaDima
2005-10-16 07:56
2005.11.06
Можно ли обращаться к массивам по индексам в их имени?


6-1121752656
pupapum
2005-07-19 09:57
2005.11.06
Передача файлов по локальной сети


4-1125834545
Valera
2005-09-04 15:49
2005.11.06
CDROM для мультимедия