- 1、本文档共111页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
IDL数据分析和图像化应用程序及编程语言培训
编程篇 -数据传递 有问题发生 事实上,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
文档评论(0)