![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Gnus |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 22.11.2010 Где: СПб Репутация: нет Всего: нет |
Доброго времени суток.
Преамбула. Штатный проект в дельфи 6.
В главной форме при создании делаю следующее:
В обработчике сообщения WM_InitMain скрываю основную форму методом Hide и порождаю и показываю вторую форму.
Функция обратного вызова реагирует на состояние объекта и передает его состояние второй форме:
Вторая форма изменяет свое состояние в зависимости от состояния объекта: выводит сообщения об ошибках, показывает кнопки переподключения и выхода в случае ошибки соединения. В случае успешного подключения, эта форма уничтожается в приведенной выше функции, далее вызываются методы Show и Update главной формы. Все вроде работает, но: 1. При запуске до вызова Hide главная форма успевает "мигнуть" на экране. 2. Так же заметна "чехарда" с кнопками в панели задач. 3. После закрытия второй формы, главная оказывается не в фокусе. Что посоветуете? ПС: Обращаю внимание, что главная форма должна быть главной и порождаться первой, т.к. она порождает объект и содержит обработчик обратного вызова от этого объекта. Тестил Application.ShowMainForm := False в обработчике FormCreate: все работает без миганий, но вот при показе основной формы виснет намертво. ![]() |
||||||||
|
|||||||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Вариант создания и показа сплеш-скрина из Demos в стандартной поставке Дельфи (mastapp) чем не устроил?
-------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
Gnus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 22.11.2010 Где: СПб Репутация: нет Всего: нет |
Не устроил тем, что: 1. сплэш-форме передается указатель на объект, созданный главной формой, поэтому порождаться она должна после создания главной формы 2. сплэш-форма уничтожается по событию, обработанному главной формой. вобщем жизненный цикл сплэш-формы происходит после создания главной формы и вызова Application.Run С фокусом, кстати, разобрался при помощи PostMessage(Self.Handle, WM_SETFOCUS, 0, 0); Это сообщение отредактировал(а) Gnus - 20.3.2012, 17:00 |
|||
|
||||
Snowy |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
жизненный цикл сплэш-формы происходит ДО создания главной формы и вызова Application.Run Создается сплэшформа, показывается модально. Если mrOK, то создать главную форму и запустить Application. |
||||||
|
|||||||
Gnus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 22.11.2010 Где: СПб Репутация: нет Всего: нет |
Уважаемый Snowy!
Боюсь, Вы не прочли первый пост.
Это всё хорошо, но не надо считать эту форму сплэш-формой в классическом понимании заставки. Моя сплэш-форма позволяет пользователю сменить адрес устройства и произвести повторной подключение в случае неудачи связи. Также сплэш-форма имеет кнопку завершения работы приложения. Если подробно: есть dll, которая содержит функции связи с некоторым устройством. Сам канал связи может быть строго определенных состояниях: не соединено, соединяется, свободно, занято, ошибка, разъединено. Смена состояния осуществляет обратный вызов функции, определенной в главной форме. Адрес этой функции обратного вызова передается библиотечной функции Connect, которая также возвращает дескриптор экземпляра устройства. Так порождение библиотечного объекта и передача ему адреса функции обратного вызова происходит в главной форме, а функция обратного вызова в свою очередь информирует сплэш-форму о смене состояния объекта. Вопрос не в том, как показать сплэш-форму. Вопрос в том, как создать скрытую главную форму (без всяких миганий на экране) и при определенных условиях корректно ее показать. |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Форма - всего лишь отображение.
Совсем не стоит завязывать логику на интерфейс. Как раз наоборот. Логику нужно засунуть в отдельный модуль. Если требуется какая-то реакция на изменение логики, то для этого есть механизм событий. Как компромиссный вариант, могу предложить создать новую форму без заголовка, размером в 0 пикселей и сделать её главной. И уже из неё управлять остальными формами в том порядке, какой больше нравится. |
|||
|
||||
Gnus |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 22.11.2010 Где: СПб Репутация: нет Всего: нет |
Последовал советам. Получилось так: вначале порождаю девайс, потом порождаю и показываю сплэш-форму, говорю девайсу соединиться и жду закрытия сплэш-формы (она закрывается вручную пользователем при сбое связи или функцией обратного вызова при успешном установлении связи. в последнем случае выставляется свойство девайса OnLine в истину). Далее в зависимости от того, подключено устройство или нет, показываю главную форму или завершаю приложение:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |