Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

Заставка - ход загрузки программы   Найти похожие ветки 

 
***_Diman_***   (2005-08-08 12:05) [0]

Здраствуйте, Уважаемые!
Пишу прогу, прога загружается долго - грузит справочники. В этот момент ессно непонятно то ли прога сдохла то ли всё-таки работает, нужна в общем заставочка показывающая ход загрузки, индикатор живости программы. Пожалста подскажите как такое реализовать, лучше пните туда где пример лежит, очень нужно. Заранее спасибо.


 
dmitry501 ©   (2005-08-08 12:16) [1]

http://delphiworld.narod.ru/base/create_splash.html


 
Slym ©   (2005-08-08 15:17) [2]

dmitry501 ©   (08.08.05 12:16) [1]
Сам то читал? Там только GUI...

Открывать ВСЕ справочники в момент загрузки приложения плохой тон... Все должно быть On demand!


 
***_Diman_***   (2005-08-09 10:01) [3]

нда. у меня загрузка в WM_CREATE происходит, сильно надо чтобы сразу грузились все справочники. пытался ещё окно создать и вытолкнуть его раньше основного (с каким-нить прогресс баром) - ни в какую. извиняйте что не уточнил что такая фича именно на апи нужна. как быть?


 
Юрий Зотов ©   (2005-08-09 10:16) [4]

Если нужно на API, то как быть? Очевидно, так и быть - написать на API окно с картинкой, всякими там копирайтами, прочими надписями и прогрессбаром (можно рисованным). Поскольку такое окно нужно только при загрузке программы, есть смысл поместить его в DLL. Еще желательно, чтобы оно работало в отдельном потоке, иначе может плохо перерисовываться.

Основная программа должна загрузить DLL и показать это окно, а в процессе загрузки периодически посылать ему сообщение, передавая в его параметрах процент готовности. Получив это сообщение, окно обновляет прогрессбар, а в конце загрузки основная программа закрывает окно и выгружает DLL.


 
Leonid Troyanovsky ©   (2005-08-09 11:21) [5]


> Юрий Зотов ©   (09.08.05 10:16) [4]

> такое окно нужно только при загрузке программы, есть смысл
> поместить его в DLL. Еще желательно, чтобы оно работало
> в отдельном потоке, иначе может плохо перерисовываться.


Зачем dll? Там кода - копейки (если описание окна в ресурсе).
Зато ничего не потеряется (да и грузить, выгружать время требуется).

И вот еще, что желательно не потерять - это  фокус ввода после
окончания цикла обработки сообщений в этом потоке.
Т.е., SetForegroundWindow(Application.Handle).

--
Regards, LVT.


 
Юрий Зотов ©   (2005-08-09 11:52) [6]

> Leonid Troyanovsky ©   (09.08.05 11:21) [5]

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

В общем, делал я когда-то именно такой сплэш - DLL получилась более 600 кб. Естественно, именно из-за картинки (24-битный битмап размером 500х400), самого кода там всего-то килобайт на 20.

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


 
msguns ©   (2005-08-09 12:04) [7]

>Юрий Зотов ©   (09.08.05 11:52) [6]

Это, конечно, профессиональное решение, но в данном случае, возможно, овчинка выделки не стоит ?

По сабжу. Главной формой надо сделать форму-заставку. Реальную Главную форму сделать в дизайне невидимой и в ее OnCreate отображать прцесс загрузки (прогресс бары, вспомогательные сообщения и т.д. на форме-заставке).
По окончании загрузки справочников показать Гл.форму и передать ей фокус.


 
Юрий Зотов ©   (2005-08-09 12:23) [8]

> msguns ©   (09.08.05 12:04) [7]

> возможно, овчинка выделки не стоит?

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

> Главной формой надо сделать форму-заставку

И тогда при ее закрытии... приложение завершится. Чтобы этого не произошло, придется динамически переназначать свойство Application.MainForm, а оно ReadOnly. Поменять его все же можно (поскольку оно имеет прямой метод доступа по чтению), но прием этот, можно сказать, полухакерский. Я бы не рекомендовал.


 
TUser ©   (2005-08-09 12:31) [9]

> Еще желательно, чтобы оно работало в отдельном потоке, иначе может плохо перерисовываться.

Вашими бы устами - да Delphi писать. И не только его - ПО-писатели обычно не желают грузить систему доп. потоком, и забивают на прорисовку.


 
Игорь Шевченко ©   (2005-08-09 12:34) [10]

Program Files\Borland\Delphi\Demos\Db\mastapp\mastapp.dpr


 
Юрий Зотов ©   (2005-08-09 12:38) [11]

> TUser ©   (09.08.05 12:31) [9]

