Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отловить запуск и завершение. [D6, Win2k, WinXP]


Страницы:   1 2

V-A-V ©   (2005-09-07 10:35:00) 

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


Digitman   (2005-09-08 08:48:00) [1]


> V-A-V ©   (08.09.05 08:45) [24]


> Для этого есть неплохие сохранители из RxLib


да причем здесь "сохранители"-то ?!

речь-то идет о получении управленияв моменты окончания создания формы и перед ее разрушением ..


V-A-V   (2005-09-08 08:45:00) [2]

>а завтра тебе захочется сохранять/восстанавливать настройки еще каких-нть компонентов кроме грида ...
что, опять будешь изобретать их наследников ?

Нет не захочется. Для этого есть неплохие сохранители из RxLib...


Digitman   (2005-09-08 08:24:00) [3]


> надо писать не наследника формы, а в моем случае, наследника
> грида


а завтра тебе захочется сохранять/восстанавливать настройки еще каких-нть компонентов кроме грида ...
что, опять будешь изобретать их наследников ?


V-A-V   (2005-09-08 07:46:00) [4]

Спасибо всем за исчерпывающую информацию.
Убедили Вы меня, в написании наследника, но только я думаю надо писать не наследника формы, а в моем случае, наследника грида, это будет актуальнее.


Юрий Зотов   (2005-09-07 23:28:00) [5]

> V-A-V

Если на форме лежит Ваш компонент и еще другие, то:

1. Как только форма при своем уничтожении начнет удалять первый же из этих компонентов, она оповестит об этом остальные компоненты - в том числе, и Ваш тоже. Значит, перекрыв в своем компоненте метод Notification, можно поймать начало разрушения формы.

2. Как только форма полностью загрузится из DFM, она начнет вызывать метод Loaded всех своих компонентов - в том числе, и Вашего тоже. Значит, перекрыв в своем компоненте метод Loaded, можно поймать окончание загрузки формы.

Но если Owner'ом Вашего компонента будет не форма, то ничего этого не произойдет. Поэтому все же лучше сделать не компонент, а форму. В ней надо перекрыть методы DoCreate и DoDestroy (или AfterConstruction и BeforeDestruction), а саму форму поместить в репозиторий и просто наследовать другие формы от нее. Вот это будет вполне надежное решение.


Юрий Зотов   (2005-09-07 22:28:00) [6]

> V-A-V ©   (07.09.05 15:43) [14]

> если правильно "вешаться" на них, обрабатывать и возвращать
> назад.

А вот этого-то как раз и не получится. Юзер назначает свои обработчики в run-time (притом вполне законно, ничего неправильного в этом нет, ничто не мешает и не запрещает ему так сделать) - и привет горячий. Приплыл Ваш компонент.


Silver...   (2005-09-07 18:44:00) [7]


> Digitman ©   (07.09.05 14:46) [12]

Помнится мне тоже такой совет давали когда боролся с этой проблемой. Но мне лично такой подход не понравился.
 Да и повод был: Над проектом работал не только я некоторые модули делались людьми с которыми и поговорить/договориться небыло как. Как заставить их:


> все формы приложения отныне наследуй от TMyForm.


да и куча всего уже было сделано; заставить их переписывать

 Хотелось Ловить сообщение или что нить иное о создании/убивание формы (не по таймеру проверять FormCount), тогда мудрить, договариваться и заставлять кого-нибудь отныне...


Erik1   (2005-09-07 16:27:00) [8]

Да нехорошо на событиях висеть и как раз описаный подход с наследником спасает от этой проблемы. Даже компонент ненадо писать, хватит и обычного модуля.


Digitman   (2005-09-07 16:02:00) [9]


> V-A-V ©   (07.09.05 15:55) [16]


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


V-A-V   (2005-09-07 15:55:00) [10]

> Ну ну, ты видел реализацию свойства OnShow?

