Splash screen
14 отговора
420 прегледа
Splash screen
Правя си компонент за Splash screen. Нищо особено, извежда форма или картинка при стартиране на програмата. Обаче ми се ще, това да излиза преди зареждането и стартирането на главната програма. Така, както е в момента, програмата се зарежда изцяло и чак тогава се показва splash screen-a, което е малко тъпо. Някакви идеи?
Re: Splash screen
sloji taimer i pokaji splasha i na ontimer go skrii i pokaji main form
Re: Splash screen
Да, но идеята беше 1-во да се покаже splash-a и чак след това да започне зареждането в паметта на главната програма. Засега единственото за което се сещам е splash-a да седи в отделен loader, който след изобразяване да зарежда главната програма. Иначе се получава 10 сек. стържене по диска, и едновременно показване на splash-a и mainform на приложението.....
Погледни...
примера от MastApp - мисля, че Slash -а там е направен точно както го искаш.
\Delphi6\Demos\Db\MastApp
---
Е т'ва е живот!
\Delphi6\Demos\Db\MastApp
---
Е т'ва е живот!
Re: Splash screen
Като Component ще е малко сложничко....
Може би трябва при OnCreate да проверяваш, ако си в дизайн моде да модифицираш *.dpr. Там обаче има доста подмолни закачалки най-малката от които е добър парсер. Borland се отнася към това, като демократичен ревнивец към гаджето си - няма нищо против другите да го пипат, но винаги държи той да има последен думата при оправянето

Може би трябва при OnCreate да проверяваш, ако си в дизайн моде да модифицираш *.dpr. Там обаче има доста подмолни закачалки най-малката от които е добър парсер. Borland се отнася към това, като демократичен ревнивец към гаджето си - няма нищо против другите да го пипат, но винаги държи той да има последен думата при оправянето
Re: Splash screen
Доколкото разбирам, ако просто сложиш сплаша като маин форм , ще ти свърши работа. После скриваш сплаша и си показваш която форма те интересува.
Re: Splash screen
компонент за сплаш?!? - нямам идея, ама ако не е до компонента а само до сплаша:
Form1 - mai form-а на проложението.
Form2 се разкарва от "AoutoCreateForms', показва се в Form1.OnCreate и стой докато се върти глупавината в цикъла /това обикновенно е нещото което става преди да се появи Form1 на екрана/. после си я тресваш.
--------------------------------------
Започва Път от моят праг...
//-----------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
s : string;
fOdd, fEven : Integer;
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
Application.ProcessMessages;
fOdd := 0;
fEven := 0;
for i := 0 to 1000000 do begin
if (i mod 2) = 1 then begin
inc(fOdd);
end else begin
inc(fEven);
end;
s := Format('E: %d O: %d', [fEven,fOdd]);
end;
Form2.Free;
showmessage(s);
end;
//-----------------------------------------------------------------------
Form1 - mai form-а на проложението.
Form2 се разкарва от "AoutoCreateForms', показва се в Form1.OnCreate и стой докато се върти глупавината в цикъла /това обикновенно е нещото което става преди да се появи Form1 на екрана/. после си я тресваш.
--------------------------------------
Започва Път от моят праг...
Re: Splash screen
Проблема е, че докато главната форма бъде изведена, се изпълнява initialization на всички unit-и и Create на всички Auto-create форми, а дефакто това е самото зареждане. В това отношение Phantomas е дал добър пример.
Re: Погледни...
Да, така го искам и вече се бях досетил за нещо подобно, само че с код в initialization частта на първия деклариран модул (практически това е модула на главната форма). Това е първия код който се изпълнява въобще, разбира се, след някои глобални инициализации, извършвани от Delphi-то на заден план ... нещо, като това:
var
Form1: TForm1;
sf: TForm; // това е Splash формата
implementation
{$R *.DFM}
initialization
sf:=TForm.Create(Application);
sf.ShowModal; // В действителност трябва да е Show и после
// Hide преди да се покаже главната форма
end.
Re: Погледни...
ne e neobhodimo zadaljitelno da e wqrno "първия деклариран модул (практически това е модула на главната форма)"
------------------------------
I got a COMPILER, and I'm not afraid to use it!
------------------------------
I got a COMPILER, and I'm not afraid to use it!
Re: ?
Кое не е вярно - 1) че initialize на първия модул е първия код, който се изпълнява или 2) че модула на главната форма е първи?
1) пише го в документацията
2) така е на теория (by default), но наистина не е задължително ...
BTW, реализацията на задачката с компонент се усложнява именно поради причини, свързни с естеството на условието и начина на създаване (Create) на компонентите. Та затова, най-подходящото решение изглежда е да се напише клас и той да се имплементира и настройва ръчно. Вярно, че се губи удобството на Object Inspector и още някои други дреболии, но пък ще стане точно както го искам.

