|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
24.06.2008, 17:35 | #1 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
Автоматическое уничтожение объекта
Как в своем классе сделать так чтобы его объект автоматически уничтожался, когда уничтожается родитель?
Код:
Пробовал унаследовать его от TControl TMyClass = class(TControl) и затем назначить родителя Parent:=ParentCtrl; эта строка вызывает ошибку при выполнении, присваивание свойству Owner:=ParentCtrl; ошибки не вызывает но и не работает, Destroy не вызывается.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 24.06.2008 в 17:40. |
24.06.2008, 17:57 | #2 |
Форумчанин
Регистрация: 22.11.2007
Сообщений: 224
|
В деструктор MyTab(ParentCtrl) добавить строчку MyClass.Destroy.
Если таковых не 1, а больше, можно просто перебрать все компоненты и посмотреть на (Owner=ParentCtrl) и класс. |
24.06.2008, 19:38 | #3 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Если наследовать от TControl, то так:
Код:
Последний раз редактировалось alexBlack; 24.06.2008 в 20:28. |
25.06.2008, 20:19 | #4 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
alexBlack, так Destroy автоматически вызывается, но... Опять ошибка в ntdll
У меня уже каша в голове от этих Owner, Parent и прочего. Вобщем опишу задачу, к-рую хочу реализовать: есть свой класс, в нем таймер и пэйнтбокс, ну и другие нужные мне свойства. Объекты этого класса создаются динамически. Родителем (пэйнтбокса как минимум) должен быть TTabSheet (это обязательно, на нем они отображаются) остальное не ясно, кто должен быть родителем (Parent), владельцем (Owner) моего объекта, объектов (таймер и прочие) внутри моего? Как вообще правильно реализуется этот механизм автоматического освобождения? p.s. Я тут подумал, можно убрать все мое из конструктора, и вынести в метод, и вызывать следом за созданием объекта этот метод и передать в него что нужно. А конструктор сделать стандартный каким он должен быть, может так будет лучше?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 25.06.2008 в 20:29. |
25.06.2008, 20:55 | #5 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
В первый раз просмотрел:
Код:
Код:
Кстати, кто уничтожает TabSheet ? С этим то-же могут быть проблемы. В методах MyClass этого делать не желательно. Лучше отправить сообщение форме чтобы она уничтожила. Последний раз редактировалось alexBlack; 25.06.2008 в 21:09. |
25.06.2008, 22:09 | #6 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
alexBlack, Спасибо большое.
Уже потихоньку своим ходом приблизительно до такого же варианта дошел, с помощью исходников VCL (делал по аналогии как там) и метода тыка. Первая ошибка у меня была: при создании владельцем указывал форму а родителем вкладку, из-за этого и была ошибка в ntdll. Вторая ошибка: вызывал Free сам в деструкторе, но тут меня удивило, везде пишут что Free проверяет объект или он не nil, не ожидал что ошибку вызовет, даже если не нужно оно там. Кстати они и не были nil, я проверил, значит ошибка была из-за повторного вызова Free. Еще небольшой вопрос про это: Timer := TTimer.Create(nil); не встречал раньше такого. Я туда того же владельца передавал, что и пэйнтбоксу, работает. Есть ли какая существенная разница, или можно и так и так?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
25.06.2008, 22:25 | #7 | |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Цитата:
Просто объект внутри класса. Указываем, что у него нет владельца и сами потом освобождаем. Второй вариант - указываем владельца TTimer.Create(aOwner) и освождать будет владелец. Просто мне видится более корректным если объект инкапсулирован в классе, то и управлять им должен этот класс, не зачем передавать его другому владельцу. С TPaintBox так не получается, т.к. он будет отображаться, поэтому владельцем указываем панель. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Создание/уничтожение объектов | nimf | Общие вопросы Delphi | 10 | 14.04.2008 10:54 |
Автоматическое перемещение | Kirik | JavaScript, Ajax | 4 | 16.11.2007 17:42 |
Уничтожение окна | Kashp | Win Api | 20 | 07.09.2007 14:15 |
Автоматическое сохранение | AndreichSB | Microsoft Office Access | 1 | 03.01.2007 23:15 |