Форум: "Основная";
Текущий архив: 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.038 c