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

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

Заставка к проге [D6, WinXP]


Eduard ©   (2002-02-11 11:51:00) 

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

Код потока:

type
TSplashThread = class(TThread)
destructor Destroy; override;
private
procedure ShowSplash;
protected
procedure Execute; override;
end;

implementation uses uSplash;


var SplashForm: TSplashForm;

{ TSplashThread }

destructor TSplashThread.Destroy;
begin
if SplashForm <> nil
then
begin
SplashForm.Hide;
SplashForm.Free;
end;
inherited;
end;

procedure TSplashThread.Execute;
begin
repeat
Synchronize(ShowSplash);
until Terminated;
end;

procedure TSplashThread.ShowSplash;
begin
SplashForm := TSplashForm.Create(nil);
SplashForm.Position := poScreenCenter;
SplashForm.Show;
SplashForm.Update;
end;

end.


Код проекта:

SplashThread := TSplashThread.Create(False);
SplashThread.Priority := tpIdle;
SplashThread.FreeOnTerminate := False;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
SplashThread.Terminate;
SplashThread.Free;
Application.Run;


Так вот, почему-то заставка появляется только после выполнения команды Application.Run, и вылазит, соответственно вместе с главной формой проекта. Как сделать так, чтобы она отображалась и исчезала вовремя, а также корректно перерисовывалась ?


Pete   (2002-02-11 16:47:00) [1]


Splash:=TSplash.Create(Application);
Splash.Show;
Splash.Update;
Sleep(2000);
Splash.Free;
.
.
.
Aplication.Run

И вообще лучше самому создавать и уничтожать формы, а не пользоваться AutoCreate и не забивать память. Вообщем, это мое мнение...


Станислав   (2002-02-11 16:43:00) [2]

Application.Initialize;
form11:=Tform11.create(application);
form11.show; // это и есть форма заставки
form11.update;
Application.Title := "Податкова накладна";
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm5, Form5);
Application.CreateForm(TForm4, Form4);
Application.CreateForm(Tfirmu, firmu);
Application.CreateForm(TForm13, Form13);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm8, Form8);
Application.CreateForm(TForm6, Form6);
Application.CreateForm(TForm7, Form7);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm9, Form9);
Application.CreateForm(TForm10, Form10);
Form11.close; // закрываем ее
Application.Run;
и не гемороимся


Юрий Зотов   (2002-02-11 16:02:00) [3]

> Eduard © (11.02.02 14:01)

Все правильно. Просто статья предназначалась для начинающих и я специально не стал усложнять ее, надеясь на обычный ProcessMessages.

Конечно, нормальный Splash должен работать в отдельном потоке. Но тогда придется обратиться к "чистому" API, поскольку VCL дает цикл выборки сообщений лишь для одного потока (в Application.Run).

Практически в проекте нужно написать оконную функцию и функцию потока. Последняя регистрирует класс окна, назначает ему эту оконную функцию, создает само окно и организует цикл выборки сообщений. Далее нужно просто вызвать CreateThread.


Eduard   (2002-02-11 15:42:00) [4]

>> pasha_golub

Недопонял. Поподробнее можно ?


pasha_golub   (2002-02-11 15:11:00) [5]

Событие onCreate вызывается до Application.Run!


Eduard   (2002-02-11 15:03:00) [6]

Ерунда это все. Надо, чтобы было по уму: чтобы заставка реально перерисовывалась, и удалялась именно в момент отображения главной формы приложения, или после этого (как в Photoshop). Кроме того, мне хочется разобраться с созданием потоков. Если кто знает, как отобразить заставку именно в потоке, перед выполнением Application.Run, помогите, плиз !!!


NY152   (2002-02-11 14:10:00) [7]

Может я чего не понял, но зачем для заставки так усложнять ?
У меня на OnCreate главной формы стоит код:
Splash:=TSplash.Create(Application);
Splash.Show;
Application.ProcessMessages;
Sleep(2000);
Splash.Free;
И всё работает как часы.... А на форму Splash вставляешь нужную картинку и делаешь её без границ... какие проблемы ???


Eduard   (2002-02-11 14:01:00) [8]

Читал я эту статейку. Проблема заключается в том, что заставка, выведенная таким образом, не будет перерисовываться при закрытии ее другими окнами. Надо, чтобы прорисовка и отображение заставки происходило именно в отдельном потоке. Есть какие-то мысли по этому поводу ?


BlankAlex   (2002-02-11 12:22:00) [9]

Посмотри на королевсиве Delphi - Hello world, статья "Обобщающие примеры работы с WinAPI"


Наверх

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