How to make a splash screen with a progress bar on

2019-08-21 11:22发布

问题:

(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.

回答1:

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.



回答2:

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...



回答3:

Maybe this is interesting for you.



回答4:

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.



回答5:

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;