Обычно - да. Многие фирменные продукты (включая и саму Delphi) грешат плохой перерисовкой сплэша. Всегда обидно такое видеть. Ведь продукт действительно качественный, написан действительно профессионалами - ну что им стоило вытащить сплэш в отдельный поток? Для них это - тьфу, раз плюнуть, а впечатление о продукте было бы совсем другим. Ведь сплэш - это, можно сказать, визитная карточка, по ней складывается первое впечатление о качестве продукта.


 
Игорь Шевченко ©   (2005-08-09 12:39) [12]

Юрий Зотов ©   (09.08.05 12:38) [11]

А я вот честно не понимаю, зачем нужен отдельный поток :)


 
Leonid Troyanovsky ©   (2005-08-09 12:49) [13]


> Игорь Шевченко ©   (09.08.05 12:39) [12]

> А я вот честно не понимаю, зачем нужен отдельный поток :)


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

Чего нам для юзера одного потока жалко? :)
Если уж и OpenDialog себе позволяет, не говоря уж о авишках.

--
Regards, LVT.


 
Юрий Зотов ©   (2005-08-09 12:50) [14]

> Игорь Шевченко ©   (09.08.05 12:39) [12]

Запусти, например, справку. Потом запусти, например, Delphi - появится сплэш. Пока идет загрузка Delphi, повози окном справки по окну сплэша и посмотри, как идет его перерисовка. Кому как, а мне такое ОЧЕНЬ не нравится.

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


 
Игорь Шевченко ©   (2005-08-09 12:52) [15]

Leonid Troyanovsky ©   (09.08.05 12:49) [13]

А как заставка должна реагировать на действия пользователя ? :)

С другой стороны, если процесс инициализации настолько долог, что пользователь успевает заскучать, то, наверное имеет смысл пересмотреть процесс инициализации ? Например не инициализировать все сразу :)


 
Leonid Troyanovsky ©   (2005-08-09 12:53) [16]


> Юрий Зотов ©   (09.08.05 12:23) [8]

> > Главной формой надо сделать форму-заставку
>
> И тогда при ее закрытии... приложение завершится. Чтобы
> этого не произошло, придется динамически переназначать свойство
> Application.MainForm, а оно ReadOnly. Поменять его


Заставку, конечно, не надо делать главной.
Т.е., достаточно TFormSplash.Create(nil)

--
Regards, LVT.


 
Игорь Шевченко ©   (2005-08-09 12:55) [17]

Юрий Зотов ©   (09.08.05 12:50) [14]

Вот если те же действия проделать с Word, Excel или Visual C, то поведение сплэша такое же, как и в Delphi. Я бы не сильно утверждал, что эти программы писали непрофессионалы.


 
TUser ©   (2005-08-09 12:55) [18]

> Юрий Зотов ©   (09.08.05 12:38) [11]

Не знаю - по мне лишь бы работало, а красиво ли оно отрисовывается не столь важно. Не думаю, что Delphi менее популярна, чем VS из-за неперерисовки сплеша :)


 
Leonid Troyanovsky ©   (2005-08-09 12:56) [19]


> Игорь Шевченко ©   (09.08.05 12:52) [15]
> Leonid Troyanovsky ©   (09.08.05 12:49) [13]
>
> А как заставка должна реагировать на действия пользователя
> ? :)


Ну, хотя бы, таскаться мышкой, или чем-то, что у него в руках.

--
Regards, LVT.


 
Юрий Зотов ©   (2005-08-09 12:57) [20]

> Игорь Шевченко ©   (09.08.05 12:55) [17]

См. [11]. Добавить к этому мне нечего.


 
Юрий Зотов ©   (2005-08-09 13:06) [21]

> Игорь Шевченко ©   (09.08.05 12:52) [15]

> С другой стороны, если процесс инициализации настолько долог,
> что пользователь успевает заскучать, то, наверное имеет смысл
> пересмотреть процесс инициализации? Например не
> инициализировать все сразу :)

Инициализация eE-enterprise может длиться и полминуты, и даже намного более (зависит от производительности и загруженности сети, а уж при удаленном соединении с сервером через модем... сам понимаешь). При этом инициализируется только то, без чего ну никак не обойтись. Пересматривать уже нечего.

В основном, по этой причине и был написан такой сплэш. Песня, а не заставка получилась.


 
Игорь Шевченко ©   (2005-08-09 13:14) [22]

Юрий Зотов ©   (09.08.05 13:06) [21]

Так мы с тобой об этом в прошлый понедельник говорили :)

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


 
Юрий Зотов ©   (2005-08-09 13:26) [23]

> Игорь Шевченко ©   (09.08.05 13:14) [22]

> инициализация от его действий быстрее не выполнится.

