Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];




Вниз

Заставка к проге 


Eduard   (2002-02-11 11:51) [0]

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

Код потока:

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, и вылазит, соответственно вместе с главной формой проекта. Как сделать так, чтобы она отображалась и исчезала вовремя, а также корректно перерисовывалась ?



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

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



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

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



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

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



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

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



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

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



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

>> pasha_golub

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



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

> Eduard © (11.02.02 14:01)

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

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

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



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

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;
и не гемороимся



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


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

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.014 c
1-90595           OneGoldFish           2002-02-12 14:32  2002.02.28  
IDE. Как Component Pallete сделать MultiLine?


6-90629           Станислав             2001-12-10 15:47  2002.02.28  
IP-адресс


3-90518           СергейМНК             2002-02-04 06:15  2002.02.28  
Как сделать чтобы выскакивал LoockUp список при начале набора текста в DBGrid в LoockUp поле


3-90490           YurikKuk              2002-02-04 03:56  2002.02.28  
Настройка BDE


1-90610           новенький в Делфи     2002-02-12 22:15  2002.02.28  
Проблемы с Random в Delphi6