![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
shmelina |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Добрый вечер.
Для лучшего понимания проблемы упрощаю ситуацию. Есть некий класс. При создании объекта этого класса создается форма. Нужно, чтобы, при закрытии пользователем этой формы удалялся и класс. Что-то у меня не получается просто решить эту задачу. Все какие-то сборщики мусора в голову лезут. Подскажите правильное решение. Вот код класса:
Нужно, чтобы при закрытии пользователем формы (Form), удалилась (.Free) и форма (Form) и класс (Modul). |
|||
|
||||
RomanEEP |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
1 метод: TModul = class(TForm) - если это конечно возможно
2 метод: TModul = class(TInterfacedObject) |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Т.е. ты хочешь это проделать, не взаимодействуя с другими объектами? Можешь создавать отдельный поток для вызова Free своего класса. Но согласись, что это изврат и не нужная возможность. Всего лишь для создания формы плодить свой класс вроде как не имеет смысла - форма и так умеет самоуничтожаться. Смотри как это делается в реализации TFOrm(TCustomForm), TThread, -------------------- |
|||
|
||||
shmelina |
|
||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Не хотелось бы. TModul - это базовый класс. От него наследуются разные потомки. И придется для каждого такого потомка создавать форму, т. к. компилятор будет требовать {$R *.dfm}. Кривовато это.
С этим не знаком еще.
Можно и взаимодействовать. Я не против. Лишь бы реализация правильная была с точки зрения ООП. Например, всеми этими TModul управляет контейнер:
Согласен. Вот и обращаюсь за помощью. У меня пока есть идея примерно такая: - скрывать форму - ставить флаг, что объект должен быть уничтожен - и при любом следующем обращении к контейнеру (создан/удален TModul) грохать объект. Т.е. объект будет уничтожаться какбы с задержкой. Сложно как-то :(.
Согласен, но с формой тоже по-дурацки выходит. |
||||||||||||
|
|||||||||||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Ну так если есть владелец - пусть он и отвечает за уничтожение дочерних объектов - так большинство классов реализовано в Delphi. Твой контейнер пусть создаст невидимое окно, которое будет сообщения принимать, все дочерние объекты будут посылать сообщения окну, а контейнер обрабатывать. -------------------- |
|||
|
||||
shmelina |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Тут ситуация немного другая. Если бы у меня TModul = class(TForm), то проблем бы не было. А у меня TModul создает TForm. Т.е. я создаю объект1, а он создает объект2. При событии в объект2 (форма закрывается крестиком) нужно удалить и объект1 и объект2. |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Ты ж выше написал сам про TModulList, который владельцем является. и
Зачем плодить 2 объекта вместо одного? -------------------- |
|||
|
||||
RomanEEP |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
метод3:
|
|||
|
||||
Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Для уничтожения любых объектов можно предложить простейший класс:
Пример использования:
-------------------- |
||||
|
|||||
shmelina |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Мне не нужно, чтобы TModul был наследником TForm. RomanEEP, вы в методе объекта предлагаете уничтожить сам объект. Это не хорошо.
Еще не хорошо, что модуль знает о форме, а форма о модуле. Не нравится что и форма и модуль отдельно объявлены. И наследовать потом сложно будет. И в каждом юните наследника форму пустую таскать. В общем не то это. Должен быть модуль и он должен создавать форму. Программа пишется так, что форм в ней вообще нет. Все создается динамически. Весь GUI-интерфейс описан в БД. Демо, вам отвечу позже - убегаю. Но хотелось бы обойтись без сообщений. |
||||
|
|||||
RomanEEP |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
не надо путать метод с обработчиком события. Вызвать удаления объекта в последней строчке метода, вызываемого ИЗВНЕ безопасно на 100% Так ведь никто не мешает объявить
и все успешно друг о друге забудут)) навсегда))) Асинхронный вызов который предложил Демо - хороший способ, но FModul будет удален не скоро после закрытия формы, т.е какое-то время программа будет в состояни когда модуль еще есть, а форма уже тютю и в отладке сообщения не айс конечно |
||||
|
|||||
shmelina |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
А какая разница? Обработчик - это частный случай метода.
Не уверен, что это безопасно. Ты вызываешь Free, управление программой переходит в метод Free, там объект уничтожается, затем идет возврат из процедуры Free в метод FormFreed, которого уже нет, т. к. объект освобожден.
Так тоже не хорошо. Форма в принципе не должна ничего знать о TModul. Это плохой стиль программирования. Там как-то сложно все. Да еще и с сообщениями. Да еще и форма от модуля отделена. В юните не должно быть объявленных форм. |
||||
|
|||||
shmelina |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Я кажется понял что мне нужно.
У формы есть событие OnClose. В нем есть параметр var Action: TCloseAction. Если присвоить ему Action := caFree, то форма уничтожится сама! Как это происходит: В TCustomForm.Close вызывается Release. Сам Release выглядит так: PostMessage(Handle, CM_RELEASE, 0, 0); Форма обрабатывает это сообщение так: Free. Т.е. с помощью PostMessage сообщение ставится в очередь (сразу не вызывается!) и обрабатывается так:
У меня два вопроса: 1. Действительно безопасно уничтожать самого себя через сообщение? 2. Как нечто подобное сделать в моем случае (применительно в TModul)? Слабовато у меня с сообщениями. Это сообщение отредактировал(а) shmelina - 10.1.2010, 20:49 |
|||
|
||||
Демо |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Тебе про это, по-существу, с первых сообщений намекали.
Да.
Я ж тебе привёл пример именно такого класса. Регистрируешь в нём ЛЮБОЙ свой объект, а уничтожаешь именно через него. -------------------- |
||||||
|
|||||||
shmelina |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Т.е. прикинуться окном?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |