Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.034 c
14-1129239730
ron
2005-10-14 01:42
2005.11.06
Independent Software Developers Forum (ISDEF)


14-1129711273
vecna
2005-10-19 12:41
2005.11.06
Тааак.... список непонятных моментов в Дельфи начинает расти


14-1129266176
Ega23
2005-10-14 09:02
2005.11.06
С днем рождения! 14 октября


6-1122275828
Marsel83
2005-07-25 11:17
2005.11.06
CGI смена кодировок


14-1129027442
Ketmar
2005-10-11 14:44
2005.11.06
посоветуйте быстрй хороший хост...




   Наверх