Splash screen

14 отговора 420 прегледа
#1

Splash screen

Правя си компонент за Splash screen. Нищо особено, извежда форма или картинка при стартиране на програмата. Обаче ми се ще, това да излиза преди зареждането и стартирането на главната програма. Така, както е в момента, програмата се зарежда изцяло и чак тогава се показва splash screen-a, което е малко тъпо. Някакви идеи?

Отговор
в отговор на M #2

Re: Splash screen

sloji taimer i pokaji splasha i na ontimer go skrii i pokaji main form

Отговор
в отговор на usr #3

Re: Splash screen

Да, но идеята беше 1-во да се покаже splash-a и чак след това да започне зареждането в паметта на главната програма. Засега единственото за което се сещам е splash-a да седи в отделен loader, който след изобразяване да зарежда главната програма. Иначе се получава 10 сек. стържене по диска, и едновременно показване на splash-a и mainform на приложението.....

Отговор
в отговор на M #4

Погледни...

примера от MastApp - мисля, че Slash -а там е направен точно както го искаш.
\Delphi6\Demos\Db\MastApp

---
Е т'ва е живот!
Отговор
в отговор на M #5

Re: Splash screen

Като Component ще е малко сложничко....
Може би трябва при OnCreate да проверяваш, ако си в дизайн моде да модифицираш *.dpr. Там обаче има доста подмолни закачалки най-малката от които е добър парсер. Borland се отнася към това, като демократичен ревнивец към гаджето си - няма нищо против другите да го пипат, но винаги държи той да има последен думата при оправянето

Отговор
в отговор на M #6

Re: Splash screen

Доколкото разбирам, ако просто сложиш сплаша като маин форм , ще ти свърши работа. После скриваш сплаша и си показваш която форма те интересува.

Отговор
в отговор на M #7

Re: Splash screen

компонент за сплаш?!? - нямам идея, ама ако не е до компонента а само до сплаша:


//-----------------------------------------------------------------------
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 на екрана/. после си я тресваш.

--------------------------------------
Започва Път от моят праг...
Отговор
в отговор на mf2hd #8

Re: Splash screen

Проблема е, че докато главната форма бъде изведена, се изпълнява initialization на всички unit-и и Create на всички Auto-create форми, а дефакто това е самото зареждане. В това отношение Phantomas е дал добър пример.

Отговор
в отговор на PhantomAS #9

Re: Погледни...

Да, така го искам и вече се бях досетил за нещо подобно, само че с код в initialization частта на първия деклариран модул (практически това е модула на главната форма). Това е първия код който се изпълнява въобще, разбира се, след някои глобални инициализации, извършвани от Delphi-то на заден план ... нещо, като това:


var
Form1: TForm1;
sf: TForm; // това е Splash формата

implementation

{$R *.DFM}

initialization

sf:=TForm.Create(Application);
sf.ShowModal; // В действителност трябва да е Show и после
// Hide преди да се покаже главната форма

end.



Отговор
в отговор на M #10

Re: Погледни...

ne e neobhodimo zadaljitelno da e wqrno "първия деклариран модул (практически това е модула на главната форма)"

------------------------------
I got a COMPILER, and I'm not afraid to use it!
Отговор
в отговор на SDR #11

Re: ?

Кое не е вярно - 1) че initialize на първия модул е първия код, който се изпълнява или 2) че модула на главната форма е първи?

1) пише го в документацията
2) така е на теория (by default), но наистина не е задължително ...

BTW, реализацията на задачката с компонент се усложнява именно поради причини, свързни с естеството на условието и начина на създаване (Create) на компонентите. Та затова, най-подходящото решение изглежда е да се напише клас и той да се имплементира и настройва ръчно. Вярно, че се губи удобството на Object Inspector и още някои други дреболии, но пък ще стане точно както го искам.



Отговор
в отговор на M #12

Освен това...

...при много бързо зареждане слагам таймер, който се стартира при OnShow на MainForm и затваря splash screen (който е StayOnTop) след около 500 ms

Така има половин секунда през която и двете форми са на екрана.

Дали завиването на крушка е софтуерен проблем?
Отговор
в отговор на M #13

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, но той най-често го прави
Отговор
в отговор на M #14

Re: За по-голяма точност...

...трябва да отбележа че 1) е първия потребителски код (написан от програмиста), защото преди неговото изпълнение, както казах и по-рано, Delphi-то изпълнява свой собствен подготвителен код.

Отговор
в отговор на M #15

Re: За по-голяма точност...

.......1) е първия потребителски код (написан от програмиста), защото преди неговото изпълнение, както казах и по-рано, Delphi-то изпълнява свой собствен подготвителен код

Започва да ми замирисва на шаманство

Всъщност няма нищо шаманско, нито пък някой (в т.ч. и делфито) те следи кой ще е първия код, който ще напишеш, нито пък има някаква разлика кое си е собствен код на делфито (вероятно имаш предвид Forms, който обикновено е първия модул в uses на *.dpr) и кое на програмиста.
Инициализацията си върви по рекурсия така, както е описана в uses на модулите започвайки от първия записан в *.dpr. Изключение се допуска само за "вградения" system.

Разместването им обаче не винаги е безпроблемно. Затова и ти писах (16.07.03 09:24), че Borland се отнася към това, като демократичен ревнивец към гаджето си - няма нищо против другите да го пипат, но винаги държи той да има последен думата при оправянето

И е естествено, че не можеш да покажеш форма (даже splash), преди да си инициализирал Forms

.........
И една корекция на горепосочения ми пост. OnCreate да се чете Create-ване
Лапсус

Отговор