当你看到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 Guide相应文章寻求支持。
七.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实体所对应的对象并调用其函数以执行动态脚本
1. 使用CREATE USING
objecttypestring语句创建对象
2. 通过动态调用对象的of_exec函数执行动态脚本,区分返回值类型
六.销毁所有临时对象
1. 调用LibraryDelete函数删除创建的临时库文件
以下讲我在开发时遇到的一些矛盾或问题。
一.代码是逐行解释还是让PB编译器去解释
有些开发人员试图对动态脚本自行逐行解释,这是很困难的事情。一行代码如果脱离它的语境去执行,可能会产生错误的结果,即便你对PB所支持的函数全部做出解释,使用PB开发出来的对象、函数、事件等,你又如何去解释?这等同于你要花很大力气去编写一个PB编译器,除非你与PB编译器的开发团队合作,否则你很难获得成功。所以你必须想办法让PB编译器去解释。既然每行代码不能脱离其它代码而执行,那就创建一个函数或事件,让这个函数或事件包括你想写的所有代码。而函数或事件又不能脱离对象而存在,所以你必须想办法动态创建对象以及函数或事件,对象的声明必须依赖于库文件中的PB实体,由此推出关键是创建PB实体。
二.如何创建PB实体
前面已讲过要使用PBORCX0.DLL中的WINAPI函数来创建并导入实体,这项技术并不难,在sybase的网站或随便狗狗(百度)一下就能出来一大把。
三.创建的PB实体是存放在现有库文件中还是新文件中再导入
我最初的想法是放在现有库文件中,这样就不必花费时间在创建库文件和删除库文件的执行上,结果发现,创建是成功,但运行时PB就是不“认识”我创建的PB实体,一创建该实体的对象就报错,想来PB在程序启动时就读取库文件中有哪些实体形成列表,在没有改变库文件列表之前,其实体列表不会改变,这样对新建的实体就视而不见了。所以我不得不试着新建一个PBL,在新建的PBL中创建PB实体,然后使用AddToLibraryList将新建的PBL包括进来,这一试果然成功。
四.使用数据窗口的Describe调用全局函数还是其它方式来取得返回值
大家都知道,使用数据窗口的Describe函数可以调用全局函数,但是它有很多的局限性,全局函数必须有简单类型的返回值,所有参数只能是简单数据类型而且不能通过参考传值。如果在需要调用的地方直接使用新建对象的函数将不受这些限制。
五.如何进行垃圾对象的清理
既然每次执行动态脚本要创建PB实体,如果执行得多了,就有很多垃圾对象,所以应进行清理。可以通过LibraryDelete函数或FileDelete删除库文件。有意思的是,一旦创建PB实体,即便你删除了,使用FindClassDefinition或FindFunctionDefinition还是能够找到,但你想使用该实体创建对象则失败,这再次说明PB在程序启动时就读取库文件中有哪些实体形成列表,在没有改变库文件列表之前,其实体列表不会改变。
以下是所附代码的几点说明
一.所附代码是在PB9环境下开发的,程序运行时必须有PBORC90.DLL,如果改成PB其它版本,请将nvo_pbcompiler中WINAPI函数所使用的动态库做相应修改。
二.nvo_pbcompiler用于创建PB实体,这是PB动态脚本解释器的核心函数;f_execpbscript()用于执行一段PB脚本的样例代码函数,返回值类型为字符串,如果要使用到其它场合,读者可自行编写函数,思路类似;w_pbcompiler_test为一个用来执行PB脚本的样例界面窗口;其它函数有各自功能。
三.如果想运行PB动态脚本编译器,请先将所有代码分对象导入库文件,然后编译,PB动态脚本编译器在PB开发环境下无效。
四.为了程序方面的简化,有些所使用的全局函数请参考作者的其它文章。
五.所附代码仅为脚本没有参数的情况下有效,如果你想代码有参数,只需要简单地对脚本语法作些改变就可,当然前台需要用户定义参数。
六.本PB动态脚本解释器可执行所有有效的PB代码,例如访问全局变量、使用PB所有的系统函数、使用程序员开发的自定义函数、打开窗口、访问菜单、使用数据窗口等。
七.通常将本PB动态脚本解释器嵌入到现有的使用PB开发出来的系统而不是单独使用,这样可以加载很多免编译的外挂程序。
八.如果再拓宽它的应用范围,你甚至可以做到只需要一个框架程序,其它代码全部动态加载和执行,这样就只需一次编译,升级和维护就变得非常简单,不过你要考虑系统的可用性、系统性能和系统的稳定性等。
附完整源代码
一.pbcompiler
$PBExportHeader$pbcompiler.sra
$PBExportComments$PB动态脚本解释器应用对象
forward
global
type pbcompiler from application
end type
global transaction
sqlca
global dynamicdescriptionarea sqlda
global dynamicstagingarea
sqlsa
global error error
global message message
end forward
global
variables
end variables
global type pbcompiler from application
string
appname = "pbcompiler"
end type
global pbcompiler pbcompiler
on
pbcompiler.create
appname="pbcompiler"
message=create
message
sqlca=create transaction
sqlda=create
dynamicdescriptionarea
sqlsa=create dynamicstagingarea
error=create
error
end on
on
pbcompiler.destroy
destroy(sqlca)
destroy(sqlda)
destroy(sqlsa)
destroy(error)
destroy(message)
end
on
event open;open(w_pbcompiler_test)
end
event
二.f_execpbscript
$PBExportHeader$f_execpbscript.srf
$PBExportComments$执行动态脚本的样例函数
global
type f_execpbscript from function_object
end type
forward
prototypes
global function string f_execpbscript (string as_returntype,
string as_pbscript)
end prototypes
global function string f_execpbscript
(string as_returntype, string
as_pbscript);/*******************************************************************
函数名称:f_execpbscript()
参数:
as_returntype string 返回值类型
as_pbscript string 动态代码
返回值: string
用户自定义或错误信息
功能描述:执行动态代码(只返回字符串)
创建人: 康剑民
创建日期:2007-02-12
版本号:
V1.0
*******************************************************************/
nvo_pbcompiler
lnv_pbcompiler
nonvisualobject luo_pbcompiler
string
ls_entryname,ls_libraryname
string ls_return
any
la_return
lnv_pbcompiler = create nvo_pbcompiler
//创建实体对象
if
lnv_pbcompiler.of_createentry(as_returntype,as_pbscript,ls_libraryname,ls_entryname)
= 1 then
if not isnull(FindClassDefinition(ls_entryname) )
then
luo_pbcompiler = create using ls_entryname
choose case
lower(as_returntype)
case
‘any‘,‘blob‘,‘boolean‘,‘char‘,‘character‘,‘date‘,‘datetime‘,‘dec‘,‘decimal‘,‘double‘,‘int‘,‘integer‘,‘long‘,‘real‘,‘string‘,‘time‘,‘uint‘,‘ulong‘,‘unsignedint‘,‘unsignedinteger‘,‘unsignedlong‘
la_return
= luo_pbcompiler.dynamic of_exec()//执行动态代码
ls_return =
string(la_return)
case ‘‘,‘none‘
luo_pbcompiler.dynamic
of_exec()//执行动态代码
ls_return = "none"
case else
luo_pbcompiler.dynamic
of_exec()//执行动态代码
ls_return = "result is disabled"
end choose
if
isvalid(luo_pbcompiler) then destroy luo_pbcompiler
else
ls_return =
"error"
end if
else
ls_return = "error"
end if
if
isvalid(lnv_pbcompiler) then destroy
lnv_pbcompiler
LibraryDelete(ls_libraryname)
return ls_return
end
function
三.f_parse
$PBExportHeader$f_parse.srf
$PBExportComments$分解字符串到数组
global
type f_parse from function_object
end type
forward prototypes
global
function long f_parse (readonly string as_text, readonly string as_sep, ref
string as_list[])
end prototypes
global function long f_parse (readonly
string as_text, readonly string as_sep, ref string
as_list[]);/*******************************************************************
函数名称:f_parse()
参数:
as_text string 来源字符串
as_sep string 分隔字符
as_list[] ref string
分析后形成的字符串数组
返回值: long 分析后形成的数组元素个数
功能描述:分析字符串到一个数组中
创建人:
康剑民
创建日期:2002-11-19
版本号:
V1.0
*******************************************************************/
long
i,ll_pos
string ls_null[],ls_text
ls_text = as_text
as_list =
ls_null
i=0
ll_pos = posw(lower(ls_text),lower(as_sep))
do while ll_pos
> 0
i ++
as_list[i]=leftw(ls_text,ll_pos -
1)
ls_text=midw(ls_text,ll_pos + lenw(as_sep),lenw(ls_text))
ll_pos =
posw(lower(ls_text),lower(as_sep))
loop
as_list[i + 1] = ls_text
return
upperbound(as_list[])
end
function
四.f_replacetext
$PBExportHeader$f_replacetext.srf
$PBExportComments$替换字符串
global
type f_replacetext from function_object
end type
forward
prototypes
global function string f_replacetext (readonly string as_source,
readonly string as_oldtag, readonly string as_newtag, readonly long
al_seq)
end prototypes
global function string f_replacetext (readonly
string as_source, readonly string as_oldtag, readonly string as_newtag, readonly
long
al_seq);/*******************************************************************
函数名称:f_replacetext()
参数:
as_source string 源字符串
as_oldtag string 待替换特征字符串
as_newtag string
替换后特征字符串
al_seq long 第几个特征替换字符串需替换,0表示全部
返回值: string
替换后字符串
功能描述:用一特征字符串替换指定字符串中的特征字符串,参数al_seq=0时表示全部替换
创建人:
康剑民
创建日期:2002-11-19
版本号:
V1.0
*******************************************************************/
long
ll_start_pos=1,ll_len_old_tag,i = 0
string
ls_left,ls_return=‘‘,ls_source=‘‘
ls_source = as_source
ll_len_old_tag =
lenw(as_oldtag)
ll_start_pos =
posw(lower(ls_source),lower(as_oldtag),1)
if al_seq = 0 then
DO WHILE
ll_start_pos > 0
ls_left = leftw(ls_source,ll_start_pos - 1) +
as_newtag
ls_return = ls_return + ls_left
ls_source =
midw(ls_source,ll_start_pos + lenw(as_oldtag),lenw(ls_source))
ll_start_pos =
posw(lower(ls_source),lower(as_oldtag),1)
LOOP
elseif al_seq > 0
then
DO WHILE ll_start_pos > 0
i ++
if al_seq = i then
ls_left =
leftw(ls_source,ll_start_pos - 1) + as_newtag
ls_return = ls_return +
ls_left
ls_source = midw(ls_source,ll_start_pos +
lenw(as_oldtag),lenw(ls_source))
ll_start_pos =
posw(lower(ls_source),lower(as_oldtag),1)
end if
loop
end
if
ls_return = ls_return + ls_source
return ls_return
end
function
五.nvo_pbcompiler
$PBExportHeader$nvo_pbcompiler.sru
$PBExportComments$PB动态脚本解释器
forward
global
type nvo_pbcompiler from nonvisualobject
end type
end forward
global
type nvo_pbcompiler from nonvisualobject
end type
global nvo_pbcompiler
nvo_pbcompiler
type prototypes
//打开一个会话
Function long SessionOpen ()
Library "PBORC90.DLL" Alias for "PBORCA_SessionOpen"
//关闭一个会话
Subroutine
SessionClose ( long hORCASession ) Library "PBORC90.DLL" Alias for
"PBORCA_SessionClose"
//设置当前会话的库清单
Function int SessionSetLibraryList (
long hORCASession, ref string pLibNames[], int iNumberOfLibs) Library
"PBORC90.DLL" Alias for
"PBORCA_SessionSetLibraryList"
//设置当前会话对应的应用
Function int
SessionSetCurrentAppl ( long hORCASession, string lpszApplLibName, string
lpszApplName ) Library "PBORC90.DLL" Alias for
"PBORCA_SessionSetCurrentAppl"
//导入并编译实体
Function int CompileEntryImport (
long hORCASession, string lpszLibraryName, string lpszEntryName, long
otEntryType, string lpszComments, string lpszEntrySyntax, long
lEntrySyntaxBuffSize, long pCompErrorProc, long pUserData ) Library
"PBORC90.DLL" Alias for "PBORCA_CompileEntryImport"
//取临时目录
Function long
GetTempPath(long nBufferLength, ref string lpBuffer) Library "kernel32" Alias
for "GetTempPathA"
//获取一个已装载模板的完整路径名称
FUNCTION ulong
GetModuleFileName(ulong hModule,ref string lpFileName,ulong nSize) LIBRARY
"kernel32.dll" ALIAS FOR "GetModuleFileNameA"
end prototypes
type
variables
end variables
forward prototypes
public function string
of_gettemppath ()
public function string of_getapppath ()
public function
integer of_createentry (string as_returntype, string as_pbscript, ref string
as_libraryname, ref string as_entryname)
end prototypes
public function
string of_gettemppath
();/*******************************************************************
函数名称:of_gettemppath()
参数:
无
返回值: string 临时路径
功能描述:取临时路径
创建人: 康剑民
创建日期:2006-12-26
版本号:
V1.0
*******************************************************************/
string
ls_path
ulong
lu_size=256
ls_path=space(256)
GetTempPath(lu_size,ls_path)
return
trimw(ls_path)
end function
public function string of_getapppath
();/*******************************************************************
函数名称:of_getapppath()
参数:
无
返回值: string 应用程序路径
功能描述:取应用程序路径
创建人: 康剑民
创建日期:2002-11-22
版本号:
V1.0
*******************************************************************/
string
ls_apppath
ls_apppath=space(256)
GetModuleFileName(Handle(GetApplication()),ls_apppath,256)
ls_apppath=Reverse(ls_apppath)
ls_apppath=Reverse(midw(ls_apppath,posw(ls_apppath,‘/‘,1)))
return
ls_apppath
end function
public function integer of_createentry (string
as_returntype, string as_pbscript, ref string as_libraryname, ref string
as_entryname);/*******************************************************************
函数名称:of_createentry()
参数:
as_returntype string 返回值类型
as_pbscript string 动态代码
as_libraryname ref
string 创建的库文件名称
as_entryname ref string 创建的实体名称
返回值: long
是否成功(1表示成功,-1表示失败)
功能描述:根据动态代码创建实体
创建人: 康剑民
创建日期:2007-02-12
版本号:
V1.0
*******************************************************************/
long
ll_sid//会话编号
long ll_index//对象序号
string ls_librarylist[]//库文件列表
string
ls_librarylist_tmp[]//库文件列表(临时)
string ls_temp_libraryname//临时库文件名称
string
ls_temp_path//临时目录
string ls_syntax//实体语法
string
ls_app_libraryname//应用程序所在库文件名称
integer li_result//结果
string
ls_entryname//对象名称
classdefinition lcd_app//应用程序类定义对象
string
ls_librarylist_files//库文件
integer i,j//临时变量
//开发环境下直接退出
if
handle(GetApplication()) <= 0 then return
-1
//取库文件列表
ls_librarylist_files = getlibrarylist
()
//取应用对象所在pbl
lcd_app =
getapplication().classdefinition
ls_app_libraryname =
lcd_app.libraryname
ls_temp_path = this.of_gettemppath(
)//取临时目录
//取待创建的临时库文件名称
ll_index = 1
ls_temp_libraryname = ls_temp_path
+ "temp"+string(ll_index) + ".pbl"
do while fileexists(ls_temp_libraryname)
or posw(","+ls_librarylist_files+",",","+ls_temp_libraryname+",") >
0
ll_index ++
ls_temp_libraryname = ls_temp_path + "temp"+string(ll_index)
+
".pbl"
loop
//创建临时库文件
LibraryCreate(ls_temp_libraryname,"临时库文件")
f_parse(ls_librarylist_files,‘,‘,ls_librarylist)//分解字符串到数组
//判断库文件是否存在并形成新列表
j
= 0
for i = 1 to upperbound(ls_librarylist)
if
fileexists(ls_librarylist[i]) then
j ++
ls_librarylist_tmp[j] =
ls_librarylist[i]
end if
next
ls_librarylist =
ls_librarylist_tmp
ls_librarylist[upperbound(ls_librarylist)+1] =
ls_temp_libraryname
ll_sid =
SessionOpen()//打开一个会话
//设置当前会话的库清单
li_result = SessionSetLibraryList
(ll_sid, ls_librarylist, upperbound(ls_librarylist))
if li_result = 0
then
//设置当前会话对应的应用
li_result = SessionSetCurrentAppl (ll_sid,
ls_app_libraryname, getapplication().appname )
if li_result = 0
then
//取实体名称(保证不重复)
ll_index = 1
do while not
isnull(FindClassDefinition("nvo_"+string(ll_index)))
ll_index
++
loop
ls_entryname = "nvo_"+string(ll_index)
//实体声明
ls_syntax =
"$PBExportHeader$"+ls_entryname+".sru"+"~r~n"&
+
"forward"+"~r~n"&
+ "global type "+ls_entryname+" from
nonvisualobject"+"~r~n"&
+ "end type"+"~r~n"&
+ "end
forward"+"~r~n"&
+ "~r~n"&
+ "global type "+ls_entryname+" from
nonvisualobject"+"~r~n"&
+ "end type"+"~r~n"&
+ "global
"+ls_entryname+" "+ls_entryname+""+"~r~n"&
+ "~r~n"&
+ "forward
prototypes"+"~r~n"
//区分函数还是过程
if trimw(lower(as_returntype)) = ‘none‘ or
trimw(lower(as_returntype)) = ‘‘ then
ls_syntax = ls_syntax + "public
subroutine of_exec ()"+"~r~n"&
+ "end prototypes"+"~r~n"&
+
"~r~n"&
+ "public subroutine of_exec ();"+as_pbscript+"~r~n"&
+
"end subroutine"
else
ls_syntax = ls_syntax + "public function " +
as_returntype + " of_exec ()"+"~r~n"&
+ "end prototypes"+"~r~n"&
+
"~r~n"&
+ "public function " + as_returntype + " of_exec
();"+as_pbscript+"~r~n"&
+ "end function"
end
if
//实体语法尾部
ls_syntax = ls_syntax + "~r~n" + "on " + ls_entryname +
".create"+"~r~n"&
+ "call super::create"+"~r~n"&
+ "TriggerEvent(
this, ~"constructor~" )"+"~r~n"&
+ "end on"+"~r~n"&
+
"~r~n"&
+ "on " + ls_entryname + ".destroy"+"~r~n"&
+
"TriggerEvent( this, ~"destructor~" )"+"~r~n"&
+ "call
super::destroy"+"~r~n"&
+ "end on"
//导入并编译实体
li_result =
CompileEntryImport (ll_sid, ls_temp_libraryname, ls_entryname, 6 , "comment -
new object", ls_syntax, len(ls_syntax), 0, 0 )
end if
end
if
SessionClose(ll_sid)//关闭一个会话
as_libraryname =
ls_temp_libraryname
as_entryname=ls_entryname
//加入新文件到库文件搜索列表
AddToLibraryList(ls_temp_libraryname)
if
li_result = 0 then
return 1
else
return -1
end if
end
function
on nvo_pbcompiler.create
call super::create
TriggerEvent(
this, "constructor" )
end on
on nvo_pbcompiler.destroy
TriggerEvent(
this, "destructor" )
call super::destroy
end
on
六.w_pbcompiler_test
$PBExportHeader$w_pbcompiler_test.srw
$PBExportComments$PB动态脚本解释器测试窗口
forward
global
type w_pbcompiler_test from window
end type
type st_returnvalue from
statictext within w_pbcompiler_test
end type
type st_returntype from
statictext within w_pbcompiler_test
end type
type st_script from
statictext within w_pbcompiler_test
end type
type sle_returnvalue from
singlelineedit within w_pbcompiler_test
end type
type cb_exit from
commandbutton within w_pbcompiler_test
end type
type sle_returntype from
singlelineedit within w_pbcompiler_test
end type
type mle_script from
multilineedit within w_pbcompiler_test
end type
type cb_ok from
commandbutton within w_pbcompiler_test
end type
end forward
global type
w_pbcompiler_test from window
integer width = 1979
integer height =
1100
boolean titlebar = true
string title = "PB脚本解释器(测试)"
boolean
controlmenu = true
boolean minbox = true
boolean maxbox = true
boolean
resizable = true
long backcolor = 67108864
string icon =
"AppIcon!"
boolean center = true
st_returnvalue
st_returnvalue
st_returntype st_returntype
st_script
st_script
sle_returnvalue sle_returnvalue
cb_exit
cb_exit
sle_returntype sle_returntype
mle_script mle_script
cb_ok
cb_ok
end type
global w_pbcompiler_test w_pbcompiler_test
type
prototypes
end prototypes
type variables
end variables
on
w_pbcompiler_test.create
this.st_returnvalue=create
st_returnvalue
this.st_returntype=create
st_returntype
this.st_script=create st_script
this.sle_returnvalue=create
sle_returnvalue
this.cb_exit=create cb_exit
this.sle_returntype=create
sle_returntype
this.mle_script=create mle_script
this.cb_ok=create
cb_ok
this.Control[]={this.st_returnvalue,&
this.st_returntype,&
this.st_script,&
this.sle_returnvalue,&
this.cb_exit,&
this.sle_returntype,&
this.mle_script,&
this.cb_ok}
end
on
on
w_pbcompiler_test.destroy
destroy(this.st_returnvalue)
destroy(this.st_returntype)
destroy(this.st_script)
destroy(this.sle_returnvalue)
destroy(this.cb_exit)
destroy(this.sle_returntype)
destroy(this.mle_script)
destroy(this.cb_ok)
end
on
type st_returnvalue from statictext within w_pbcompiler_test
integer x
= 9
integer y = 608
integer width = 297
integer height = 60
integer
textsize = -9
integer weight = 400
fontcharset fontcharset =
ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily =
swiss!
string facename = "Arial"
long textcolor = 33554432
long
backcolor = 67108864
string text = "返回值:"
boolean focusrectangle =
false
end type
type st_returntype from statictext within
w_pbcompiler_test
integer x = 9
integer y = 476
integer width =
297
integer height = 60
integer textsize = -9
integer weight =
400
fontcharset fontcharset = ansi!
fontpitch fontpitch =
variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
long
textcolor = 33554432
long backcolor = 67108864
string text =
"返回值类型:"
boolean focusrectangle = false
end type
type st_script from
statictext within w_pbcompiler_test
integer x = 9
integer y =
12
integer width = 206
integer height = 60
integer textsize =
-9
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch
fontpitch = variable!
fontfamily fontfamily = swiss!
string facename =
"Arial"
long textcolor = 33554432
long backcolor = 67108864
string text
= "PB脚本:"
boolean focusrectangle = false
end type
type sle_returnvalue
from singlelineedit within w_pbcompiler_test
integer x = 334
integer y =
608
integer width = 1582
integer height = 104
integer taborder =
30
integer textsize = -9
integer weight = 400
fontcharset fontcharset =
ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily =
swiss!
string facename = "Arial"
long textcolor = 33554432
borderstyle
borderstyle = stylelowered!
end type
type cb_exit from commandbutton
within w_pbcompiler_test
integer x = 1664
integer y = 856
integer width
= 242
integer height = 104
integer taborder = 50
integer textsize =
-9
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch
fontpitch = variable!
fontfamily fontfamily = swiss!
string facename =
"Arial"
string text = "退出"
end type
event clicked;close(parent)
end
event
type sle_returntype from singlelineedit within
w_pbcompiler_test
integer x = 334
integer y = 476
integer width =
1582
integer height = 104
integer taborder = 20
integer textsize =
-9
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch
fontpitch = variable!
fontfamily fontfamily = swiss!
string facename =
"Arial"
long textcolor = 33554432
borderstyle borderstyle =
stylelowered!
end type
type mle_script from multilineedit within
w_pbcompiler_test
integer x = 334
integer y = 12
integer width =
1582
integer height = 432
integer taborder = 10
integer textsize =
-9
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch
fontpitch = variable!
fontfamily fontfamily = swiss!
string facename =
"Arial"
long textcolor = 33554432
boolean vscrollbar = true
boolean
autovscroll = true
borderstyle borderstyle = stylelowered!
end
type
type cb_ok from commandbutton within w_pbcompiler_test
integer x =
1417
integer y = 856
integer width = 242
integer height =
104
integer taborder = 40
integer textsize = -9
integer weight =
400
fontcharset fontcharset = ansi!
fontpitch fontpitch =
variable!
fontfamily fontfamily = swiss!
string facename =
"Arial"
string text = "执行"
end type
event clicked;sle_returnvalue.text
= f_execpbscript(sle_returntype.text,mle_script.text)
end event