![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Illusion Dolphin |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Есть проект, в нём много форм. Было решено чтобы формы реализовывали интерфейсы и доступ к формам был через интерфейсы. Внешне это выглядит так:
И использование вот такое:
Форма, реализующая IRequestPasswordForm - модальная, и по закрытю формы она освобождается:
Всё даже работало(хотя не должно было) до сегодня. Получается интереснейший баг: Password := RequestPasswordForm.ForImage(FileName); - срабатывает прекрасно, после этой строки форма уничтожается сама end; <-- а тут получается очень плохо :( Делфи видит, что интерфейс выходит из области видимости и делает ему _Release, но объет уже не существует, получаем ошибку доступа. Был вариант по закрытию окна его прятать и считать самостоятельно число ссылок через _AddRef _Release, но они реализованы в TComponent и они не виртуальные - т.е. я не могу их дописать. Есть ли идеи как оставить такую красоту как "Password := RequestPasswordForm.ForImage(FileName);" и избежать проблемы со счётчиком ссылок? Заранее спасибо! -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||||||
|
|||||||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
И чем не вариант? только зачем что-то там самостоятельно считать? Скрыли форму, как интерфейс выйдет за пределы видимости, форма уничтожится... -------------------- There are always someone smarter than you... |
|||
|
||||
| Illusion Dolphin |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Я плохо выразился. TForm уже имплементирует IInterface, эта реализация сделана в TComponent, её-то я и думал использовать, но не смог т.к. методы (_AddRef _Release) не виртуальные. Сейчас я второй раз реализую интерфейc IInterface в моей форме:
Я только не в курсе, корректно ли это - 2 раза один и тот же интерфейс реализовывать - не будет ли в будущем проблем? -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
хм, а если класс, реализующий твой интерфейс для формы, наследовать не от TForm, а от TInterfacedObject, а внутри уже просто создавать/прибивать форму?
-------------------- There are always someone smarter than you... |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Это будет работать конечно, но не хотелось бы плодить ненужные сущности. Моя вторая имплементация интерфейса - работает, я в ней вызываю те же методы, что и первая реализация (благо они protected). Просто вопрос в том, как делфи работает если 2 раза реазилуется один и тот же интерфейс, не будет ли потенциально какой-нибудь ошибки, о которой я не знаю? P.S. Пока что я подумал - и вроде бы всё корректно должно быть, но так бы хотелось чтобы кто-нить подтвердил моё предположение... Это сообщение отредактировал(а) Illusion Dolphin - 8.11.2012, 10:39 -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
работает до тех пор, пока владелец формы не попытается ее уничтожить, уже после удаления при достижении счетчиком ссылок нуля
можно обойти вызов _Release сделав как-то так
Это сообщение отредактировал(а) bems - 15.11.2012, 12:38 -------------------- Обижено школьников: 8 |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Этого я и пытаюсь избежать - слишком неудобно. В итоге остановится на том, что когда мой счётчик ссылок выходит на ноль, я делаю Release, что безопасно осбовождает форму через сообщение - в этом случае, вроде как, теоретически, не будет AV. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Если комовское управление памятью мешает, то я делаю свои виртуальные AddRef и Release которые возвращают значения соответственно 2 и 1 всегда, а внутри ничего не делают, а объект уничтожаю сам. С точки зрения COM такое поведение вполне корректно, получается так как если бы создавалась своя внутренняя копия указателя, которая уничтожается в нужное тебе время.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
реализация этих методов у TComponent что-то такое и делает да, посмотрел сейчас, при уничтожении компонента он сообщает об этом владельцу. Не пойму откуда я взял что это проблема. Видимо когда-то очень давно в какой-то очень старой версии так оно и было -------------------- Обижено школьников: 8 |
|||
|
||||
| lomaster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 27.5.2012 Репутация: нет Всего: 2 |
А зачем делать Action := caFree;?
|
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Это означает что после закрытия форма будет безопасно уничтожена. caHide - просто спрятана и может быть ещё потом показана итд. Добавлено через 2 минуты и 44 секунды В моём финальном решении caFree нету, это было одной из причин проблемы в такой архитектуре. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| lomaster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 27.5.2012 Репутация: нет Всего: 2 |
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
А зачем в этой задаче вообще интерфейсы?
-------------------- Обижено школьников: 8 |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Было много зависимостей между формами, убирал зависимости между модулями, в том числе и циклические. Пытался черпануть идеологию из DI/IoC (на .net MVC модная штуковина). Это сообщение отредактировал(а) Illusion Dolphin - 17.11.2012, 14:05 -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |