分享
 
 
 

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

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

我们平时看到的很多软件(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;

try

Instance.Create();

FManagerList.Add(@AManager);

Instance.OnAppLoading:=OnAppLoading;

Instance.Initialize();

Instance.OnAppLoading:=nil;

except

TCustomManager(AManager):= nil;

raise;

end;

end;

它用来启动一个Manager,并将其加入TAppLoader的一个FManagerList列表中,在TAppLoader析构时,它会自动按照这个列表,来释放所有的Manager。

在Manager的Initialize()结束后,比较保险的是将它的OnAppLoading重新设为空,这样如果在程序运行过程中,由其它功能来调用Manager的Initialize()时,就不会再回调到显示启动文字的部分了。

最后,看一下DoLoad()函数:

function TAppLoader.DoLoad: Boolean;

begin

Result:=false;

Application.Title:='Ultra Album';

FSplashForm:=TfrmSplash.Create(nil);

try

try

FSplashForm.Show;

OnAppLoading(nil,'Starting...');

Sleep(100);

InitializeManager(GOptionManager,TOptionManager);

InitializeManager(GRdItemClassManager,TRdItemClassManager);

InitializeManager(GImageManager,TFileImageManager);

InitializeManager(GThemeManager,TFileThemeManager2);

InitializeManager(GMaskManager,TFileMaskManager);

OnAppLoading(nil,'Ending...',0);

Application.CreateForm(TfrmMain, frmMain);

if ParamCount>=1 then begin //deal with the filename in the parameter

FSplashForm.Hide;

frmMain.Show;

frmMain.DoOpenFile(ParamStr(1));

end;

Result:=true;

except

on E:Exception do begin

MessageBox(Application.Handle,PChar(E.ClassName+':'+#13+#10+E.Message),

PChar(Application.Title),MB_ICONERROR);

end;

end;

finally

FreeAndNil(FSplashForm);

end;

end;

这个函数是我的一个软件中的代码,它首先构造并显示一个启动画面,然后使用InitializeManager()分别初始化了5个Manager类,其中的GOptionManager,GRdItemClassManager。。。都是全局对象,在今后需要访问时,都使用这个全局对象来进行访问,这里我没有使用Singleton模式,因为我觉得这几个对象都必须在程序主窗体创建前完全初始化,而Singleton的设计思路是在对象第一次使用时才创建它的实例,在我的这个使用中不需要这样的功能。当然,你也可以自己改造这些Manager类成为Singleton的,改动代码不会很多。

最后,再将程序的主界面创建出来,可以看到这个主界面的创建代码就是我们从dpr文件中删除的那行。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有