Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
***_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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.039 c
1-1123492939
a80h19
2005-08-08 13:22
2005.08.28
скопировать объекты-классы


1-1123168331
Wild User
2005-08-04 19:12
2005.08.28
Ищется Grid


3-1121338260
Леонид
2005-07-14 14:51
2005.08.28
Узнать и передать значение если запись с пометкой на удаление...


1-1123521771
Андрей Молчанов
2005-08-08 21:22
2005.08.28
TStringList.AddObject


4-1121334928
IceBeerg
2005-07-14 13:55
2005.08.28
Установка даты.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский