文档详情

idl.ppt

发布:2015-09-15约2.95万字共111页下载文档
文本预览下载声明
编程篇 -数据传递 有问题发生 事实上,sState是一个局部变量,因此当绑定给TLB_ID时,是copy了一份到全局内存。而当事件处理程序获得用户数据时,又是从全局内存中copy一份到该事件处理程序的局部变量中。于是,一份数据就有了3份copy。 指定/NO_COPY关键字,就只使用一份。 烦恼: (1)copy一事会给我们带来烦恼。因为一旦no_copy,则当前的用户数据变量就不再有效。这意味着返回用户数据的命令应该是事件处理程序的最后一行,显然这是不现实的。 (2)事实上,必须返回用户数据才会使修改有效这件事也会给我们带来烦恼,这要求我们必须时刻保持警惕!是不是精神会有点紧张?:) 编程篇 -数据传递 解决的方法 用一个指针变量可以解决这个问题! (我们不必等IDL把用户数据copy到全局内存,我们有能力自己干!) TLB: sState={ … } pState=ptr_new(sState ,/no_copy) widget_control ,TLB_id ,set_uvalue=pState EH: widget_control ,ebent.top ,get_uvalue=pState 这时,*pState 就是 sState 有了指针,我们方便多了! (1)任何修改立即生效,免去返回的烦恼。 (2)由于指针仅仅是“指针”,我们可以在sState里也设置一些必要的指针,比如数组指针,这样又可以免去结构数据不能更改数组维数的烦恼。 编程篇 -数据传递 没有免费的午餐! 指针仍然有一个小小的问题。必须在cleanup里将指针释放,否则会引起内存泄漏。 最后 没有证据证明传递 sState 和 pState 哪一个更好。 由于用户数据是值传递,这就带给我们可以在愿意的时候随便传递一个“什么”给TLB的便利。这时,使用pState未必就比使用sState更方便。你需要ptr_free() ! 再者,太多的 * 仍然带来麻烦。 编程篇 -数据传递 widget_list 和 widget_droplist 的 uvalue 通常我们在 list 里放置的是带有说明性的字符串数组,然而一旦进入事件循环我们就再也不会得到这个数组,我们只能得到这个数组的 index 值,即数组下标。 通过绑定字符串数组到 list_id 就可以在需要的时候仍然得到特定的字符串 TLB: widget_control ,list.id ,set_value = aStr widget_control ,list.id ,set_uvalue = aStr EH: index = widget_info( list_id ,/droplist_select ) OR index = widget_info( list_id ,/list_select ) widget_control ,list.id ,get_uvalue = aStr string = aStr[index] 编程篇 -操作组件 操作组件分为两个部分:获取组件属性和设置组件属性 widget_info函数用来获取组件属性,widget_control函数用来设置组件属性 result=widget_info(widget_id , …… ) general: ,/uname ,find_by_uname=string ,/valid_id ,/geometry widget_droplist: ,/droplist_select widget_list: ,/list_select widget_control ,widget_id , …… general: ,/hourglass ( no widget_id ) ,/realize ,map=0|1 ,sensitive=0|1 ,/destroy ,get_uvalue= value ,set_uvalue= value ,send_event={…} widget_base: ,cancel_button=button_id (for modal) ,/iconify widget_draw: ,draw_xsize=int ,draw_ysize=int ,get_draw_view=var
显示全部
相似文档