Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2015, 16:11   #1
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию TObjectList - проблемы с удалением\очисткой

Всем привет!
Дано:
Код:
type
  TCellObjList= class(TObjectList)
  end;

var
  ItmList: TCellObjList;
Забиваю я этот ItmList так:
Код:
  ItmList.add(pointer(itm));
где itm это переменная собственного типа моего.

У меня есть StringGrid и в его Objects[Acol, ARow] закидывается тот самый pointer(itm).

Это все работает.

Затем мне надо перерисовать stringgrid и, естественно, objects его тоже заменить на новые.

Я полагаю, что конструкция ItmList.Clear; должна очистить список и установить его Coun=0 (так и гласит справка).

Но как только дело доходит до очистки- я получаю
Код:
exception class EAccessViolation with message 'Access violation at address 00000001. Read of address 00000001'.
соответственно очищения не происходит и труба.
Где я не дописал чего?

p/s я пробовал сначала все объекты в StringGrid обнулять вот так
Код:
 StringGrid.objects[ACol, ARow]:=nil
и потом делать очистка списка, но результат такой же.

Прошу помочь и наставить на путь правильный. D7
Dee63 вне форума Ответить с цитированием
Старый 28.04.2015, 16:29   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Taм в TObjectList.Notify используется TObject.Free для освобождения памяти.
Цитата:
переменная собственного типа моего
От чего наследован тип? Если не от TObject или его потомков, то приехали - очищать ручками
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.04.2015 в 16:31.
Аватар вне форума Ответить с цитированием
Старый 28.04.2015, 16:31   #3
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Для переменной собственного типа может использовать TList?
ДралсяСошибками вне форума Ответить с цитированием
Старый 28.04.2015, 16:40   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Tlist.Notify вообще пустышка - > Clear в нем, который и вызывает Delete и дальше Notify память не освобождает
Цитата:
Для переменной собственного типа может использовать TList?
Можно, но память самостоятельно освобождать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.04.2015, 16:47   #5
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Наверно проще будет переменную собственного типа унаследовать от TObject
ДралсяСошибками вне форума Ответить с цитированием
Старый 28.04.2015, 16:54   #6
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Taм в TObjectList.Notify используется TObject.Free для освобождения памяти.
От чего наследован тип? Если не от TObject или его потомков, то приехали - очищать ручками
Именно не от TObject.
Вот в чем беда кроется...

Ручками чистить это вы о ItmList.delete[i] или о ItmList.items[i]:=nil?
В моей ситуации
Код:
itmList.Items[i]:=nil
и
Код:
itmList.Delete(i);
приводят к одинаковой ошибке EAccessViolation
Dee63 вне форума Ответить с цитированием
Старый 28.04.2015, 16:55   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А как их создавал? Код создания сюда
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.04.2015, 16:58   #8
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

И на переменную собственного типа бы посмотреть))
ДралсяСошибками вне форума Ответить с цитированием
Старый 28.04.2015, 17:05   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
должна очистить список и установить его Coun=0 (так и гласит справка).
Очистить список объектов можно ДВУМЯ способами
1) удалить ссылки из списка, но с самими объектами НИЧЕГО не делать.
2) удалять ссылки с УНИЧТОЖЕНИЕМ (Free) объектов.

Режим очистки задается при СОЗДАНИИ контейнера.
Create(False); указывает что объекты ДОЛЖНЫ оставаться.
Цитата:
Create creates a TObjectList instance. If no parameter is specified, or if the constructor is called with AOwnsObjects set to true, the new TObjectList is initialized with OwnsObjects set to true.
гласит та же справка.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.04.2015 в 17:07.
evg_m вне форума Ответить с цитированием
Старый 28.04.2015, 17:09   #10
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

Тип объявлен вот так:
Код:
  BData = ^TBData;
  TBData= Record
    number:string;
    CellColor: TColor;
    FontColor: TColor;
    status:string;
    client:string;
    client_mark:string;
  end;
в процедуре объявлена переменная
Код:
var
  itm: BData;
и с ней работа строится так:

Код:
new(itm);
...
itm^.number:= number;
...
И вот так она кидается в лист
Код:
ItmList.Add(pointer(itm));
Потом в другой функции она достается из спика- чтение чего-то или добавление и назад туда же возвращается уже вот так
Код:
ItmList.items[i]:= pointer(itm)
Dee63 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с удалением элемента в списке JonnyFletcher Общие вопросы Delphi 1 26.05.2013 21:32
Проблемы с удалением строк (VBA) WennY Microsoft Office Excel 8 23.02.2012 18:50
TObjectList.Add - проблемы JustKurt Помощь студентам 3 18.06.2010 19:36
проблемы с удалением строки в таблице retede JavaScript, Ajax 2 15.01.2010 12:57
Проблемы с TObjectList lexaltd Общие вопросы Delphi 6 06.04.2009 20:54