软件启动画面中启动状态的显示

2008-04-09 04:21:45来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

我们平时看到的很多软件(PhotoShop,3DMax)都会在启动画面中显示当前正在启动哪个模块,并在模块加载失败时给予提示,这样的好处是,可以让比较专业的软件使用者知道当前软件加载了哪些模块,或者在软件发生启动错误时,让用户得以反馈是启动的哪个模块时发生了,以及在长时间的软件启动过程中,让用户知道软件还在工作,避免用户对其失去信息。。。

好了,说了那么多废话,就来看看我是怎么制作这样一个程序的,由于本人平时基本上都用Delphi来开发,所以以下代码也都是Delphi的,但是基本框架有了,相信要用其它语言实现也不会很难。另外,以下这些代码是我在过去的历次开发过程中组部提炼出来的,虽然还无法达到不修改即使用的地步,但是要修改的内容也不会很多。。

我的这个类叫做TAppLoader,首先要做的是,让它接管部分程序的初始化工作。
将工程dpr文件中的启动代码写成这样:
var
GAppLoader:TAppLoader;

begin
Application.Initialize;
GAppLoader:=TAppLoader.Create();
try
if GAppLoader.DoLoad() then begin
Application.Run;
end;
finally
GAppLoader.Free;
end;
end.
可以看到,所有的启动代码都在TAppLoader.DoLoad()函数中了,如果这个函数失败,则会返回false,此时就跳过Application.Run();过程,直接跳出程序。
接下来,来看一下这个类的定义:
TAppLoader = class (TObject)
private
FSplashForm: TfrmSplash;
FManagerList:TList;
protected
procedure InitializeManager(var AManager;AManagerClass:TCustomManagerClass);
procedure OnAppLoading(ASender:TObject;AEvent:String;ADelay:Integer=5);
public
constructor Create();
destructor Destroy(); override;
function DoLoad: Boolean;
end;

除了刚才说到的DoLoad()函数外,还可以看到这么两个函数:InitializeManager()和OnAppLoading()。
在说明InitializeManager()函数前,需要先介绍这么一个类:
TCustomManagerClass = class of TCustomManager;

TCustomManager = class(TObject)
private
FOnAppLoading:TAppLoadingEvent;
protected
procedure Initialize();virtual;abstract;
procedure Finalize();virtual;abstract;
procedure DoAppLoading(AEvent:String);
property OnAppLoading:TAppLoadingEvent read FOnAppLoading write FOnAppLoading;
public
constructor Create();virtual;
end;
在我的程序中,将所有的全局的资源管理类都叫做TxxxManager,而TCustomManager就定义了这些类的一些基本行为。说道这里,可能还有必要解释一下什么是资源管理类,说白了,也就是将整个软件运行期需要经常访问的资源、使用的功能都集中起来管理,比如我将数据库连接叫做:TDataManager,将串口通讯功能类叫做:TCommManager,等等。。。

这个基类定义了Initialize()和Finalize()两个虚方法,是用来让TAppLoader启动或关闭服务用的,这两个方法不同与构造与析构函数,它们初始化的不是类本身的资源,而是一些外部连接资源,(比如网络连接,文件句柄,串口端口等等),它们可以允许在不销毁对象的前提下,进行重新连接,也就是说,除了在TAppLoader中会调用Initialize()和Finalize()方法,你也可以在软件的使用过程中调用这两个方法,(比如用户选择了新的串口端口号)。

接着,可以看到TCustomManager中有一个OnAppLoading事件,在Initialize()的过程中,实际的Manager类就可以调用该方法,在启动画面上显示文字了。该事件实际会调用TAppLoader.OnAppLoading()方法,它的代码如下:
procedure TAppLoader.OnAppLoading(ASender:TObject;AEvent:String;
ADelay:Integer);
begin
if Assigned(FSplashForm) then begin
if Assigned(ASender) then begin
FSplashForm.lbl1.Caption:=ASender.ClassName '''': '''' AEvent;
end
else begin
FSplashForm.lbl1.Caption:=AEvent;
end;
FSplashForm.Update;
if ADelay>0 then
Sleep(ADelay);
end;
end;
其中FSplashForm就是启动画面了,在TAppLoader.DoLoad()中调用各个Manager的Initialize()方法时,这些Manager会根据自身当前初始化的内容,回调这个OnAppLoading()函数,此时就可以在启动画面上显示文字了。

实际的Manager类中只要调用DoAppLoading()方法,就可以将文字显示到启动画面上了,如:
procedure TFileImageManager.Initialize();
var
Directory:String;
FindHandle:THandle;
FindFileData:TWin32FindData;
begin
Directory:=ExtractFilePath(ParamStr(0)) ''''decoders\'''';
FindHandle:=FindFirstFile(PChar(Directory ''''*.dcd''''),FindFileData);
if FindHandle = INVALID_HANDLE_VALUE then
exit;
repeat
if (FindFileData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)<>FILE_ATTRIBUTE_DIRECTORY then begin
DoAppLoading(''''Loading '''' FindFileData.cFileName);
AddDecoder(Directory FindFileData.cFileName);
end;
until not FindNextFile(FindHandle,FindFileData);
Windows.FindClose(FindHandle);
end;

TAppLoader中还有这么一个函数:
procedure TAppLoader.InitializeManager(var AManager;AManagerClass:TCustomManagerClass);
var
Instance: TCustomManager;
begin
Instance := TCustomManager(AManagerClass.NewInstance);
TCustomManager(AManager) := Instance;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:在Delphi里播放Flash

下一篇:支持多线程的日志类,可以在线程中使用,用来与主窗口通讯