Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка работы с памятью после удаления контролов 
:(
    Опции темы
Beltar
Дата 20.1.2017, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



В общем дано, наследник TImage, который при рождении сразу еще создает пару подписей.

Код

constructor TLabeledImage.Create(AOwner, AParent: TWinControl;
  ALeft, ATop, AWidth, AHeight: Integer);
begin
inherited Create(AOwner) ;
Parent:=AParent;
DragMode:=dmAutomatic;

FLabel1:=TLabel.Create(AOwner);
FLabel1.Parent:=AParent;
FLabel2:=TLabel.Create(AOwner);
FLabel2.Parent:=AParent;
//Помимо этого задаются еще всякие Left, Width, значения по умолчанию и т. п.
end;


Т. е. метки передаются во владение и родительство тому же контролу, что и сама картинка.

Справка и несколько просмотренных перед этим топиков инете подсказывают, что для удаления объектов из Components владельца нужно занилять им Parent. Соответственно для убиения.

Код

destructor Destroy;override;
//...
destructor TLabeledImage.Destroy;
begin
if Assigned(FLabel1) then
  begin
  FLabel1.Parent:=nil;
  FLabel1.Free;
  end;
if Assigned(FLabel2) then
  begin
  FLabel2.Parent:=nil;
  FLabel2.Free;
  end;
  inherited;
end;


Сам контрол

Код

procedure TfmMain.acObjDeleteExecute(Sender: TObject);
begin
if SelPicture=nil then Exit;//Удаляю контрол под мышкой.
SelPicture.Parent:=nil;
SelPicture.Free;
end;


3 Контрола из Controls у родителя благополучно исчезают, но при завершении программы вылетает Invalid Pointer Operation, нехороший симптом.
Что я делаю не так?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
kami
Дата 20.1.2017, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



acObjDeleteExecute - что приводит к вызову этого метода? Не "внутренности" TLabeledImage случайно?
PM MAIL WWW   Вверх
Beltar
Дата 23.1.2017, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Цитата

acObjDeleteExecute


Нет, это банальное выполнение акшена acObjDelete.

Попробовал просто бросить что-то на форму и удалить.

Код

Image1.Parent:=nil;
FreeAndNil(Image1);


Удаляется, но при завершении программы та же ошибка, как и при прямом вызове RemoveControl у родителя.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Doga
Дата 31.1.2017, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 20.12.2007
Где: Россия, Обнинск

Репутация: нет
Всего: нет



Привет.

При динамическом создании компонента, попробуйте в качестве аргумента конструктора AOwner использовать значение NIL.
PM MAIL WWW   Вверх
Beltar
Дата 1.2.2017, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



То же самое. У меня получается, что ошибка возникает из-за FLabel1.Free; и FLabel2.Free;
С точки зрения уничтожения всего после завершения работы программы, оно будет пофигу. Но если я убираю лейблы из Controls владельца, то они, по идее, просто повисают где-то, т. е. получается утечка. Почему я не могу после этого сделать им Free мне непонятно.

Есть правда, вариант, забить на утечку (редактор с удалением элементов мне нужен, не конечному пользователю), но понять все-таки хотелось бы.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1238 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.