下载

0下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

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

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

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

丁克明
2018-08-24 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《软件启动画面中启动状态的显示doc》,可适用于IT/计算机领域

软件启动画面中启动状态的显示我们平时看到的很多软件(PhotoShopDMax)都会在启动画面中显示当前正在启动哪个模块并在模块加载失败时给予提示这样的好处是可以让比较专业的软件使用者知道当前软件加载了哪些模块或者在软件发生启动错误时让用户得以反馈是启动的哪个模块时发生了以及在长时间的软件启动过程中让用户知道软件还在工作避免用户对其失去信息。。。好了说了那么多废话就来看看我是怎么制作这样一个程序的由于本人平时基本上都用Delphi来开发所以以下代码也都是Delphi的但是基本框架有了相信要用其它语言实现也不会很难。另外以下这些代码是我在过去的历次开发过程中组部提炼出来的虽然还无法达到不修改即使用的地步但是要修改的内容也不会很多。。我的这个类叫做TAppLoader首先要做的是让它接管部分程序的初始化工作。将工程dpr文件中的启动代码写成这样:varGAppLoader:TAppLoaderbeginApplicationInitializeGAppLoader:=TAppLoaderCreate()tryifGAppLoaderDoLoad()thenbeginApplicationRunendfinallyGAppLoaderFreeendend可以看到所有的启动代码都在TAppLoaderDoLoad()函数中了如果这个函数失败则会返回false此时就跳过ApplicationRun()过程直接跳出程序。接下来来看一下这个类的定义:TAppLoader=class(TObject)privateFSplashForm:TfrmSplashFManagerList:TListprotectedprocedureInitializeManager(varAManagerAManagerClass:TCustomManagerClass)procedureOnAppLoading(ASender:TObjectAEvent:StringADelay:Integer=)publicconstructorCreate()destructorDestroy()overridefunctionDoLoad:Booleanend除了刚才说到的DoLoad()函数外还可以看到这么两个函数:InitializeManager()和OnAppLoading()。在说明InitializeManager()函数前需要先介绍这么一个类:TCustomManagerClass=classofTCustomManagerTCustomManager=class(TObject)privateFOnAppLoading:TAppLoadingEventprotectedprocedureInitialize()virtualabstractprocedureFinalize()virtualabstractprocedureDoAppLoading(AEvent:String)propertyOnAppLoading:TAppLoadingEventreadFOnAppLoadingwriteFOnAppLoadingpublicconstructorCreate()virtualend在我的程序中将所有的全局的资源管理类都叫做TxxxManager而TCustomManager就定义了这些类的一些基本行为。说道这里可能还有必要解释一下什么是资源管理类说白了也就是将整个软件运行期需要经常访问的资源、使用的功能都集中起来管理比如我将数据库连接叫做:TDataManager将串口通讯功能类叫做:TCommManager等等。。。这个基类定义了Initialize()和Finalize()两个虚方法是用来让TAppLoader启动或关闭服务用的这两个方法不同与构造与析构函数它们初始化的不是类本身的资源而是一些外部连接资源(比如网络连接文件句柄串口端口等等)它们可以允许在不销毁对象的前提下进行重新连接也就是说除了在TAppLoader中会调用Initialize()和Finalize()方法你也可以在软件的使用过程中调用这两个方法(比如用户选择了新的串口端口号)。接着可以看到TCustomManager中有一个OnAppLoading事件在Initialize()的过程中实际的Manager类就可以调用该方法在启动画面上显示文字了。该事件实际会调用TAppLoaderOnAppLoading()方法它的代码如下:procedureTAppLoaderOnAppLoading(ASender:TObjectAEvent:StringADelay:Integer)beginifAssigned(FSplashForm)thenbeginifAssigned(ASender)thenbeginFSplashFormlblCaption:=ASenderClassName':'AEventendelsebeginFSplashFormlblCaption:=AEventendFSplashFormUpdateifADelay>thenSleep(ADelay)endend其中FSplashForm就是启动画面了在TAppLoaderDoLoad()中调用各个Manager的Initialize()方法时这些Manager会根据自身当前初始化的内容回调这个OnAppLoading()函数此时就可以在启动画面上显示文字了。实际的Manager类中只要调用DoAppLoading()方法就可以将文字显示到启动画面上了如:procedureTFileImageManagerInitialize()varDirectory:StringFindHandle:THandleFindFileData:TWinFindDatabeginDirectory:=ExtractFilePath(ParamStr())'decoders'FindHandle:=FindFirstFile(PChar(Directory'*dcd'),FindFileData)ifFindHandle=INVALIDHANDLEVALUEthenexitrepeatif(FindFileDatadwFileAttributesandFILEATTRIBUTEDIRECTORY)<>FILEATTRIBUTEDIRECTORYthenbeginDoAppLoading('Loading'FindFileDatacFileName)AddDecoder(DirectoryFindFileDatacFileName)enduntilnotFindNextFile(FindHandle,FindFileData)WindowsFindClose(FindHandle)endTAppLoader中还有这么一个函数:procedureTAppLoaderInitializeManager(varAManagerAManagerClass:TCustomManagerClass)varInstance:TCustomManagerbeginInstance:=TCustomManager(AManagerClassNewInstance)TCustomManager(AManager):=InstancetryInstanceCreate()FManagerListAdd(AManager)InstanceOnAppLoading:=OnAppLoadingInstanceInitialize()InstanceOnAppLoading:=nilexceptTCustomManager(AManager):=nilraiseendend它用来启动一个Manager并将其加入TAppLoader的一个FManagerList列表中在TAppLoader析构时它会自动按照这个列表来释放所有的Manager。在Manager的Initialize()结束后比较保险的是将它的OnAppLoading重新设为空这样如果在程序运行过程中由其它功能来调用Manager的Initialize()时就不会再回调到显示启动文字的部分了。最后看一下DoLoad()函数:functionTAppLoaderDoLoad:BooleanbeginResult:=falseApplicationTitle:='UltraAlbum'FSplashForm:=TfrmSplashCreate(nil)trytryFSplashFormShowOnAppLoading(nil,'Starting')Sleep()InitializeManager(GOptionManager,TOptionManager)InitializeManager(GRdItemClassManager,TRdItemClassManager)InitializeManager(GImageManager,TFileImageManager)InitializeManager(GThemeManager,TFileThemeManager)InitializeManager(GMaskManager,TFileMaskManager)OnAppLoading(nil,'Ending',)ApplicationCreateForm(TfrmMain,frmMain)ifParamCount>=thenbegindealwiththefilenameintheparameterFSplashFormHidefrmMainShowfrmMainDoOpenFile(ParamStr())endResult:=trueexceptonE:ExceptiondobeginMessageBox(ApplicationHandle,PChar(EClassName':'##EMessage),PChar(ApplicationTitle),MBICONERROR)endendfinallyFreeAndNil(FSplashForm)endend这个函数是我的一个软件中的代码它首先构造并显示一个启动画面然后使用InitializeManager()分别初始化了个Manager类其中的GOptionManagerGRdItemClassManager。。。都是全局对象在今后需要访问时都使用这个全局对象来进行访问这里我没有使用Singleton模式因为我觉得这几个对象都必须在程序主窗体创建前完全初始化而Singleton的设计思路是在对象第一次使用时才创建它的实例在我的这个使用中不需要这样的功能。当然你也可以自己改造这些Manager类成为Singleton的改动代码不会很多。最后再将程序的主界面创建出来可以看到这个主界面的创建代码就是我们从dpr文件中删除的那行。来源:programfancom(编程爱好者)选取:kjkimberly

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/8

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利