当前位置:首页 > 芯闻号 > 充电吧
[导读]PB代码动态解析执行器 博客分类:  pb脚本SybaseF#VB百度 PB代码动态解析执行器 当你看到VB、VFP等开发语言提供的强大的宏执行功能,是不是很羡慕呢?当你寻遍PB的帮助、关于PB

PB代码动态解析执行器 博客分类:  pb脚本SybaseF#VB百度 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 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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