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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2017, 12:27   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Invalid Pointer Operation не пойму откуда

Здравствуйте.
Есть процедура, формирующая TObjectList из другого TObjectList по определённой зависимости. Привязана к изменению ComboBoX (ComboBox1Change). Всё работает нормально пока работает программа. Но при закрытии программы вызывает ошибку "Invalid pointer operation". Никакую строчку в коде не высвечивает - просто говорит об ошибке, и всё. При этом если строку Add для формируемого TObjectList закомментировать - закрывается нормально. Раскомментировать - опять та же ошибка. Что за ерунда?
Сама процедура
Код:
procedure TForm1.OutOtdel(OtdName:String);
var
  NewCont:TStringList;
  i:integer;
begin
  SelPeoples.Clear;
  NewCont:=TStringList.Create;
  for i:=0 to Peoples.Count-1 do
    if (OtdName='Все') or
       ((OtdName<>'Все') and (Peoples[i].Departament=OtdName)) then
    begin
      NewCont.Add(Peoples[i].FIO);
      SelPeoples.Add(Peoples[i]); //если закомментировать - ошибка пропадает
    end;
  ListBox1.Items:=NewCont;
  NewCont.Free;
end;
Её вызов
Код:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  OutOtdel(ComboBox1.Text);
end;
Destroy формы
Код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  SavePBToFile;
  SelPeoples.Free;
  Peoples.Free;
  Departaments.Free;
end;
Ship_1 вне форума Ответить с цитированием
Старый 13.11.2017, 14:21   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Двойное удаление.
TObjectList само удаляет и себя и объекты внутри себя при вызове free, но в деструкторе формы вызывается ещё и удаление объектов
eoln вне форума Ответить с цитированием
Старый 13.11.2017, 14:56   #3
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ааа... Понял. Т.е., получается, что я один и тот же объект в два листа размещаю, а не создаю в одном листе копию объекта из другого... А потом его удаляю в одном листе, и в другом к моменту удаления его уже не остаётся. Хм. Тогда что, получается, что в данной ситуации надо делать вот так?
Код:
  Peoples:=TPeoples.Create(true);
  SelPeoples:=TPeoples.Create(false);
(TPeoples - и есть TObjectList)
Тогда Peoples.Free удалит лист со всеми объектами, а SelPeoples.Free удалит только сам лист, а объектов в нём уже не будет. Правильно понимаю?
И есть ли в этом случае разница между
Код:
  SelPeoples.Free;
  Peoples.Free;
и
Код:
  Peoples.Free;
  SelPeoples.Free;
?
Ship_1 вне форума Ответить с цитированием
Старый 13.11.2017, 19:31   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
один и тот же объект в два листа размещаю
да, объект один и тот же, ObjectList хранить только указатели на них, а не сами объекты

Цитата:
Тогда что, получается, что в данной ситуации надо делать вот так?
Код:

Peoples:=TPeoples.Create(true);
SelPeoples:=TPeoples.Create(false);

Тогда Peoples.Free удалит лист со всеми объектами, а SelPeoples.Free удалит только сам лист, а объектов в нём уже не будет. Правильно понимаю?
да, можно и так, с параметром false объекты внутри будут в безопасности, удалятся будут только указатели из этого TObjectList

Цитата:
есть ли в этом случае разница
разницы нет, SelPeoples.Free никак не влияет на объекты внутри
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Invalid Pointer operation hon Общие вопросы Delphi 6 22.11.2011 21:59
Invalid Pointer Operation Стелс Компоненты Delphi 1 25.09.2011 21:24
Invalid pointer operation. KoBRaAndrey Общие вопросы Delphi 6 02.06.2010 17:32
Invalid Pointer Operation Unconnected Общие вопросы Delphi 3 21.02.2009 20:23
Invalid pointer operation Димарик Общие вопросы Delphi 2 05.11.2007 09:53