1) пише го в документацията
2) така е на теория (by default), но наистина не е задължително ...
BTW, реализацията на задачката с компонент се усложнява именно поради причини, свързни с естеството на условието и начина на създаване (Create) на компонентите. Та затова, най-подходящото решение изглежда е да се напише клас и той да се имплементира и настройва ръчно. Вярно, че се губи удобството на Object Inspector и още някои други дреболии, но пък ще стане точно както го искам.
Освен това...
...при много бързо зареждане слагам таймер, който се стартира при OnShow на MainForm и затваря splash screen (който е StayOnTop) след около 500 ms
Така има половин секунда през която и двете форми са на екрана.
Дали завиването на крушка е софтуерен проблем?
Така има половин секунда през която и двете форми са на екрана.
Дали завиването на крушка е софтуерен проблем?
Re: Splash screen
Нещата с компонент не са много приятни но може да се направи по следния начин с някаква форма, пък ако толкова искаш да е с компонент ще трябва да направиш OnCreate в Designtime да си добавя в dpr-то редът който ще видиш по долу:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls;
type
TForm2 = class(TForm)
ProgressBar1: TProgressBar;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure ShowSplash;
implementation
{$R *.dfm}
procedure ShowSplash;
var
Form2: TForm2;
begin
Form2 := TForm2.Create( Application );
try
Form2.ShowModal;
finally
Form2.Free;
end;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
ProgressBar1.Position := ProgressBar1.Position + 1;
if ProgressBar1.Position = ProgressBar1.Max then ModalResult := mrOK;
end;
end.
--------------------------------------------------------------------------------------------------
това е в dpr-то
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
ShowSplash; //<-------------------------
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Не всичко което виси е Windows, но той най-често го прави
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls;
type
TForm2 = class(TForm)
ProgressBar1: TProgressBar;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure ShowSplash;
implementation
{$R *.dfm}
procedure ShowSplash;
var
Form2: TForm2;
begin
Form2 := TForm2.Create( Application );
try
Form2.ShowModal;
finally
Form2.Free;
end;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
ProgressBar1.Position := ProgressBar1.Position + 1;
if ProgressBar1.Position = ProgressBar1.Max then ModalResult := mrOK;
end;
end.
--------------------------------------------------------------------------------------------------
това е в dpr-то
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
ShowSplash; //<-------------------------
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Не всичко което виси е Windows, но той най-често го прави
Re: За по-голяма точност...
...трябва да отбележа че 1) е първия потребителски код (написан от програмиста), защото преди неговото изпълнение, както казах и по-рано, Delphi-то изпълнява свой собствен подготвителен код.
Re: За по-голяма точност...
.......1) е първия потребителски код (написан от програмиста), защото преди неговото изпълнение, както казах и по-рано, Delphi-то изпълнява свой собствен подготвителен код
Започва да ми замирисва на шаманство
Всъщност няма нищо шаманско, нито пък някой (в т.ч. и делфито) те следи кой ще е първия код, който ще напишеш, нито пък има някаква разлика кое си е собствен код на делфито (вероятно имаш предвид Forms, който обикновено е първия модул в uses на *.dpr) и кое на програмиста.
Инициализацията си върви по рекурсия така, както е описана в uses на модулите започвайки от първия записан в *.dpr. Изключение се допуска само за "вградения" system.
Разместването им обаче не винаги е безпроблемно. Затова и ти писах (16.07.03 09:24), че Borland се отнася към това, като демократичен ревнивец към гаджето си - няма нищо против другите да го пипат, но винаги държи той да има последен думата при оправянето
И е естествено, че не можеш да покажеш форма (даже splash), преди да си инициализирал Forms
.........
И една корекция на горепосочения ми пост. OnCreate да се чете Create-ване
Лапсус

Започва да ми замирисва на шаманство
Всъщност няма нищо шаманско, нито пък някой (в т.ч. и делфито) те следи кой ще е първия код, който ще напишеш, нито пък има някаква разлика кое си е собствен код на делфито (вероятно имаш предвид Forms, който обикновено е първия модул в uses на *.dpr) и кое на програмиста.
Инициализацията си върви по рекурсия така, както е описана в uses на модулите започвайки от първия записан в *.dpr. Изключение се допуска само за "вградения" system.
Разместването им обаче не винаги е безпроблемно. Затова и ти писах (16.07.03 09:24), че Borland се отнася към това, като демократичен ревнивец към гаджето си - няма нищо против другите да го пипат, но винаги държи той да има последен думата при оправянето
И е естествено, че не можеш да покажеш форма (даже splash), преди да си инициализирал Forms
.........
И една корекция на горепосочения ми пост. OnCreate да се чете Create-ване
Лапсус