我们总是梦想着对象化(四)

2021-08-16 11:39:24 浏览数 (2)

很多人以为,到这里,主程序就完成了。其实,未必。

这和你对主程序的认知是有关系的。在编程的意义上,主程序确实仅仅需要设置环境和路径。但是,从面向对象的角度来看,我个人认为从开始双击桌面的快捷方式,一直到你真正的进入到程序的主界面,这一段代码,都应该纳入到主程序的范畴,按我的说法就是:它们都是应用程序对象类应该负责的范畴。而基于这个观点的所谓主程序的作用,就演变为创建应用程序对象类实例。

就像这样:

代码语言:javascript复制
If !PemStatus(_Screen, [MyApp], 5)
 _Screen.NewObject([MyApp], [MyApp], [MyApp.VCX])
EndIf 
If _vfp.StartMode = 0
 _Screen.NCApp.Start()
Else
 _Screen.NCApp.Run()
EndIf

这里就应用程序对象类再做一些说明,因为我看到前面有看客留言,似乎是混淆了一些概念。应用程序对象类是在运行时刻,为应用程序提供从启动到运行功能模块的一个控制中心。所有在程序运行过程中的标准的的方法都可以纳入进来。例如,前面说的设置环境和路径,以及之后所论述的内容。留言中提到Project Hook 类,这是一个项目钩子类,它仅仅是在开发时刻针对项目管理器的所有操作提供一个接口,以便于开发者可以更好的进行项目的控制。针对Project Hook 类,如果你有兴趣进行更深入的了解,那么我建议你阅读张洪举编著的《Visual FoxPro 6.0-9.0 解决方案和范例大全》的第一章。该书的电子版,可以在他的CSDN博客中下载到。

回到我们的主题,接下来,我们需要处理一下 Splash 表单。也就是所谓的“欢迎”表单。

每一个应用程序都希望在第一时间给用户一个深刻的印象。而 Splash 表单,承担了这一任务。技巧与个性齐飞,是Splash 表单的特征。对于 VFP 的开发人员来说,这是一个展示自己软件风格或者炫耀编程技巧的舞台。然而,我并不打算在这里也炫耀一把,而是想讨论一下如何来更好的设计Splash 。

最基本的做法,就是在 MyApp.Vcx 类库中添加一个基于 Form 类的 Splash 自定义类。然后,你可以像在表单设计器中一样,在里面尽情的发挥。而当应用程序对象类实例使用它时,仅仅需要如下的代码:

代码语言:javascript复制
With _Screen.MyApp
 .oSplash = NewObject([NC_Welcom], .ClassLibrary)
 .oSplash.Show()
EndWith  

代码中的 oSplash ,是 MyApp的一个自定义属性,用于存储 Splash 类实例的对象引用。

有人说,我不喜欢设置为一个类,我喜欢设置为一个表单。因为设计的表单类,无法直接运行。

俗话说,办法总比困难多。你可以使用下面的代码来直接“运行”表单类:

代码语言:javascript复制
PrivatelaArray
Public goObject as Object
DimensionlaArray[1]
if AGetClass(m.laArray)
 m.goObject = NewObject(m.laArray[2], m.laArray[1])
 If Upper(m.goObject.baseclass) = [FORM]
 m.goObject.show()
 EndIf 
EndIf

在开发环境下,运行这段代码,选择你想要“运行”的表单类。OK。

这里使用了全局变量,其目的在于,可以更方便的进行表单类的调试。

有人会说,这种方法有缺陷,在编译为 EXE 后,这个 Splash 真的就是“一闪而过”。事实是,如果你不做处理的话,的确如此。

我们知道,在每一个 VFP 标准的主程序中,最后一句一定是:Read Events 。

虽然它允许有层次的嵌套,但是,我们还是尽可能的避免这种情况的出现。针对 Splash 类,我们可以做如下处理:

我们在表单类的 Activate 事件中发出 Read Events,然后在你认为恰当的地方发出 Clear Events 命令。我发出这个命令的位置是在表单中一个 Timer控件的 Timer 事件里。

WHY?请待下回分解。

你的反馈是我写作的动力,欢迎评论,未完待续。

0 人点赞