`

PB代码动态解析执行器

    博客分类:
  • pb
阅读更多
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
分享到:
评论

相关推荐

    PB代码动态解析执行器 源码

    PB代码动态解析执行器的核心是代码解析模块。这一部分负责读取PB源码,分析其语法结构,将代码转换为可执行的内部表示。这涉及到词法分析和语法分析两个阶段。词法分析将源代码分解为一系列的词法单元(tokens),...

    PB代码动态解析执行_pbdwe125.dll_pb_PB代码动态解析执行_

    标题 "PB代码动态解析执行_pbdwe125.dll_pb_PB代码动态解析执行_" 指的是使用PowerBuilder(PB)开发的应用程序中涉及到的一种高级功能,即动态解析执行PB代码。这种技术允许程序在运行时根据需要解析并执行用户...

    pb代码执行器

    PB代码执行器是一种专门用于运行PowerBuilder(简称PB)脚本的工具,尤其适用于PowerBuilder 9(pb9)环境。PowerBuilder是一款历史悠久的面向对象的集成开发环境(IDE),主要用于构建窗口应用程序,特别是数据库...

    PB调用IC卡读卡器程序例子代码

    接口程序的对接就是指将PB的代码与读卡器提供的SDK(软件开发工具包)相结合,使得PB能够识别并执行读卡器的相关操作,例如读取卡片数据、验证卡片等。 PB调用IC卡读卡器的过程一般包括以下几个步骤: 1. **导入...

    pb教程\pb常用的一些代码.

    下面将详细解析部分给定代码片段所涉及的PB知识点。 ### 1. 数据窗口操作 - **指定事务对象**:`dw_1.settransobject(sqlca)`。此行代码指定了数据窗口`dw_1`使用的事务管理器,通常是在数据库交互中用于处理事务...

    pb 浏览器源代码

    PB浏览器源代码是一个关于浏览器开发的专业项目,其中包含了一系列用于构建和理解浏览器工作原理的源文件。PB可能是“Protocol Buffers”(协议缓冲区)的缩写,它是一种数据序列化协议,通常用于高效地存储和传输...

    PB程序混淆器

    PB程序混淆器是一种专门针对PowerBuilder(PB)开发的应用程序进行保护的工具。PowerBuilder是一种流行的可视化编程环境,主要用于创建数据库应用系统。然而,由于PBD文件是PowerBuilder的编译后目标文件,包含了源...

    pb 查询分析器 带源码 可嵌入系统

    PB查询分析器是一款基于PowerBuilder(PB)开发的SQL查询工具,它包含了源代码,允许开发者根据自身需求进行定制和嵌入到其他系统中。在本文中,我们将深入探讨这款工具的关键特性、工作原理以及如何利用提供的源码...

    39码PB11源代码

    在本例中,“39码PB11源代码”指的是使用PowerBuilder 11编写的,实现39码生成和解析功能的源代码。源码通常包含多个文件,如`.pbl`(PowerBuilder Library)是代码库文件,`.pbt`(PowerBuilder Project)是项目...

    pb一些常用代码,和一些作业应用代码

    DSN(Data Source Name)是在ODBC数据源管理器中定义的数据源名称,它包含了连接到特定数据库所需的所有信息。 ### 4. 使用SQLCA进行数据库操作 在PowerBuilder中,可以通过调用SQLCA的方法来执行各种数据库操作,...

    PB混淆器_改成

    PB混淆器是一款针对PowerBuilder(PB)开发的应用程序进行代码混淆的专业工具。在软件开发领域,混淆是一种常见的安全措施,用于保护源代码不被轻易逆向工程解析,从而提高程序的安全性。PowerBuilder是一款历史悠久...

    PB写的IE浏览器源码.rar

    标题 "PB写的IE浏览器源码.rar" 暗示了这是一个使用PowerBuilder(PB)开发的Internet Explorer(IE)浏览器的源代码包。PowerBuilder是一款流行的面向对象的编程工具,尤其在开发数据库应用方面非常常见。它使用PBL...

    pb调用M1卡源码(很全)

    - **兼容性**:确保编写的PB代码兼容明华提供的SDK,并能与不同的M1卡和读卡器设备正常工作。 - **测试**:提供如"读卡测试"这样的测试用例,确保所有功能在实际环境中能够正常运行,包括各种边界条件和异常情况。 ...

    PB编译后程序加密器

    PB加密器的实现通常涉及多层安全机制,例如使用先进的加密算法(如AES、RSA等)进行数据加密,结合动态地址计算、防调试技术、反反编译技术等,以防止加密后的代码被逆向分析。此外,有些工具可能还提供自定义的入口...

    pb 9 resize 实例源代码

    PB 9 Resize 实例源代码解析 PowerBuilder(简称PB)是一种流行的开发工具,主要用于构建企业级的应用程序,尤其在数据库应用开发领域有着广泛的应用。版本9是它的一个历史版本,提供了许多增强功能,其中包括对象...

    PB做的聊天程序的代码

    【标题】"PB做的聊天程序的代码"是一个基于PowerBuilder(PB)开发的通信应用程序,主要面向各大中专院校的学生和教师。这个程序为学习和实践计算机编程,尤其是数据库交互和网络通信技术提供了宝贵的资源。 【描述...

    用PB8.0 短信开发源代码

    在这个“用PB8.0短信开发源代码”项目中,开发人员利用PB8.0来实现短信发送功能,这通常涉及到与硬件设备如GSM模块或通过网络API接口进行通信。 短信开发的核心在于AT命令集,这是一种通用的串行通信协议,用于控制...

    PB时间控件PB各种时间控件, PB各种时间控件, PB各种时间控件 PB各种时间控件

    这种方式需要编写额外的代码来验证和解析用户输入,确保其符合预期的日期时间格式。 5. **滑块控件 (Slider)**:在某些情况下,滑块控件可以用来表示时间间隔,比如调整音视频播放速度或者设置定时器。虽然这不是...

    Protobuf-3.3生成器PB和java资源.zip

    标题中的"Protobuf-3.3生成器PB和java资源.zip"指的是Google的Protocol Buffers(简称Protobuf)版本3.3的一个代码生成工具,它能够帮助开发者将定义的.proto文件转换为各种语言的源代码,如PB(可能是Protocol ...

Global site tag (gtag.js) - Google Analytics