PB窗口之间传递多参数的方法:
- 格式:doc
- 大小:29.00 KB
- 文档页数:2
PB的小技巧1.如何使DataWindow中的数据只能追加新记录而不能修改。
利用Column 的Protect 属性可以很方便的做到这一点,方法如下:将每一列的Protect 属性设置为:If( IsRowNew(), 0, 1) )在PowerScript 中可以动态修改Protect 属性:dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")2. 允许从空的非字符字段跳离string ss = this.dwDescribe(this.GetColumnName()+".coltype")//s = this.dwDescribe("#"+String(this.GetColumn())+".coltype")CHOOSE CASE sCASE "number"IF Trim(this.GetText()) = "" THENint null_numSetNull(null_num)this.SetItem(this.GetRow(),this.GetColumn(),null_num)this.SetActionCode(3)END IFCASE "date"IF Trim(this.GetText()) = "" THENdate null_dateSetNull(null_date)this.SetItem(this.GetRow(),this.GetColumn(),null_date)this.SetActionCode(3)END IFCASE "time"IF Trim(this.GetText()) = "" THENtime null_timeSetNull(null_time)this.SetItem(this.GetRow(),this.GetColumn(),null_time)this.SetActionCode(3)END IFCASE "datetime"IF Trim(this.GetText()) = "" THENdate null_datetimeSetNull(null_datetime)this.SetItem(this.GetRow(),this.GetColumn(),null_datetime)this.SetActionCode(3)END IFEND CHOOSE3. 当我们为Datawindow的每一行显示行号时可以简单的放一个表达式为GetRow() -- 计算列。
PB中协调多数据窗口数据操纵的一种解决方法PB中协调多数据窗口数据操纵的一种解决方法1、问题的提出数据窗口是PB中检索、表现和操纵数据的对象。
如果一个数据表的列不多,用单数据窗口操纵数据很易实现,但在实际应用中,数据表的列数动辄几十,甚至上百也并不少见,这时用单数据窗口滚动显然不方便,一个自然的想法是采用TAB控件和TAB页,在每个TAB页上放置一个数据窗口控件,每个数据窗口控件分门别类操纵数据表的列,但随之而来的问题是如何协调分布在这些数据窗口中录入或修改数据的存储,针对每个数据窗口发布一个UPDATE()函数的调用不可行。
我们在实际开发中经过探索,增加一个后台的数据窗口做中介,解决了多数据窗口操纵数据的问题。
2、协调多数据窗口数据操纵的一种解决方法基本思路是:在进行数据操纵的数据窗口控件之外,另外放置一个数据窗口控件,设置其不可见,并设其数据窗口对象为一个选择了数据表中所有列的数据窗口,其他数据窗口控件中录入或修改的数据实时地传送过来,对该控件的数据进行更新操作即可。
不失一般性,下面以PB自带数据库psDemoDB.db中的customer表的数据录入为例来说明。
Customer表有"id","fname","lname","address","city","state","zip","phone","com pany"九个列,其中"id"为integer类型,其余均为char类型。
(1)创建数据窗口建立三个数据窗口d_1、d_2、d_3,数据窗口d_1选"id","fname","lname"三列,d_2中选"address","city","state"三列,d_3选"zip",""phone","company_name"三列。
ls1= dwo.Primary[row]★SetTransObject语法:dwcontrol.SetTransObject ( transaction )功能:给数据窗口或者datastore控件dwcontrol设置事务对象transaction,缺省事务对象是SQLCA。
返回值:成功设置事务对象则返回1,执行过程中发生了错误则返回-1,有任意参数为Null时返回Null。
★Retrieve语法:dwcontrol.Retrieve ( {, argument, argument . . . } )功能:使用数据窗口控件的当前事务对象检索数据库中的数据。
如果数据窗口控件对应的数据窗口对象定义了检索参数,则应该在该函数中指定检索参数,参数的个数和数据窗口对象的检索变量个数相等,对应的数据类型相兼容。
返回值:返回数据窗口控件主缓存区(PrimaryBuffer)中的记录数,如果检索数据时发生错误则返回-1,如果任意参数为Null则返回Null*该函数的参数和数据窗口对象定义的参数的顺序要相同,类型要兼容。
个数不能少于数据窗口对象定义的参数,即可以等于和多于数据窗口对象定义的参数,多的参数忽略。
★DeleteRow语法:dwcontrol.DeleteRow ( row )功能:删除数据窗口dwcontrol中的第row行数据,如果row为0则表示删除当前行的数据。
返回值:执行成功则返回1,执行错误则返回-1,如果任意参数为Null则返回Null。
*该函数执行后只是将被删除的数据从数据窗口的主缓存区移放到Deleted缓冲区,在数据库中并没有真正删除数据,当正确执行了Update函数并且使用commit语句提交了事务后,才真正从数据库中删除该数据★InsertRow语法:dwcontrol.InsertRow ( row )功能:在数据窗口dwcontrol的第row行前插入一行空白数据。
当指定row为0时,表示在当前行之前插入一行空白数据。
[PB]-窗口使用技巧**在打开和关闭窗口时进行数据传递OpenWithParm(windowvar,parmeter{,parent})其中windowvar是要打开的窗口名称,可以是window画板中定义的窗口,也可以是脚本中定义的窗口变量;parameter是要传递的参数,只能是String,Numeric或者PowerObject类型,该参数根据类型保存在Message的成员变量中传递个要打开的窗口;parent是一个已经打开的窗口名称,该窗口要成为windowvar窗口的父窗口。
函数执行成功返回1,否则返回-1,如果有参数为null 则返回null。
对象Message是一个结构类型的全局变量,并有很多的成员变量。
在传递参数时三个成员变量用来读取传递的数据,它们是:Message.DoubleParm:用来传递Numeric类型的数据。
Message.PowerObjectParm:用来传递PowerObject对象类型的数据,象数据窗口、按键、列表框和拥护自定义的结构等都可以使用该变量进行传递。
Message.StringParm:用来传递String类型的数据。
当使用函数OpenWithParm打开窗口后,应该在进行其他操作之前首先读取传递过来的参数,以免其他操作修改Message中的成员变量。
CloseWithReturn(windowname,Returnvalue)其中,windowname是要关闭的窗口的名称,一般是脚本所在的窗口的名称;Returnvalue是要返回的数值,和上述函数OpenWithParm的完全相同。
函数正确执行返回1,否则返回-1,当有参数为null时则返回null。
*只要是response类型的窗口,使用该函数就能有效地传递参数;该窗口不一定非得是用OpenWithParm打开的。
在打开该response的窗口中可以读取传递过来的参数。
总之,使用CloseWithReturn函数时一定要注意,只有被关闭的窗口是response 类型才能有效地获取返回参数。
[PB]-窗口使用技巧**在打开和关闭窗口时进行数据传递OpenWithParm(windowvar,parmeter{,parent})其中windowvar是要打开的窗口名称,可以是window画板中定义的窗口,也可以是脚本中定义的窗口变量;parameter是要传递的参数,只能是String,Numeric或者PowerObject类型,该参数根据类型保存在Message的成员变量中传递个要打开的窗口;parent是一个已经打开的窗口名称,该窗口要成为windowvar窗口的父窗口。
函数执行成功返回1,否则返回-1,如果有参数为null 则返回null。
对象Message是一个结构类型的全局变量,并有很多的成员变量。
在传递参数时三个成员变量用来读取传递的数据,它们是:Message.DoubleParm:用来传递Numeric类型的数据。
Message.PowerObjectParm:用来传递PowerObject对象类型的数据,象数据窗口、按键、列表框和拥护自定义的结构等都可以使用该变量进行传递。
Message.StringParm:用来传递String类型的数据。
当使用函数OpenWithParm打开窗口后,应该在进行其他操作之前首先读取传递过来的参数,以免其他操作修改Message中的成员变量。
CloseWithReturn(windowname,Returnvalue)其中,windowname是要关闭的窗口的名称,一般是脚本所在的窗口的名称;Returnvalue是要返回的数值,和上述函数OpenWithParm的完全相同。
函数正确执行返回1,否则返回-1,当有参数为null时则返回null。
*只要是response类型的窗口,使用该函数就能有效地传递参数;该窗口不一定非得是用OpenWithParm打开的。
在打开该response的窗口中可以读取传递过来的参数。
总之,使用CloseWithReturn函数时一定要注意,只有被关闭的窗口是response 类型才能有效地获取返回参数。
60个PB数据窗口技巧数据窗口是一种用于展示数据的工具,它可以帮助用户更好地理解和分析数据。
下面是60个PB数据窗口技巧,帮助您更高效地使用数据窗口。
1.在数据窗口左下角的栏中输入关键词,可以快速筛选显示您所需的数据。
2.使用鼠标右键单击数据窗口的列头,可以自定义列的显示与隐藏。
3.在数据窗口的列头拖动可以更改列的顺序和宽度。
4.在数据窗口的列头双击,可以按该列进行排序。
5. 使用Ctrl键与鼠标左键选择多列,可以同时对这些列进行操作。
6.点击数据窗口的行头,可以选择整行。
7. 使用Shift键与鼠标左键选择多行,可以同时对这些行进行操作。
8.双击数据窗口的行头,可以自动调整该行的高度,使其适应内容。
9.在数据窗口的列头右键单击,可以进行更多的列操作,如冻结列、设置列格式等。
10. 使用Ctrl+Enter键,可以在当前单元格中插入换行符。
11. 使用Ctrl+D键,可以复制当前单元格的内容到下一个单元格。
12.在数据窗口的列头左键单击,可以选择一整列。
13. 使用Ctrl+Shift键与鼠标左键选择多个非连续的列。
14.在数据窗口的列头上方的空白区域右键单击,可以选择整个数据窗口。
15.在数据窗口左上角的复选框,可以选择或取消选择整个数据窗口。
16. 使用Ctrl+C键,可以复制选中的单元格或整行到剪贴板。
17. 使用Ctrl+V键,可以粘贴剪贴板中的内容到当前单元格或行。
18. 使用Shift+Enter键,可以在当前单元格下方插入一行。
19. 使用Ctrl+K键,可以在当前单元格中插入一个链接。
20. 使用Ctrl+Space键,可以选择整列。
21. 使用Shift+Space键,可以选择整行。
22.在数据窗口的列头右键单击,可以选择“筛选”,进行高级筛选操作。
23.在数据窗口的列头右键单击,可以选择“合并”,将相邻的相同内容的单元格合并为一个。
24.在数据窗口的列头右键单击,可以选择“拆分”,将合并的单元格拆分回原来的单元格。
PB窗口之间传递多参数的方法(深圳:独孤求败 2003-05-19)在PowerBuilder中函数OpenWithParm,CloseWithReturn,OpenSheetWithParm,windowname.OpenUserObjectWithParm等都有一个在进行窗口操作(打开或者关闭)时存入Message消息对象的参数parameter或return value。
消息对象Message有三个属性用于存储这些函数传递给窗口的数据(依赖于窗口操作时参数赋予的类型)。
根据parameter / return value参数数据类型的不同,该参数的值保存在Message对象的不同属性中。
parameter / return value参数的类型与使用的Message对象属性的对应关系如下表:参数类型 Message对象属性Numeric(数值) Message.DoubleParmPowerObject(PB对象,包括用户自定义的结构数据类型) Message.PowerObjectParmString(字符串) Message.StringParm应用程序根据OpenWithParm()等函数的parameter / return value参数类型,从Message消息对象的不同属性中提取该函数并传送给被打开窗口的值。
在PB中如果是传递一个参数,是很容易实现的。
在调用脚本中,可以使用如下代码:openwithparm(w_wantparm,parmtotrans)接着在打开窗口w_wantparm的open事件中键入:string ls_getparmls_getparm=message.stringparm…如果需要传递多个参数,可以使用如下两种方法:方法一定义结构变量:lstr_declaredstr,其中包含你想传递的各种参数:变量名变量类型ID UnsignedlongName CharacterEmail CharacterHomepage Character……在调用脚本中,使用如下代码:lstr_declaredstr lstr_parmtotranslstr_parmtotrans.id=1lstr_="panya"lstr_paramtotrans.email="panya@"lstr_paramtotrans.homepage="";…openwithparm(w_wantparm,parmtotrans)接下来在打开窗口w_wantparm的open事件中,获取结构信息:lstr_declaredstr lstr_getparminteger li_getidstring ls_getnamestring ls_getemailstring ls_gethomepagelstr_getparm = message.powerobjectparmli_getid = lstr_getparm.idls_getname = lstr_ls_geemail = lstr_getparm.emaills_gethomepage = lstr_getparm.homepage…其中,lstr_declaredstr为用户自定义结构数据类型,是值传送的。
PB数据窗口动态编程技术1 引言PowerBuilder(简称PB)是一个图形化的应用程序开发环境。
使用PB可以很容易地开发和数据库打交道的商业化应用软件。
PB开发的应用软件由窗口构成,窗口中不仅可以包含按钮、下拉列表框及单选按钮等标准的Windows控件,还可以有PB提供的特殊的控件。
这些特殊控件可以使应用软件更容易使用,使应用软件的开发效率更高。
数据窗口控件就是PB提供的一个集成度很高的控件,使用该控件可以很方便地从数据库中提取数据。
PB提供了可视化的数据窗口设计和编程模式,但是,可视化设计界面设计的数据窗口在程序运行过程中是固定不变的。
很多时候,我们需要依据程序运行的情况及用户的选择对数据窗口进行动态调整,使数据窗口以不同的形式呈现数据,这就需要在程序运行过程中对数据窗口进行动态设置。
2 建立数据窗口控件和数据窗口PB的可视化编程环境仍然是PB程序设计的基础,我们在PB可视化设计阶段建立了一个数据窗口控件DWmain,该数据窗口控件包含一个Grid 类型的数据窗口DWdata,数据窗口控件DWmain实现数据窗口DWdata与用户的人机交互,用户通过操作数据窗口控件DWmain对数据窗口DWdata的数据进行检索、新增、删除和修改等操作。
可视化部分设计的原则是,固定不变的内容就在可视化部分设计,需要动态调整的内容则在程序中完成。
数据窗口对象DWdata的数据源是数据库表h_hy,h_hy的结构如下:表1 数据库表结构定义[列名\&类型\&长度\&小数位\&Ph\&Char\&20\&\&Rq\&DateTime\&8\&\&Csn\&Decimal\&9\&5\&Cpb\&Decimal\&9\&5\&Cas\&Decimal\&9\&5\&Cfe\&Decimal\&9\&5\&] 唯一索引:Ph数据窗口对象DWdata的SQL语句定义如下:SELECT ph ,rq,csn,cpb,cas,cfe FROM h_hy ;3 在程序中对数据窗口进行动态编程的技术1)禁止对rq进行修改要禁止用户对rq列进行修改,可以将rq列的TabSequence属性值设置为0。
pb从数据窗口获得数据的方法总结pb从数据窗口获得数据的方法总结通过PowerBuilder的数据窗口对象属性,我们可以指定一定格式的表达式来直接从数据窗口中获得数据。
这种直接的数据操作方法让我们能只需一条语句而不用调用许多方法,就可得到一定量甚至大量的数据。
操作数据的表达式大致可分为三种,下面逐一介绍。
---------------------------------------------------------------------1)在知道列或计算域名时得到数据得到某列中一行或全部的值,表达式:(如果rownum忽略,则可得到缓冲区或数据源的值)dwcontrol.Object.columnname {.buffer } {.datasource } { [ rownum ] }其中datasource 参数表示数据源,它有两个可选项,Current (缺省)和Original,由此参数我们可以指定数据是从当前数据窗口上还是从数据库中得到。
对于计算域,它不能被改变也没有当前值,所以我们必须指定为此参数为Original。
示例:因为缺省设置是在Primary缓冲区的当前值,下面语句是等价的,都是从第一行得到emp_name列的值dw_1.Object.emp_name[1]dw_1.Object.emp_name.Primary.Current[1]下面语句设置emp_name列的第一行值为“国防科技大学先进制造中心”dw_1.Object.emp_name[1] = "国防科技大学先进制造中心"下面语句得到所有emp_name列的值,并将它们放入数组中string ls_namearray[]ls_namearray = dw_1.Object.emp_name.Current下面语句得到emp_name列在filter缓冲区的所有当前值string ls_namearray[]ls_namearray = dw_1.Object.emp_name.Filter下面语句得到emp_name在filter缓冲区的初始值(数据库中的值)string ls_namearray[]ls_namearray = dw_1.Object.emp_name.Filter.Original下面语句得到emp_name列在delete缓冲区的第14行的当前值string ls_namels_name = dw_1.Object.emp_name.Delete[14]This statement gets the original下面语句得到emp_name列在delete缓冲区的第14行的初始值(数据库中的值)string ls_namels_name = dw_1.Object.emp_name.Delete.Original[14]下面语句得到review_date计算域的所有值string ld_review[]ld_review = dw_1.Object.review_date.Original得到被选择项的值表达式:dwcontrol.Object.columnname {.Primary }{.datasource }.Selected示例:由于Primary缓冲区是程序本选择项所在的唯一缓冲区并且当前数据是缺省的,下面的语句作用是等价的,它们实现从emp_name列中得到被选中行的值。
如何在PowerBuilder的窗口间实现参数传递
赵学锋;张金隆;蔡淑琴
【期刊名称】《计算机工程与应用》
【年(卷),期】2002(038)016
【摘要】窗口间的参数传递在应用程序的开发中得到了十分广泛的应用.该文介绍了在PowerBuilder的窗口间传递参数的基本原理,根据传递参数的方向及个数不同结合实例给出了不同的实现方法.
【总页数】3页(P148-149,200)
【作者】赵学锋;张金隆;蔡淑琴
【作者单位】华中科技大学管理学院,武汉,430074;华中科技大学管理学院,武汉,430074;华中科技大学管理学院,武汉,430074
【正文语种】中文
【中图分类】TP312
【相关文献】
1.基于PB的窗口间参数传递 [J], 赵学锋;张金隆
2.PowerBuilder中窗口之间的参数传递 [J], 卢守东
3.浅谈PowerBuilder应用中窗口和对象间信息传递 [J], 余鸿
4.PowerBuilder数据窗口中实现模糊查询 [J], 华逢兆
5.如何在PowerBuilder数据窗口中实现记录的动态排序 [J], 卢守东
因版权原因,仅展示原文概要,查看原文内容请购买。
SharedObject系列函数和共享对象有关的函数包括:SharedObjectRegister、SharedObjectGet、SharedObjectUnregister和SharedObjectDirectory函数。
首先,用SharedObjectRegister函数初始化共享对象,并建立一个单独的线程。
如:SharedObjectRegister (“ccuo_thread” ,“thread1” )其中ccuo_thread是一个共享的自定义类用户对象的类名,thread1是共享对象实例的共享名。
如果SharedObjectRegister函数返回Success,则新线程创建成功。
然后,执行指定代码。
有两种方法让新线程执行指定的代码:一种是在自定义类用户对象的constructor事件中编写脚本,新线程创建后就会自动执行该事件脚本;另一种方法是使用SharedObjectGet函数。
该函数实现共享对象实例的引用,如:SharedObjectGet ( “thread1” ,inv_thread )其中inv_thread是用来存储共享对象实例的一个对象变量,要求与ccuo_thread具有同一个类名。
最后,通过使用Post语句,即以inv_thread.Post of_function(agrs)的形式,异步调用共享对象的函数of_function。
在完成任务后,可以用SharedObjectUnregister函数中止线程,也可用SharedObjectDirectory函数列出所有有效的共享对象。
函数调用部分本文所用Win32 API函数原型为:Function Ulong FindWindowA ( String lpClassName ,String lpWindowName ) Library “user32.dll”Function Ulong GetTickCount ( ) Library “kernel32.dll”Function Ulong GetDesktopWindow ( ) Library “user32.dll”Function Boolean GetWindowRect ( Ulong hWnd ,ref stc_rect lpRect ) Library “user32.dll” Function Boolean MoveWindow ( Ulong hWnd ,int X ,int Y ,int nWidth ,int nHeight ,Boolean bRepaint ) Library “user32.dll”下面具体讨论如何实现消息对话框的居中显示://声明对象变量ccuo_thread lccuo_thread//创建新线程SharedObjectRegister (…ccuo_thread‟ ,…thread_center‟ )//引用实例SharedObjectGet (…thread_center‟ ,lccuo_thread )//调用窗口居中函数lccuo_thread.Post of_center (…#32770‟ ,…Demostration‟ ,2000 )//创建消息对话框MessageBox ( …Demostration‟ ,…Copyright(c) 2001 by Y.L.Sun‟ )//中止线程SharedObjectunRegister ( …thread_center‟ )函数实现部分实现窗口居中显示的函数是自定义类用户对象ccuo_thread的对象函数of_center,其实现代码如下:ccuo_thread.of_center ( String lpclassname ,Stringlpwindowname , Ulong dwtimeout ) return Boolean//lpclassname:消息对话框的类名(#32770)//lpwindowname:消息对话框的标题//dwtimeout:超时计数Ulong lul_hwnd //存放消息对话框的句柄Ulong lul_start //计时开始时刻的值lul_start = GetTickCount ( ) //计时开始do//查找顶层窗口lul_hwnd=FindWindowA ( lpclassname ,lpwindowname )//找到顶层窗口后,跳出循环if lul_hwnd <> 0 then exit//判断是否已超时loop while GetTickCount( )-lul_start< dwtimeout//没有找到消息对话框if lul_hwnd = 0 thenreturn falseelse//对话框居中return of_center ( 0 ,lul_hwnd )end ifof_center的重载函数代码如下:ccuo_thread.of_center ( Ulong hwndp ,Ulong hwndc ) return Boolean//hwndp:父窗口的句柄,值为0时认为是桌面//hwndc:子窗口的句柄int li_x //窗口的X坐标int li_y //窗口的Y坐标stc_rect lstc_parent //父窗口的4边坐标stc_rect lstc_child //子窗口的4边坐标//值为0时认为是桌面if hwndp = 0 then hwndparent =GetDesktopWindow ( )//获得窗口的4边坐标if not GetWindowRect ( hwndcurrent ,lstc_child ) then return falseif not GetWindowRect ( hwndparent ,lstc_parent ) then return falseli_x = (( lstc_parent.right -lstc_parent.left ) -( lstc_child.right -lstc_child.left )) /2li_y = (( lstc_parent.bottom -lstc_parent.top ) -( lstc_child.bottom -lstc_child.top )) /2//计算子窗口的X、Y坐标if li_x < 0 or li_y < 0 then return false//移动子窗口if not MoveWindow ( hwndcurrent ,li_x ,li_y ,lstc_child.right -lstc_child.left ,lstc_child.bottom -lstc_child.top ,false ) then return falsereturn true本文代码在PB 7.0下通过。
PB中下拉数据窗口带参数应用在数据输入时,当用到下拉列表时,会发现有些数据是和别的数据相关的,这时我们会希望过滤掉那些不相关的数据。
例如生成一个入库单,某种物料有多个供应商,我们要根据物料来过滤掉和这个物料不相关的供应商,这样会加快检索和输入的速度。
入库单表:billrec1.以supply表,制作一个带参数的数据窗口,命名为d_supply_replace_list,参数列为item_id,字符型,隐藏物料代码列。
2.以billrec表,制作一个数据窗口,命名为billrec_maintain,将supply_id列的edit属性中的style type选定为DropDownDW,datawindow为d_supply_replace_list。
在窗口中放置数据窗口控件dw_1,将其与billrec_maintain数据窗口关联。
在窗口中定义实例变量datawindowchild idwc_child。
3.在dw_1的constructor事件中编写以下脚本:this.getchild("supply_id",idwc_child) //生成子数据窗口,supply_id为下拉列表列idwc_child.insertrow(0)idwc_child.settransobject(SQLCA)this.of_settransobject(SQLCA)this.insertrow(0)4.在dw_1的itemchanged事件中编写以下脚本:long ll_getcolumnll_getcolumn = this.getcolumn() //获得当前列choose case ll_getcolumncase 7 //假设item_id列是第7列dw_1.accepttext()is_id = dw_1.getitemstring(row,7) //获得物料代码idwc_child.retrieve(is_id) //检索替代供应商end choose这样在输入不同的物料时,会像下图那样,只列出相关的供应商。
PB窗口之间传递多参数的方法:
在PowerBuilder中函数OpenWithParm,CloseWithReturn,OpenSheetWithParm,windowname.OpenUserObjectWithParm等都有一个在进行窗口操作(打开或者关闭)时存入Message消息对象的参数parameter或returnvalue。
消息对象Message有三个属性用于存储这些函数传递给窗口的数据(依赖于窗口操作时参数赋予的类型)。
根据parameter / returnvalue参数数据类型的不同,该参数的值保存在Message对象的不同属性中。
parameter / returnvalue参数的类型与使用的Message对象属性的对应关系如下表:
参数类型Message对象属性
Numeric(数值) Message.DoubleParm
PowerObject(PB对象,包括用户自定义的结构数据类型) Message.PowerObjectParm
String(字符串) Message.StringParm
应用程序根据OpenWithParm()等函数的parameter / returnvalue参数类型,从Message 消息对象的不同属性中提取该函数并传送给被打开窗口的值。
在PB中如果是传递一个参数,是很容易实现的。
在调用脚本中,可以使用如下代码:openwithparm(w_wantparm,parmtotrans)
接着在打开窗口w_wantparm的open事件中键入:
string ls_getparm
ls_getparm=message.stringparm
…
如果需要传递多个参数,可以使用如下两种方法:
方法一
定义结构变量:lstr_declaredstr,其中包含你想传递的各种参数:
变量名变量类型
ID Unsignedlong
Name Character
Email Character
Homepage Character
……
在调用脚本中,使用如下代码:
lstr_declaredstr lstr_parmtotrans
lstr_parmtotrans.id=1
lstr_="panya"
lstr_paramtotrans.email="panya@"
lstr_paramtotrans.homepage=" ";
…
openwithparm(w_wantparm,parmtotrans)
接下来在打开窗口w_wantparm的open事件中,获取结构信息:
lstr_declaredstr lstr_getparm
integer li_getid
string ls_getname
string ls_getemail
string ls_gethomepage
lstr_getparm = message.powerobjectparm
li_getid = lstr_getparm.id
ls_getname = lstr_
ls_geemail = lstr_getparm.email
ls_gethomepage = lstr_getparm.homepage
…
其中,lstr_declaredstr为用户自定义结构数据类型,是值传送
其中,lstr_declaredstr为用户自定义结构数据类型,是值传送的。
方法二
首先创建一个类用户对象
u_n_parmtostore
在该用户对象中将你需要传递的各种参数申明成实例变量,例如:
Public:
Integer ID
String Name
String Email
String Homepage
...
打开窗口w_wantparm,并传递多个参数:
u_n_parmtostore lnv_paramtotrans
lnv_paramtotrans.id=1
lnv_="panya"
lnv_paramtotrans.email="panya@"
lnv_paramtotrans.homepage=" ";
…
OpenWithParm ( w_wantparm, lnv_paramtotrans )
在w_wantparm 的open 事件中访问传来的参数:
u_n_parmtostore lnv_getparam
integer li_getid
string ls_getname
string ls_getemail
string ls_gethomepage
lnv_getparam = Message.PowerObjectParm
li_getid=lnv_getparam.id
ls_getname=lnv_
ls_gethomepage=lnv_getparam.homepage
ls_getemail=lnv_getparam.email
…
以上两种方法比较而言,第一种方法虽然比较简单实用,但是如果遇上较复杂的数据时,便不能在一个结构数据中充分描述了;第二种方法不但方便灵活,而且可以传送复杂的数据。
当然,参数的传送不止以上的几种方法,你也可以使用全局变量或是公共可访问的窗口实例变量来传送参数,或者在窗口中调用一个函数,并传递所需的参数,在此就不再赘述了。
另外,用Message传递参数必须注意以下几点:
1. 最好执行完窗口操作(打开或关闭)后马上将Message消息对象的值传给变量,这是因为Message是全局使用的对象,每一次事件被触发或传送时都会被使用,其他Script 也有可能用到Message消息对象,因此它有被覆盖的危险。
2.避免传送NULL对象,以免程序出错。