PB代码动态解析执行器
当你看到
VB、VFP等开发语言提供的强大的宏执行功能,是不是很羡慕呢?当你寻遍PB的帮助、关于PB开发的书籍或网站而不可得的时候,是不是感到有一丝的遗憾?如果你看到这篇文章,你应该感到振奋,因为你终于可以解决这个问题,而且解决
问题的思路既是如此简单、代码既是如此简短。如果再加上你的智慧,应该比我的解决方法更漂亮。
先让我们来了解一些基本知识。
一.代码的载体
在PB中,只有三个地方可以存放代码,那就是函数、事件、属性。这里所指的函数包括有返回值的通常意义下的函数和无返回值的过程以及声明的WINAPI函数,所指的事件指在对象中定义的处理程序,所指的属性指PB系统属性之外的实例变量、共享变量、全局变量。函数和事件是可以用来调用执行的,属性则只能用来赋值和取值。通常我们是在函数或事件中编写代码。
二.对象的创建
如果对象类型是已知的,可以使用CREATE objecttype 来创建对象,如果对象类型是动态的,可以使用CREATE USING objecttypestring来创建对象。
三.对象函数的调用方式
如果调用一个已知类型的对象的函数或事件,通常采用静态模式,也可采用动态模式,如果调用一个动态创建的对象的函数或事件,则必须采用动态模式,否则编译出错。采用动态模式调用函数是在函数前加dynamic 关键字。读者可查阅PB帮助。
四.库文件的搜索
PB中用于编程的对象是保存在PBL、PBD、DLL中的,如果想要使库文件中的对象在应用程序运行时有效,
常用的方法是直接将该PBL编译进去或者说使该PBL在库搜索列表中。如果需要在运行状态下改变库文件搜索列表,PB提供了SetLibraryList和AddToLibraryList两个函数。SetLibraryList函数只能在应用对象的open事件脚本中使用,否则应用程序会崩溃,AddToLibraryList为PB9新增的函数,用于将新文件加入到库文件
搜索列表中,这两个函数都是只能在编译环境下有效。
五.PB库文件的创建与销毁
PB提供了LibraryCreate函数用于创建库文件,提供LibraryDelete、FileDelete函数用于删除库文件。
六.PB实体的导入
PB提供了LibraryImport函数用于根据对象语法创建PB实体并导入到库文件中,但该函数目前只支持数据窗口对象类型的导入。不过,PB提供了相应的WINAPI函数支持其它类型实体的导入,这些相关的WINAPI包括在PBORCX0.DLL中(不同的PB版本有不同的文件名称,如PBORC90.DLL、PBORC80.DLL)。有关实体的导入的WINAPI包括PBORCA_SessionOpen、PBORCA_SessionClose、PBORCA_SessionSetLibraryList、PBORCA_SessionSetCurrentAppl、PBORCA_CompileEntryImport等,读者可以到Sybase网站找ORCA G
uide相应文章寻求支持。
七.PB实体的查找
使用FindClassDefinition或FindFunctionDefinition或LibraryDirectory可以在库文件中查找PB实体是否存在,使用FindClassDefinition或FindFunctionDefinition性能要好。
以下讲开发思路。
一.创建临时库文件
1. 取临时目录作为库文件的存放目录
2. 取待创建的临时库文件名称,保证不与已有文件重名
3. 使用LibraryCreate函数创建临时库文件
二.构造用于导入库文件的临时PB实体语法
1. 取临时PB实体名称,保证不与库文件列表中已有PB实体重名
2. 构造临时PB实体语法,区分函数和过程
三.将临时PB实体导入临时库文件
1. 取库文件列表和应用对象所在pbl
2. 将实际不存在的库文件从库文件列表中删除,目的是使调用PBORCA_SessionSetLibraryList成功
3. 调用PBORCA_CompileEntryImport将临时PB实体导入临时库文件
四.将临时库文件加入到库文件搜索列表
1. 调用AddToLibraryList加入新文件到库文件搜索
列表 五.创建临时PB实体所对应的对象并调用其函