Не выполнится, факт. Но... снова см. [11]. Я ни в коем случае не ставлю себя на одну доску с MS или Borland, но и не считаю, что должен следовать их плохим (ИМХО) примерам.

Считаю, что должен следовать их хорошим примерам (благо, что таких предостаточно). Еще считаю, что качество должно быть. И максимальным. И везде, даже в мелочах.

Вот такая позиция. Можно с ней соглашаться, можно не соглашаться, но спорить по этому поводу смысла, видимо, нет.


 
ANB ©   (2005-08-09 14:35) [24]

А еще можно Create главной формы перекрыть. Тоже работает.


 
Eraser ©   (2005-08-09 14:41) [25]

Юрий Зотов ©   (09.08.05 11:52) [6]
Кода там действительно копейки, но если уж делать сплэш, то есть прямой смысл делать его с хорошей картинкой - а вот она уже может весить совсем не копейки.

В общем, делал я когда-то именно такой сплэш - DLL получилась более 600 кб. Естественно, именно из-за картинки (24-битный битмап размером 500х400), самого кода там всего-то килобайт на 20.


Для большого проекта, который распространяется на CD 600 Кб не критично, а вот для шароварщиков - лишние 600 Кб серьёзные затраты.
Тут ради экономии места можно картинку ZLib"ом сжать, а при загрузке - разжимать и загружать в TImage.


 
Eraser ©   (2005-08-09 14:43) [26]

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


 
den303 ©   (2005-08-09 14:46) [27]

Я в своё время делал отдельную программу-сплэш, которая запускала основную прогу и обменивалась с ней сообщениями для отображения загрузки ПрогрессБаром. Потом основная прога, загрузившись, отсылала сообщение о закрытии сплэш-проги. Кстати говоря, и номер версии от главной проги к сплэшу уходил через сообщения


 
***_Diman_***   (2005-08-09 15:41) [28]

>Юрий Зотов
dll не пойдёт. насчёт знания апи - прогу пишу но некоторые тонкости не всегда понимаю. регистрирую окна, в т.ч. и заставочное, окно судя по всему конечно создаётся :) а вот где именно вытолкнуть его наверх? в WndProc? и чем? SetForegroundWindow? на чистом апи редко доводилось воять, тем более окна, в основном только функционал программ - сами алгоритмы.


 
***_Diman_***   (2005-08-09 15:50) [29]

кстати небольшой аддон - прога для КПК (снова я со своими проблемами!) а там МНОГО чего нельзя... например отвратно рисуется графика, а как подшивать к проге ресурсы (банальная вещь!) я так и не понял - компилер для ARMV ресурсы в упор не видит... ну и чёрт с ним конечно. так что заставка должна быть по возможности самой простецкой - лишь бы оператор видел что прога ЖИВА, и кое-чего сообщает (типа справочник такой-то загружен и т.п.)


 
***_Diman_***   (2005-08-10 07:48) [30]

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


 
dmitry501 ©   (2005-08-10 07:51) [31]

***_Diman_***   (10.08.05 7:48) [30]
Ну вот... Написали аж 30 постов, а ты опять все сначала.... :)


 
Ольга   (2005-08-10 10:42) [32]


> заставка должна быть по возможности самой простецкой
> ни у кого примерчика нету?

Вот самый примитив. Привожу его только для того, чтобы показать, что там смотреть нечего - никаких закидонов. Main - главная форма, FirstForm - заставка.

procedure TMain.FormCreate(Sender: TObject);
begin
 FirstForm:=TFirstForm.create(application);
 FirstForm.Caption:="Электронный журнал v"+versionNumber;
 FirstForm.StaticText1.Caption:=" инициация параметров ...";
 FirstForm.Show;
 application.ProcessMessages;
 FirstForm.StaticText1.Caption:=" связь с SQL сервером ...";
 FirstForm.StaticText1.Repaint;
 ...
 FirstForm.StaticText1.Caption:=" загрузка графиков ...";
 FirstForm.StaticText1.Repaint;
 ...
 FirstForm.Close;
end;


 
Игорь Шевченко ©   (2005-08-10 12:21) [33]

Любите Demos - источник кода.



Страницы: 1 вся ветка

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.042 c
6-1116066766
DeadEliZe
2005-05-14 14:32
2005.08.28
Indy 10: idIRC - баги, исправления, вопросы


14-1122986522
Piter
2005-08-02 16:42
2005.08.28
Клавиатура от Артемия Лебедева не будет запатентована


8-1113384972
Fedor
2005-04-13 13:36
2005.08.28
Детектор движения


14-1123490694
Starcom
2005-08-08 12:44
2005.08.28
У кого есть русский мануал на цифровик Pentax Optio S40?


14-1123265414
Galiaf
2005-08-05 22:10
2005.08.28
Удалил случайно.