delphi之完美Splash方案

前言:网上有很多介绍delphi创建闪屏的代码,大多只是在程序开启前显示一个闪屏,但是却没有说如何在闪屏上显示程序加载的进度,于是笔者有意思介绍一下这种闪屏方式。

 

1.创建一个窗体(TfrmSplash),放入一个TImageBox,加载一幅图片,调整好TImageBox与图片的大小,然后在其上放入一个TLabel,name=LblStatus,用于显示加载进度文字。然后将TfrmSplash设置为不自动创建。

 

2.加入如下代码(代码很简单,就不用解释太多)

Delphi代码 复制代码  收藏代码
  1. unit UntFormSplash;   
  2.   
  3. interface   
  4.   
  5. uses   
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   
  7.   Dialogs, ExtCtrls, StdCtrls;   
  8.   
  9. type   
  10.   TfrmSplash = class(TForm)   
  11.     Image1: TImage;   
  12.     LblStatus: TLabel;   
  13.   private   
  14.     { Private declarations }   
  15.     FParam:Pointer;   
  16.   public   
  17.     { Public declarations }   
  18.     class function Execute(AParam:Pointer):Boolean;   
  19.     procedure SetStatusText(Value: string);   
  20.   published   
  21.     property StatusText : string write SetStatusText;   
  22.   end;   
  23.   
  24. var   
  25.   SplashForm: TfrmSplash;   
  26.   
  27. implementation   
  28.   
  29. {$R *.dfm}   
  30.   
  31. { TfrmSplash }   
  32.   
  33. class function TfrmSplash.Execute(AParam:Pointer): Boolean;   
  34. begin   
  35.   with TfrmSplash.Create(nil) do   
  36.   try   
  37.     FParam := AParam;   
  38.     Result := ShowModal = mrOk;   
  39.   finally   
  40.     Free;   
  41.   end;   
  42. end;   
  43.   
  44. procedure TfrmSplash.SetStatusText(Value: string);   
  45. begin   
  46.   LblStatus.Caption := Value;   
  47.   Update;  //这句非常重要,不加的话,界面会阻塞,文字也就不会更新显示   
  48.   Sleep(1000); //这句根据自己实际情况来调整,主要是怕闪屏太快关闭,达不到效果   
  49. end;   
  50.   
  51.   
  52. end.  
unit UntFormSplash;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TfrmSplash = class(TForm)
    Image1: TImage;
    LblStatus: TLabel;
  private
    { Private declarations }
    FParam:Pointer;
  public
    { Public declarations }
    class function Execute(AParam:Pointer):Boolean;
    procedure SetStatusText(Value: string);
  published
    property StatusText : string write SetStatusText;
  end;

var
  SplashForm: TfrmSplash;

implementation

{$R *.dfm}

{ TfrmSplash }

class function TfrmSplash.Execute(AParam:Pointer): Boolean;
begin
  with TfrmSplash.Create(nil) do
  try
    FParam := AParam;
    Result := ShowModal = mrOk;
  finally
    Free;
  end;
end;

procedure TfrmSplash.SetStatusText(Value: string);
begin
  LblStatus.Caption := Value;
  Update;  //这句非常重要,不加的话,界面会阻塞,文字也就不会更新显示
  Sleep(1000); //这句根据自己实际情况来调整,主要是怕闪屏太快关闭,达不到效果
end;


end.

 

3. 在项目的.dpr文件中加入如下代码:

Delphi代码 复制代码  收藏代码
  1. begin   
  2.   
  3.   Application.Initialize;   
  4.   
  5.   SplashForm := TfrmSplash.Create(Application);   
  6.   SplashForm.Show;   
  7.   SplashForm.Update;   
  8.   
  9.   SplashForm.StatusText := '准备启动...';   
  10.   SplashForm.Update;   
  11.      
  12.   Application.CreateForm(TDM, DM);   
  13.   Application.CreateForm(TfrmMain, frmMain);   
  14.      
  15.   SplashForm.Hide;   
  16.   SplashForm.Free;   
  17.   
  18.   Application.Run;   
  19. end.  
begin

  Application.Initialize;

  SplashForm := TfrmSplash.Create(Application);
  SplashForm.Show;
  SplashForm.Update;

  SplashForm.StatusText := '准备启动...';
  SplashForm.Update;
  
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TfrmMain, frmMain);
  
  SplashForm.Hide;
  SplashForm.Free;

  Application.Run;
end.

 

4.这一步就是主窗体加载数据的时候,边加载边更新闪屏的进度文字了:

Delphi代码 复制代码  收藏代码
  1. procedure TfrmMain.FormCreate(Sender: TObject);   
  2. begin   
  3.   
  4.   with SplashForm do   
  5.   try   
  6.     StatusText := ('开始初始化内存...');   
  7.     FCacheHash := TStringHashMap.Create(CaseInsensitiveTraits, 255);   
  8.     FCurrentClients := TList.Create;   
  9.     //VST.NodeDataSize := SizeOf(TTagCustomListItem);   
  10.     //VST.RootNodeCount := 2;   
  11.     VST.NodeDataSize := SizeOf(TMyTreeNodeDate);   
  12.     StatusText :=('初始化内存完成');   
  13.   
  14.     StatusText :=('开始加载客户端列表...');   
  15.     BuildGroupTree;   
  16.     StatusText :=('加载客户端列表完成');   
  17.   
  18.     StatusText :=('开始加载分组信息...');   
  19.     AddELVDefaultGroup;   
  20.     StatusText :=('开始初始化内存');   
  21.   
  22.     StatusText :=('开始初始化数据...');   
  23.     G_DefNetImpl := TDefNetImpl.Create();   
  24.     G_DefNetImpl.RegisterObserver(Self);   
  25.     StatusText :=('全部数据加载完毕,程序即将启动...');   
  26.   
  27.   finally   
  28.   
  29.   end;   
  30.   
  31.   
  32. end;  
procedure TfrmMain.FormCreate(Sender: TObject);
begin

  with SplashForm do
  try
    StatusText := ('开始初始化内存...');
    FCacheHash := TStringHashMap.Create(CaseInsensitiveTraits, 255);
    FCurrentClients := TList.Create;
    //VST.NodeDataSize := SizeOf(TTagCustomListItem);
    //VST.RootNodeCount := 2;
    VST.NodeDataSize := SizeOf(TMyTreeNodeDate);
    StatusText :=('初始化内存完成');

    StatusText :=('开始加载客户端列表...');
    BuildGroupTree;
    StatusText :=('加载客户端列表完成');

    StatusText :=('开始加载分组信息...');
    AddELVDefaultGroup;
    StatusText :=('开始初始化内存');

    StatusText :=('开始初始化数据...');
    G_DefNetImpl := TDefNetImpl.Create();
    G_DefNetImpl.RegisterObserver(Self);
    StatusText :=('全部数据加载完毕,程序即将启动...');

  finally

  end;


end;

 

收功,试着运行一下吧,一个漂亮的splash诞生了.


转自:http://peirenlei.iteye.com/blog/521581


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值