(Unit1.pas)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OpenSplash;
procedure ShowProgress;
procedure CloseSplash;
end;
var
Form1: TForm1;
X: Integer;
Total: Integer;
Percent: Integer;
implementation
{$R *.dfm}
procedure TForm1.OpenSplash;
begin
Label1.Caption := '';
Show;
Update;
end;
procedure TForm1.CloseSplash;
begin
Form1.Destroy;
end;
procedure TForm1.ShowProgress;
begin
Label1.caption:='';
Total := 1000;
for X := 1 to Total do
begin
Sleep(5);
Percent := (x * 100) div Total;
Label1.caption := StringOfChar('|', Percent) + IntToStr(Percent) + '%';
Label1.Repaint;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Close;
Release;
Form1 := nil;
end;
end.
(Unit2.pas)
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
memo1: TMemo;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
function Splash: TForm2;
begin
if Form2 = nil then begin
Form2 := TForm2.Create(Application);
end;
result := Form2;
end;
end.
(*.dpr)
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Form1.OpenSplash;
Form1.ShowProgress;
Application.CreateForm(TForm1, Form1);
Form1.CloseSplash;
Application.Run;
end.
In your *.dpr, try something like this:
begin
Application.Initialize;
FormSplash := TFormSplash.Create( Application );
FormSplash.OpenSplash;
// Do the rest of your initialisation...
// MAKE SURE THERE'S NO CreateForm FOR FormSplash!
FormSplash.ShowProgress( "Creating a form..." );
Application.CreateForm( ... , ... );
...
// When you want to modify the splashscreen, do something like this:
FormSplash.ShowProgress( "Doing something else..." );
...
// Close the splash screen
FormSplash.CloseSplash;
Application.Run;
end.
You shouldn't need any references to your FormUtama type.
In your project code you are doing like this:
Form1.OpenSplash;
Form1.ShowProgress;
Application.CreateForm(TForm1, Form1);
Form1.CloseSplash;
Actually you are using methods from Form1 before creating it. This is dedicated to give problems...
Maybe this is interesting for you.
Here are the conclution
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Form1 := TForm1.Create( Application );
Form1.OpenSplash;
Form1.ShowProgress;
Application.CreateForm(TForm2, Form2);
Form1.CloseSplash;
Application.Run;
end.
Unit 1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
private
{ Private declarations }
public
{ Public declarations }
procedure OpenSplash;
procedure ShowProgress;
procedure CloseSplash;
end;
var
Form1: TForm1;
X: Integer;
Total: Integer;
Percent: Integer;
implementation
{$R *.dfm}
procedure TForm1.OpenSplash;
begin
Label1.Caption := '';
Show;
Update;
end;
procedure TForm1.CloseSplash;
begin
Form1.Destroy;
end;
procedure TForm1.ShowProgress;
begin
Label1.caption:='';
Total := 1000;
for X := 1 to Total do
begin
Sleep(5);
Percent := (x * 100) div Total;
Label1.caption := StringOfChar('|', Percent) + IntToStr(Percent) + '%';
Label1.Repaint;
end;
end;
end.
Unit 2
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
memo1: TMemo;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
end.
Thanks a lot for those who answer my question.
Add this code after the begin statement of the Project Source code (the .dpr file):
Application.Initialize; //this line exists!
SplashScreen := TMySplashScreen.Create(nil) ;
SplashScreen.Show;
SplashScreen.Update;
After the final Application.Create() and before Application.Run:
SplashScreen.Hide;
SplashScreen.Free;