Да, конечно.
Сначала сохраняешь ссылку на него, затем отрабатываешь свое и восстанавливаешь чужое, при этом отрабатывая его.
И все это нужно только один раз.


Anatoly Podgoretsky   (2005-09-07 15:49:00) [11]

V-A-V ©   (07.09.05 15:43) [14]
Ну ну, ты видел реализацию свойства OnShow?


V-A-V   (2005-09-07 15:43:00) [12]

> ... и теперь пользователь этого компонента, не подозревая о таком коварстве, назначил свои обработчики OnShow и OnDestroy формы.

а произойдет то что пользователь напишет в этих обработчиках, если правильно "вешаться" на них, обрабатывать и возвращать назад.


Юрий Зотов   (2005-09-07 15:01:00) [13]

> V-A-V   (07.09.05 12:18) [7]

> Я написал свой компонент, который вешается на OnShow и
> OnDestroy формы и...

... и теперь пользователь этого компонента, не подозревая о таком коварстве, назначил свои обработчики OnShow и OnDestroy формы.

Что произойдет?


Digitman   (2005-09-07 14:46:00) [14]

о нужном моменте в своей "жизни" форма должна известить сама.

сделай класс TMyForm (наследника TForm), перекрой там методы AfterConstruction и BeforeDestruction, в телах перекрытых тобой методов посылай окну Application.Handle предопределенное тобой сообщение с параметром-ссылкой на объект-форму, которая посылает сообщение

все формы приложения отныне наследуй от TMyForm.

в обработчике Application.OnMessage лови это сообщение и твори с формой, переданной параметром сообщения, все что твоей душе угодно


V-A-V   (2005-09-07 13:41:00) [15]

> Не надо глобально, надо в момент создания и уничтожения конкретной формы и только для этой формы.

а как узнать, что она только что создалась и как узнать, что она собралась убиваться и все это глобально?


Anatoly Podgoretsky   (2005-09-07 13:30:00) [16]

Не надо глобально, надо в момент создания и уничтожения конкретной формы и только для этой формы.


Silver...   (2005-09-07 13:08:00) [17]

Когда-то я занималя этим вопросом. Так и не доработал как хотел (времени небыло), итог в каждой форме вызов нужной Proc :((.

 Думал сделать иначе: Ловить Момент создания/удаления Формы Ток глобально (в одном месте)- тут ставить/запоминать настройки.
 Вот тока загвоздка в :"Ловить Момент создания/удаления Формы глобально"

 Я так понимаю в Applicationинкрементируется декрементируется FormCountв этот момент но как ловить?

если кто знает напишите и мне: 2_s_i_l_v_e_r@mail.ru (без '_')


Digitman   (2005-09-07 12:53:00) [18]


> Ладно опишу задачу конкретнее


ну спасибо за одолжение !)


> сохраняет(загружает) .. гридов в файл


сделай по-иному : в процедуре ReadSettings() считывай настройки из файла в память, а в WriteSettings() записывай настройки из памяти в файл

а в своем компоненте лови свои гриды и читай/записывай их настройки в той самой памяти, с которой работают упомянутые процедуры


V-A-V   (2005-09-07 12:18:00) [19]

Ладно опишу задачу конкретнее. Я написал свой компонент, который вешается на OnShow и OnDestroy формы и обходя все компоненты, отлавливает гриды и сохраняет(загружает) настройки гридов в файл.
Так вот хотелось-бы, чтобы не на каждую форму бросать этот компонент, а использовать один на все приложение, чтобы он при запуске (завершении) отлавливал все гриды и сохранял (восстанавливал) их настройки....


Digitman   (2005-09-07 12:07:00) [20]

это можно сделать, например, так:

1. в dpr

procedure MyExitProc;
begin
 WriteSettings(..);
end;

begin
ExitProcessProc := @MyExitProc;
Application.Initialize;
...
Application.Run;
end;

2. в модуле главной формы

...
initialization
 ReadSettings(..);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо