自定义事件框架浅说

自定义事件框架浅说
1、窗口概述    
2、窗口相关事件    
1、打开窗口    
key事件    
timer事件    
2、保存数据    
1、 pfc_begintran    
3、 pfc_endtran    
4、 Pfc_save    
3、关闭窗口    
3、数据窗口事件    
添加主表明细单据    
取消之前的新建的单据    
修改单据    
Clicked事件    
DoubleClicked事件    
Constructor事件    
Dropdown事件    
EditChanged标准事件    
Itemchanged标准事件    
ItemFocusChanged标准事件    
Rowfocuschanging    
Rowfocuschanged事件    
pfc_preupdate非标准事件    
pfc_predeleterow事件    
4、据查询的控制    
yfc_retrieve事件    
yfc_preretrieve自定义事件    
retrievestart事件    
retrieveend事件    
5、自定义控件    
uo_usercbs按钮组    
ue_duo_events    
6、打印    
ue_打印    
7、构建窗口与数据交换    
1、 itemchanged事件弹出选择窗口    
2、ue_transdata 自定义事件    
3、 用w_trans窗口    


1、窗口概述
为了实现给每个客户功能的定制,推出了功能定义、扩展权限、审核附加事件、扩展触发器、存储过程定制以及自定义事件等功能。在这里,只说下自定义事件。
窗口,有如下几种:
1、由主表明细表、单据浏览、明细浏览组成的一体式窗口,比如入库单,包含了dw_hdr、dw_dtl、dw_browse、dw_list
2、只有明细的w_ 窗口,比如会员兑奖,只包含dw_info的窗口。
3、动态报表,比如零售明细,只有dw_info窗口,由w_dyreport窗口调用一个sql语句生成的窗口。
4、决策报表,由决策报表设计器设置,由w_report_bas窗口拼接设置动态生成sql语句和窗口。
5、调用存储过程的动态报表,由dw_info和dw_proc_query窗口组成,也是由w_dyreport窗口得到过程的返回语句,并显示数据。
6、万能报表,比如零售报表,这是公司准备由决策报表替代的,不再讲述。

在讲述各种窗口前,先讲下窗口上的按钮。
每种窗口上的按钮,大都是一样的。如下图,这是所有按钮对应菜单项的名称,这些菜单项,对应的事件,就是yfc_菜单项名称(比如m_addrow对应的事件是yfc_addrow,m_save对应的事件是yfc_save),当要根据工具栏按钮状态来处理某个问题时,只要判断按钮对应的菜单项的属性Enabled的值。
取得菜单状态的完整语句为:iw_source.im_main.m_edit.m_addrow.enabled
 
,当菜单的任意荐或工具栏某个按钮被触发,都会触发yfc_switchmenu(string as_cond)  事件。于是我们时常在这个事件里,来修改自己添加的按钮的可用性,也可以在datawindow的rowfocuschanged 事件里,判断菜单项的状态来设置行单据字段的属性如protect。
  

下面开始来讲述下,各种窗口的主要自定义事件执行顺序及常用来处理的问题。

2、窗口相关事件
1、打开窗口
任何窗口,都要先创建,才能打开,我们看下窗口打开时的事件触发顺序
事件名        触发的时机
Activate  在窗口激活之前触发
Resize   当用户或程序打开或重设窗口大小时触发
Open    当程序调用以此窗口为参数的Open函数时,此事件在该窗口打开之后,显示之前触发
Show    当程序运行此窗口的show函数时,此事件在窗口显示之前触发
在这些事件里,我们最常用的是open和resize事件,而pfc_postopen事件,同open事件里的一个post event 事件,专用用来在open事件执行完后,再马上触发以便执行对窗口添加控件的自定义语句。而resize事件,则用于窗口大小发生变化后,对窗口内控件位置大小进行重新设置。

 
看上图,经测试,window并不支持constructor事件,而resize的正确写法是:
resize(unsignedlong sizetype,integer newwidth,integer newheight)
而这几个事件的执行顺序是resize、open、pfc_postopen 事件。
在open事件里将设置变量 is_hdr_protectcol来指定哪些列,在添加明细后不允许再修改的单头列。如果要自己加字段,可以在pfc_postopen事件里设置。
 

窗口打开后,我们可能要查询数据,也有可能要新建单据,这样就会有不同的操作,而PB为我们提供了大量的公共事件,常用的有:
 事件名              触发的时机
Clicked               当单击窗口或控件时触发
GetFocus             在此控件得到焦点上时触发
LoseFocus        在此控件失去焦点时触发
Key        当用户击了一个键且插入点不在RichTextEdit编辑控件或数据窗口控件时触发
Timer           在调用Timer函数后,经过了Timer函数指定的时间后触发
这几个事件对于窗口来说,主要有:
key事件,用来处理快捷方式或用户输入时的判断,timer事件循环触发某个事件,比如定期刷新报表,提示之类。
timer事件,要使用timer事件,只需要在某个事件里设置下time(时间)函数的值,让系统间隔多久就执行下timer事件。比如我添加一个按钮叫“开始刷新”,再在按钮的点击事件里开启时钟事件。也可以直接在window的pfc_postopen事件里开启时钟事件
  
Key事件键值请看有道:pb  判断触发键盘按键   附:pb键盘键值枚举值

2、保存数据
数据输入完成,就要保存,这里会有如下图三个事件:
 
三个事件执行顺序是:
1、pfc_begintran:在数据保存前执行,时常用来对保存前的数据进行处理,比如如果没有单据号,设置下单据号,数据有不合规则的,也进行处理下。只是经测试return -1则不会触发pfc_endtran,而是直接调用pfc_save,但数据保存失败。
2、保存数据,之后会提示是否审核数据。
3、pfc_endtran(integer ai_update_results):保存数据提交到数据之后触发,由于这里数据已经保存到数据库了,所以可以再去处理转单,自动打印出来等工作。
4、Pfc_save:在窗口数据操作中,修改了窗口,设置了变量,在这里还原回去
  
 

3、关闭窗口
window关闭时发生的事件:
Deactivate     当窗口变为非活动状态时触发。就是说,在窗口打开后,再打开其他窗口或切换到其他软件时触发。
CloseQuery    当清除或关闭窗口时触发。然后检查Message.ReturnValue的值,若为1,则窗口不能关闭
Close         当关闭窗口时触发
在关闭窗口时,这三个事件的自定义事件执行顺序是CloseQuery,Close,Deactivate。
而pfc_close不支持自定义事件,所以也不用关心,有上面三个事件足够了。
 
这里要注意自定义事件名后面要加(),不然设置return时会报错。

3、数据窗口事件
窗口事件,用得最多的,也就是打开窗口的pfc_postopen事件,保存数据时的pfc_begintran事件。
对PB来说,重中之重,就在数据窗口datawindow,学好了这个,PB的90%就完成了。
先说下窗口的布局,看下图,主窗口和明细窗口,并不是主窗口包含明细窗口,只是明细窗口放在主窗口上面。
 
所以当我们要在窗口里再新建一个子窗口放在明细的下面时,小窗口的的位置,是根据dw_dtl的位置来相对调整的。
 
  
要把数据录入到数据库,首先肯定是新建单据,添加主表明细表了。
添加主表明细单据:使用的是window.pfc_addrow()事件,添加行,并刷新各个字段的下拉列表窗口,设置初始值。一般固定的初值,我们用功能定义的initial属性就可以完成,但有时要根据条件,比如人员权限,来设置初始值,就只有在这个事件里最方便了。
 
取消之前的新建的单据:使用m_cancel对应的windows.yfc_cancel,大部分情况下,我们只是触发这个事件就可以了,在pfc_addrow事件.txt里有实例,但有时,也会用来做pfc_save一样还原窗口、数据的操作。注意这个取消是取消整个单据,而删除一行用datawindow.deleterow()函数就行了。
iw_source.dw_info.of_setsort(true) 
iw_source.dw_info.inv_sort.of_setcolumnheader(true) 
ib_modifing  = false 

修改单据:使用m_modify对应的window.yfc_modify事件。在这个事件里,我们只会用在动态报表里,判断下单据状态来确定是否允许修改单据,比如已经生效的单据就允许再修改了。
 

单据添加好后,就可以输入数据了,为了输入方便,有的字段要添加下拉列表,有的要添加日期选择窗口,有的要允许输入助记码。下面一一道来。
对于数据窗口datawindow,使用最得多的事件有:
1、Clicked、DoubleClicked:单击数据窗口控件中非编辑域或其他位置时触发
2、Constructor:窗口的构造事件,在窗口的open事件发生之前触发。
3、Dropdown:窗口字段下拉列表或下拉窗口下拉时触发
4、EditChanged:在数据窗口控件的编辑控件中按任何键时触发
5、GetFocus:在数据窗口控件得到输入焦点前触发(这个事件发生在该控件被选中并变为活动控件之前)
6、Itemchanged:修改字段值了并且该字段失去输入焦点时触发,按回车、Tab键、箭头键或单击数据窗口中其他字段都会触发。
7、ItemFocusChanged:当焦点从一个可编辑字段切换到另一个可编辑字段时,得到焦点的字段那触发。
8、Rowfocuschanging:当前行要生产变化时触发,该事件在rowfocuschanged事件之前发生。也就是选择一行后,再去点另一个行时触发。rowfocuschanging(long currentrow,long newrow),这里的currentrow是指改变前当前行的等号,0表示没有当前行。Row是新行号
9、Rowfocuschanged:当数据窗口控件的当前行被改变时触发。rowfocuschanged(long currentrow),这里的currentrow是改变后的当前行。

Clicked事件写全了是这样的:clicked(integer xpos,integer ypos,long row,dwobject dwo)
所以可以知道点击的是哪一行哪一列,于是可以在这个事件时,去刷新其他子窗口的数据。详细实例见有道:商品信息设置--主从报表添加子窗口,单击后刷新子窗口数据
客户效期示意表--动态报表添加子窗口,单击后根据字段值刷新子窗口
补货申请--主从报表单击刷新子窗口
 
DoubleClicked事件一般用来打开一个新窗口,并用双击的字段值或这一行的值刷新窗口。事件是标准事件,使用时只要 
全部参数写全:doubledclicked(integer xpos, integer ypos, long row, dwobject dwo)
一般情况下,我们都是使用链接的方式来打开功能窗口,但有时也可以通过双击,来打开一个构造窗口或现有的功能窗口。
打开窗口也可以有两种,一个是调用链接的功能,来打开现有的功能窗口,一个是直接open一个构造窗口,打开链接窗口,一般只是为了查看详细信息,打开构造的窗口一般是用来取得用户选择,详见代码实例
 
Constructor事件是标准事件,一般也只是在这里post event一个事件,来初始化窗口。比如 
一般都是用an()这个名字,在这个an()事件里,可以给时间字段加下拉,指定表字段更新设置,而添加窗口按钮、明细添加字段之类,都在pfc_postopen事件,下面一个个列出来。
 

Dropdown事件是标准事件,在字段的下拉列表弹出时,触发的,所以只用来处理更新下拉列表。有时也在ItemFocusChanged事件更新下拉列表里,再手动去触发这个事件,实现在字段获得焦点时,就把下拉自己弹出来。但有的功能里,又不起作用,那只有直接模拟按钮的方式。
    lw_source.keybd_event ( 18, 0, 0 , 0 ) // 按下alt
    lw_source.keybd_event ( 40, 0, 0 , 0 ) // 按下下箭头
    lw_source.keybd_event ( 18, 0, 2, 0 ) // 释放shift
 

EditChanged标准事件,全写是editchanged(long row,dwobject dwo, string data) return long
使用时只要 。由于这个事件是字段得到焦点后按键就触发,又不是所有功能都支持这个事件自定义,所以反而使用得很少,一般就用来限制输入,也有的用来实现和网页一个的实时更新下拉列表。
对于零售收款之类的小窗口,都是把他们的dw_info.EditChanged/Itemchanged放到window里来,于是就有了w_inputpayamt.DW_INFO$EDITCHANGED(long row,dwobject dwo,string data),DW_INFO$ITEMCHANGED(long row,dwobject dwo,any data)
 
Itemchanged标准事件,全写是:itemchanged(long row,dwobject dwo,string data) return long
和ItemFocusChanged两个事件,是datawindow里使用得最多的事件,
只要涉及到根据用户输入的结果马上进行数据处理的,都会用到这个事件,比如输入助记码弹出选择列表,对输入的内容进行检验,根据输入的内容去给其他字段赋值,大量的弹出列表见有道“**在itemchanged事件里,调用资料”
 
ItemFocusChanged标准事件,itemfocuschanged(long row , dwobject dwo)
 
是在字段看到焦点时触发的,像选择下拉列表后,弹出列表窗口用户选择后,根据用户的输入处理后面其他字段的数据,用Itemchanged事件取得不到当前字段的值,这样,可以在当前字段的下一个字段得到焦点触发ItemFocusChanged时来处理。比如用户输入商品助记码弹出商品列表选择商品后,要刷新相应的下拉列表。选择下拉时图省事,不想去取用户选择的下拉,可以在跳转到下一个字段时,再去根据用户的选择来处理数据。
 
Rowfocuschanging:是焦点离开这一行时触发的,用得不多。在当前行输入数据后回来,会触发itemchanged事件,可如果当列有默认值,我们没有修改数据,直接回车,就不会触发itemchanged事件,这样如果要对数据进行处理,就需要使用Rowfocuschanging事件。有时当我们正在编辑一行数据时,不允许数据没处理完,就去选择其他行,也在这个事件里处理。但现在这个事件支持不完全,还有点问题
 
Rowfocuschanged事件是标准事件,当点击一行时就触发。所以可以根据每一行的值,来处理某些事件,比如根据单据状态,来修改自定义事件的状态或窗口菜单工具栏的状态。根据行的字段值,设置自定义的子窗口的值。
 
pfc_preupdate非标准事件,而且只有dw_info才支持。
在pfc_begintran之后,数据更新到数据之前触发。使用上与pfc_begintran事件有点重叠。 
 
pfc_predeleterow事件为非标准事件,在删除明细前触发,很少使用,我也只见过由于在输入商品后把数据保存到一个D表,现在又要删除这个品种,所以要从D表里把之前插入的数据删除掉。 
 
4、窗口与datawindow之间数据交换


4、数据查询的控制
动态报表查询数据时会用到的事件,就这几个了,执行顺序如下
1、yfc_retrieve
2、yfc_preretrieve(ref n_cst_sqlattrib inv_sqlattrib[]) 
3、retrievestart
4、retrieveend
5、pfc_retrieve()
 
yfc_retrieve事件:点击查询按钮时触发,之后弹出查询窗口。数据查询完之后触发,最重要的功能,
对决策报表的字段进行处理,由于决策报表在点查询按钮时,才创建报表的列,所以如果用动态报表一样的扩展权限,没有办法实现功能,只有在查询时,判断指定的列是否存在,再做处理。
要查询前对窗口进行调整,比如在其他功能里设置了窗口的过滤,可以在查询前把过滤清除掉。
要查询数据前,对窗口进行重构
 

yfc_preretrieve自定义事件,在点查询条件窗口的确定按钮后,查询执行之前触发,在这里我们可以去修改最终要执行的sql语句。全写:yfc_preretrieve(ref n_cst_sqlattrib inv_sqlattrib[]) 
比如零售占比报表,动态报表里的语句使用了一些特殊字符来作为将来替换的标识,我们就要在查询确定后,把查询条件里的时间替换到sql语句里来,得到最终的占比分析语句。
由于替换特殊字符是每次查询都要替换,所以一般在pfc_postopen里,把报表的原始语句,保存到一个共享变量is_sql里,替换好代码查询完,再在retrieveend事件里,把报表代码还原回来,不然下次就没的替换了。
 

retrievestart事件是标准事件,和yfc_preretrieve自定义事件一样,是在查询执行前触发,所以两者做的是一样的事件,在查询前,对窗口,对要查询的SQL语句,进行处理。
 
retrieveend事件是标准事件,要查询结束后触发的事件。
最常用的是用来还原报表的sql语句。
查询结束后,对窗口进行调整,比如设置列的名称,实现不同的查询条件,列名称也变化。
实现占比、结余、累计等计算列,在这里非常好处理,只要添加一个空列,再查询结束后对这个列循环赋值,只是赋值时要把列缓存状态改为notmodified!,不然关窗口时,会提示你要保存数据。
 

5、自定义控件
自定义事件,可以用uo_usercbs按钮组来提供大量的按钮,还可以自定义控件,可以自己创建按钮、静态文本框、文本输入框、格式化输入框、选择框,下拉列表、子窗口等。
一般这些控件,都在pfc_postopen事件里创建,下面来一一说明下。
uo_usercbs按钮组是系统标准组件,所有窗口里都有,只是处理隐藏状态,我们要使用,只需要显示出来,再指定按钮名称,就可以了。
 
添加其他自定义控件,则先要在pfc_postopen里创建共享变量,定义格式如下:
u_em  em_begindate    //格式化输入文本框变量
statictext  st_begindate  //静态文本框
duo_sle  sle_period     //普通录入框
u_cbx  cbx_status      //选择框checkbox
u_ddlb  ddlb_list       //下拉列表框 
duo_cb  cb_retrieve2    //按钮
duo_dw  idw_list          //子窗口


添加好共享变量后,就可以在pfc_postopen事件或pfc_postopen事件里调用的事件里,创建控件
 
变量创建好,就要处理这些控件发生的事件,这里我们用到的是
ue_duo_events(powerobject apo,string eventname,string as_value,long al_value)
 
这个事件,在所有窗口里都会有,参数分别是:
Apo:触发事件的控件对象
Eventname:控件对象触发的事件
As_value:触发事件的控件对应返回的字符串值,比如编辑框和itemchanged事件里的用户输入
Al_value:触发事件的控件对应返回的数值,比如itemchanged事件里的行号
用到的事件名称    
modified    编辑框、格式化编辑框、checkbox、下拉列表框
getfocus    编辑框、格式化编辑框、checkbox、下拉列表框、子窗口
losefocus    编辑框、格式化编辑框、checkbox、下拉列表框、子窗口
clicked    按钮控件、checkbox
doubleclicked    按钮控件、checkbox
itemchanged    子窗口
rowfocuschanged    子窗口
dropdown    子窗口
key    子窗口
 

6、打印
打印只有两个工具栏按钮事件,分别是pfc_print(),pfc_printimmediate()
Pfc_print():是打印预览按钮事件,打开预览窗口
pfc_printimmediate():打印按钮事件
 
所以对标准的打印,除了和统一打印价格签一样创建一个临时表,用于动态提取时调取数据之后,也没什么可操作的。
 
 

有部分客户,要求实现打印时,一次就打印多个打印方案,或根据不同的客户打印到不同的方案,而不同的方案,可能要打印到不同的打印机上。这就要用到一个函数
ue_打印(w_print aw_print,string as_方案名,string as_打印机名)
代码内容见文档,通过打印打印机 和方案名称,就可以实现上面的各种要求。
使用这个事件时,要注意一个情况,如果在一个for循环里,调用ue_打印()实现批量打印,如果在循环里用post event ,那么最终只要打印最后那一个单据,如果用event也可能只打印其中一个或几个单据,并没有打印,因为打开窗口和执行打印都需要时间,循环太快,导致漏打。
 

还可能在一个窗口,调用另一个窗口的打印方案,这个就不是一种技术了,只是一种思路。比如零售小票上打印二维码,就是创建一个动态报表,给报表设置一个打印格式,在打印完小票后,再打开动态报表,触发它的打印按钮,再二维码打印在小票的后面。
 

7、构建窗口与数据交换
上面的实例中,已经有好多自定义构建窗口,再打开给客户看下或可以取得用户选择,并进行处理。但这里,还是专门拿出来,把几种弹窗汇总下。

1、itemchanged事件弹出选择窗口。用得最多的,是在itemchanged事件里把一个select语句构造一个窗口,再用w_select弹出来给客户查看和选择。也可以把一个现在的PB窗口,直接弹出或添加过滤条件后,用w_select弹出。
 
2、ue_transdata 自定义事件,在窗口与弹出的子窗口交换数据时触发,比如入库单点右边订单按钮时调用。
最常用来在数据调出后,修改dw_dtl/dw_hdr里的数据,全写:ue_transdata(u_dw adw_dw)
点击按钮后,打开PB窗口到w_transdata_dtl,交换数据
iw_source.is_transbill = "dw_sprdist_m"
    openwithparm(w_transdata_dtl,iw_source)
 
3、多项选择窗口w_multi_choose,有时客户希望一次多个选择结果,而不是和w_select一样一次只得到一个选择结果,那么就要用w_multi_choose,这个窗口可以让用户勾选多个项目,并把选择项的结果,用一个由“,”分隔的字符串返回。
多选窗口使用很简单,先打开窗口,再取得返回结果
OpenWithParm ( w_multi_choose, lstr_choose )
lstr_choose = Message.PowerObjectParm
dw_hdr.object.notes[row] = lstr_choose.as_return_data
所以唯一要做的,就是设置好结构体str_multi_choose
结构类型    字段    说明
string    as_title    多选窗口标题
string    as_dwname    数据窗名,源码中已有的数据窗可以直接使用
string    as_dw_sql    sql语句,根据sql语句动态生成数据窗,用  /*{}*/  来记录modify语句
注意:as_dwname和as_dw_sql必须传入一个值;
string    as_part    传入和传出数据as_data、as_return_data的分隔符,可以是字符串,as_part为空时默认“,”
string    as_data_col    用来判断选择列表的数据列名, as_data_col必须传入;
string    as_data_colname    返回用的名称字段
string    as_where    数据窗sql的where条件
string    as_data    传入的数据,会根据上面的设置,自动勾选对应的数据(就是默认值)
string    as_return_data    返回由as_data_col获取的数据,用as_part分割的字符串
string    as_return_name    返回由as_data_colname获取的数据,用as_part分割的字符串
boolean    ab_readonly    默认FALSE,是否只读,只预览不修改
integer    width    窗口宽度,大于0才生效
integer    height    窗口高度,大于0才生效
string    as_select_func    指定功能,模糊查询时改用专用查询
boolean    onlyadd    只允许新增
    注意:由于多项选择,必须有一个可以勾选的列checked,如果没有这个列的datawindow,就不能作为as_dwname的参数。所以一般情况下,都是自己写一个select语句,还方便一些 
 

4、用w_trans窗口显示数据,用上一种窗口,窗口是不可以修改过滤数据的,如果要在弹出的窗口里,就对数据进行预处理,则要用w_trans。
用w_trans打开的窗口,可以像零售收款里的子窗口一样,支持自定义事件,对窗口进行操作,比如在窗口里输入数量时,对数量进行判断,点确定按钮时,把数据提交到父窗口。
如果select语句有列selectedstatus字段,会自动将selectedstatus字段变成checkbox风格。
W_trans窗口,通过设置结构体 s_trans,来指定打开的窗口的属性,
global type s_trans from structure
string popname            窗口标题名
window sourcewindow    空窗口,也就是iw_source
boolean multirow    是否允许多选
boolean modify        指定弹出窗口里的字段,是否允许手工输入值
string dwname        弹出窗口对象,PB里现成的窗口,构建datawindow时。如果dwname不为空,则直接取dwname;否则根据SQL动态构建datawindow
string sql            弹出窗口要显示的select语句
boolean noretrieve    是否自动刷新窗口数据,true不自动刷新,false自动刷新
string where        弹出窗口的where条件
string sort            字段排序方式
string extcommand    窗口的功能定义一样的指定列属性的命令
string ext1
string ext2
string ext3
string ext4
string ext5
string ext6
string ext7
string ext8
string ext9
string ext10
string eventobj        触发事件的控件名称,如window,dw_dtl,cb_clear,cb_all,cb_ok,cb_cancel,sle_find
string eventname    被触发的事件名称,如COLSE,KEY,OPEN,PFC_CREATEDW,PFC_POSTOPEN,PFC_POSTRETRIEVE,PFC_PRERETRIEVE,PFC_RETRIEVE,CLICKED,ITEMCHANGED,ITEMFOCUSCHANGED
any eventpara1        保存标准事件的第一个参数值,如在key事件是 key值,在clicked事件是xpos,在ITEMCHANGED事件是row
any eventpara2        保存标准事件的第二个参数值,如在key事件是keyflags值,在clicked事件是ypos,在ITEMCHANGED事件是DWO
any eventpara3        保存标准事件的第三个参数值,如在clicked事件是row,在ITEMCHANGED事件是DATA
any eventpara4        保存标准事件的第四个参数值,如在clicked事件是dwo,
any returnvalue        保存标准事件的返回值
any arg[20]
end type

结构体说完,再说下w_trans控件列表,不仅有我们查看到的查找输入框,确定取消按钮,还有一些不可见的预设控件,下面列表显示
Eventobj值    类型    状态    Eventname值(大写)    返回值    eventpara1,eventpara2...的值
WINDOW
(W_trans)    主窗口    可见    CLOSE    long    
            KEY    long    Keycode key, unsignedlong keyflags
            Open    long    
            PFC_CREATEDW    long    无,窗口创建前执行
            PFC_POSTOPEN    long    窗口打开后执行,在这刷新数据
            PFC_POSTRETRIEVE    long    刷新数据后执行
            PFC_PRERETRIEVE    long    刷新数据前执行
            PFC_RETRIEVE    long    刷新数据,执行后触发 pfc_postretrieve()
St_1    statictext    可见    无        窗口说明:“Ctrl + Clicked 进行单选....”
st_find    statictext    可见    无        全局快速搜索:(&J)
Sle_find    单行文本控件    可见    无        
DW_DTL    U_dw窗口    可见    CLICKED    long    
            DOUBLECLICKED    long    
            ENTER    long    按tab或回车时触发,如果数据窗口不可编辑,直接触发cb_ok
            ITEMCHANGED    long    
            ITEMFOCUSCHANGED    long    
            KEY    long    
            LBUTTONDOWN    long    
            LBUTTONUP    long    
            MOUSEMOVE    long    Xpos,ypos,row, dwo
            ROWFOCUSCHANGED    long    CURRENTROW
            ROWFOCUSCHANGING    long    Currentrow,newrow
Cb_all    U_cb 按钮    可见    CLICKED    long    如果有选择列selectedstatus则全部勾上
Cb_clear    U_cb 按钮    可见    CLICKED    long    如果有选择列selectedstatus则全部不选
Cb_ok    U_cb 按钮    可见    CLICKED    long    确定并关闭窗口
Cb_cancel    U_cb 按钮    可见    CLICKED    long    关闭窗口
P_1    U_p图片按件    不可见    无        
St_user01    statictext    不可见    无        
St_user02    statictext    不可见    无        
Sle_user01    单行文本控件    不可见    GETFOCUS    long    得到焦点时触发
            LOSEFOCUS    long    失去焦点时触发
            MODIFIED    long    修改时触发
Sle_user02    单行文本控件    不可见    GETFOCUS    long    得到焦点时触发
            LOSEFOCUS    long    失去焦点时触发
            MODIFIED    long    修改时触发
Cb_user01    按钮    不可见    CLICKED    long    
Cb_user02    按钮    不可见    CLICKED    long    
Cb_user03    按钮    不可见    CLICKED    long    
Mle_1    多行文本控件    不可见    无        
注:Eventobj值就是控件名的大写
通过设置这些控件,我们可以把这个窗口改得非常复杂,也可以通过window的事件,来创建自己的控件。
要使用这个窗口,首先必须是父窗口要有ue_trans_event(w_trans aw,s_trans astr)事件
通过windows 的ue_trans_event(w_trans aw,s_trans astr)事件,可以对trans窗口,进行控制。
对于ue_trans_event事件,我们在事件里,判断下结构体astr的属性eventobj来确定控件,eventname是事件名称。eventpara1-4等对应的就是事件的参数列表。比如下面这个确定按钮事件。

IF astr_trans.eventobj = "CB_OK" and astr_trans.eventname = "CLICKED" THen
    ls_orderno = iw_source.dw_hdr.OBJECT.orderno[ll_hdrrow]
    if isnull(ls_orderno) Or trim(ls_orderno) = '' THen
    Else
        IF ls_orderno <> aw.dw_dtl.OBJECT.indentno[ll_dtlrow]  THen
            MessageBox('提示','亲,不允许多订单收货,现在入库的订单为:['+ls_orderno+']')
            Return
        end IF
    End if
    if iw_source.event UE_TRANSDATA(aw.dw_dtl) < 1 Then Return
end if

如果会处理很多事件,最好一开始就确定每个事件的处理都用一个事件名,省得代码太长,不好看
dw_info.buttonclicked(long row,long actionreturncode,dwobject dwo)

destructor
UE_BATCH_INPUT(long row,dwobject dwo,string data )
resize(unsignedlong sizetype, integer newwidth,integer newheight)
timer
ue_retrieve(string as_no)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱生活的泷哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值