知识大全 软件启动画面中启动状态的显示

Posted 函数

篇首语:不为外撼,不以物移,而后可以任天下之大事。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 软件启动画面中启动状态的显示相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

TCustomManager = class(TObject)privateFOnAppLoading:TAppLoadingEvent;protectedprocedure Initialize();virtual;abstract;procedure Finalize();virtual;abstract;procedure DoAppLoading(AEvent:String);property OnAppLoading:TAppLoadingEvent read FOnAppLoading write FOnAppLoading;publicconstructor 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);beginif Assigned(FSplashForm) then beginif Assigned(ASender) then beginFSplashForm lbl Caption:=ASender ClassName+ : +AEvent;endelse beginFSplashForm lbl Caption:=AEvent;end;FSplashForm Update;if ADelay> thenSleep(ADelay);end;end;  其中FSplashForm就是启动画面了 在TAppLoader DoLoad()中调用各个Manager的Initialize()方法时 这些Manager会根据自身当前初始化的内容 回调这个OnAppLoading()函数 此时就可以在启动画面上显示文字了

  实际的Manager类中只要调用DoAppLoading()方法 就可以将文字显示到启动画面上了 如 procedure TFileImageManager Initialize();varDirectory:String;FindHandle:THandle;FindFileData:in FindData;beginDirectory:=ExtractFilePath(ParamStr( ))+ decoders\\ ;FindHandle:=FindFirstFile(PChar(Directory+ * dcd ) FindFileData);if FindHandle = INVALID_HANDLE_VALUE thenexit;repeatif (FindFileData dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)<>FILE_ATTRIBUTE_DIRECTORY then beginDoAppLoading( 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);varInstance: TCustomManager;beginInstance := TCustomManager(AManagerClass NewInstance);TCustomManager(AManager) := Instance;tryInstance Create();FManagerList Add(@AManager);Instance OnAppLoading:=OnAppLoading;Instance Initialize();Instance OnAppLoading:=nil;exceptTCustomManager(AManager):= nil;raise;end;end;  它用来启动一个Manager 并将其加入TAppLoader的一个FManagerList列表中 在TAppLoader析构时 它会自动按照这个列表 来释放所有的Manager   在Manager的Initialize()结束后 比较保险的是将它的OnAppLoading重新设为空 这样如果在程序运行过程中 由其它功能来调用Manager的Initialize()时 就不会再回调到显示启动文字的部分了

  最后 看一下DoLoad()函数 function TAppLoader DoLoad: Boolean;beginResult:=false;Application Title:= Ultra Album ;FSplashForm:=TfrmSplash Create(nil);trytryFSplashForm Show;OnAppLoading(nil Starting );Sleep( );

InitializeManager(GOptionManager TOptionManager);InitializeManager(GRdItemClassManager TRdItemClassManager);InitializeManager(GImageManager TFileImageManager);InitializeManager(GThemeManager TFileThemeManager );InitializeManager(GMaskManager TFileMaskManager);

OnAppLoading(nil Ending );

Application CreateForm(TfrmMain frmMain);if ParamCount>= then begin //deal with the filename in the parameterFSplashForm Hide;frmMain Show;frmMain DoOpenFile(ParamStr( ));end;

cha138/Article/program/Delphi/201311/25015

相关参考

知识大全 电脑开机后显示“启动修复”及“正常启动windows”, 但是都无法开机,为什么

电脑开机后显示“启动修复”及“正常启动windows”,但是都无法开机,为什么?软件或是硬件出现了问题。原因及解决方法:原因:软件安装不当,或非法操作,导致有效文件丢失,系统无法正常运行。如果在启动操

知识大全 为什么平板电脑开机总是显示正在重新启动?

为什么平板电脑开机总是显示正在重新启动?您好:根据您的描述判断是系统问题或者下载的某个APP软件导致,建议:1.长按开机键,将平板电脑强制关机后,按开机键+音量键进入双清模式,恢复出厂设置2.若无效,

知识大全 vc.net中实现启动画面淡入淡出

  找了半天没找实现启动画面来个淡入淡出的代码只好自己写了个呵呵还不错拿给大家看看  #undefWINVER//取消原有版本定义重新定义版本  #defineWINVERx//为了使AnimateW

知识大全 使用360顽固木马专杀大全后,一些正常软件的服务启动项被禁止了,导致软件出错,该如何修复

使用360顽固木马专杀大全后,一些正常软件的服务启动项被禁止了,导致软件出错,该如何修复?急!打开360→高级→启动项状态,把禁用的改为启用行吗?不行的话重装一下那软件这样能解决了吧。360顽固木马专

知识大全 开机没启动画面直接进入系统桌面是怎么回事

开机没启动画面直接进入系统桌面是怎么回事你可以在bios里把logo关掉就可以看到所有的信息的,具体的每个主板关闭方法不一样,你可以参考一下自己主板的型号说明书,如果不知道如果改动可以把主板型号报上来

知识大全 vc.net中实现启动画面来个淡入淡出

  找了半天没找实现启动画面来个淡入淡出的代码只好自己写了个呵呵还不错拿给大家看看  #undefWINVER//取消原有版本定义重新定义版本  #defineWINVERx//为了使AnimateW

属于CRT上启动给煤机许可条件的是()

属于CRT上启动给煤机许可条件的是()A、给煤机出口档板开B、磨煤机控制画面显示“磨煤机点火许可”C、无停给煤机信号D、给煤机就地控制站置“遥控”方式参考答案:BCD

属于CRT上启动给煤机许可条件的是()

属于CRT上启动给煤机许可条件的是()A、给煤机出口档板开B、磨煤机控制画面显示“磨煤机点火许可”C、无停给煤机信号D、给煤机就地控制站置“遥控”方式参考答案:BCD

知识大全 u盘装系统中bios怎么设置usb启动

u盘装系统中bios怎么设置usb启动bios设置U盘启动:1、插上制作好的【u启动U盘启动盘】并启动电脑,在进入开机画面的时候按“F12”(不同的电脑快捷方式不同)进入BIOS界面;2、进入BIOS

知识大全 我想开机不启动暴风影音,可是360安全卫士的开机启动软件里并没有暴风影音,我该怎么办

我想开机不启动暴风影音,可是360安全卫士的开机启动软件里并没有暴风影音,我该怎么办?打开暴风影音2009,鼠标左键点击右上角有个主菜单下拉箭头,选择高级选项,在全局控制的综合设置中取消对开机自动运行