找回密码
 加入
搜索
查看: 4705|回复: 20

GUICtrlSetOnEvent如何向映射函数传递参数?

[复制链接]
发表于 2008-5-23 11:24:44 | 显示全部楼层 |阅读模式
一般情况是这样的。
GUICtrlSetOnEvent($okbutton, "OKButton")
Func OKButton()
  MsgBox(0, "GUI 事件", '您按下了"确定"按钮!')
EndFunc
现在想在函数映射的时候向OKButton()传递一个参数,如何做到。



后附结论:现在无法传参,没有好的解决办法。

[ 本帖最后由 jiataifeng 于 2008-5-24 07:57 编辑 ]
 楼主| 发表于 2008-5-23 11:29:00 | 显示全部楼层
也就是想:
Func OKButton($a)
  MsgBox(0, "GUI 事件", $a')
EndFunc
发表于 2008-5-23 15:31:04 | 显示全部楼层
事件模式时, 你可以访问内部宏 , 如下
@GUI_CtrlId 最后点击的控件标识(Control ID). 只是使用event 函数时有效.
@GUI_CtrlHandle 最后点击的控件句柄(Control handle). 只是使用event 函数时有效. 请参考UICtrlSetOnEvent 函数.
@GUI_DragID 拖动控件标识(Control ID).  只是使用event 函数时有效. 请参考UICtrlSetOnEvent 函数.
@GUI_DragFile 拖动文件(到控件)的文件名. 只是使用event 函数时有效. 请参考UICtrlSetOnEvent 函数.
@GUI_DropID 拖动文件(到控件)的文件名. 只是使用event 函数时有效. 请参考UICtrlSetOnEvent 函数.
@GUI_WinHandle 最后点击的GUI窗口句柄(GUI window handle). 只是使用event 函数时有效. 请参考UICtrlSetOnEvent 函数.


你想函数加参数, 无非是想一函数多用,  你可以根据以上的宏来判断并进而进行操作就可以了
 楼主| 发表于 2008-5-23 19:05:05 | 显示全部楼层
你说的没错,只是还不够。
而且,我没有用GUI。@GUI_CtrlId 在程序里也试了,出错退出。
程序使用的是多维控件数组,控件是动态建立的,其事件过程也是动态。
所以,只知道表示标识似乎还不够,至少应该传递一个参数$i。
 楼主| 发表于 2008-5-23 19:15:15 | 显示全部楼层
我用替代的办法解决的。
每获得一个消息,将所有的控件扫描一遍。相同则触发。
如果能传递参数,就没这么麻烦了。
发表于 2008-5-23 20:29:44 | 显示全部楼层
动态建立的GUI控件不一样注册事件么,  为什么不能用@GUI_CtrlId 呢

有必要的话, 请贴一下你代码

不过你问题已解决了, 无所谓了
 楼主| 发表于 2008-5-23 20:58:25 | 显示全部楼层
代码很简单。
请将附件压缩包里的ini文件和脚本放在一个目录里运行。
#include <IE.au3>
Opt("TrayMenuMode", 1)
Opt("GUIOnEventMode", 1)
Dim $MenuItem[100]
$meun = -1
$aData1 = IniReadSection("favorate.ini", "web")
For $i = 1 To UBound($aData1) - 1
        $MenuItem[$i] = TrayCreateItem($aData1[$i][0], $meun)

        If $aData1[$i][1] = 1 Then
                TrayItemDelete($MenuItem[$i])
                $meun = TrayCreateMenu($aData1[$i][0])
        EndIf
        
Next
TrayCreateItem("")
$MenuItem0 = TrayCreateItem("退出")
While 1
        $msg = TrayGetMsg()

        For $i = 1 To UBound($aData1) - 1
                If $msg = $MenuItem[$i] Then
                        openweb($aData1[$i][1])
                ElseIf $msg = $MenuItem0 Then
                        Exit
                EndIf
        Next
WEnd
Func openweb($www)
        $oIE = _IECreate($www, 0, 1, 0)
        $hwnd = _IEPropertyGet($oIE, "hwnd")
        WinSetState($hwnd, "", @SW_MAXIMIZE)
EndFunc   ;==>openweb

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2008-5-23 21:08:07 | 显示全部楼层
控件少也罢,控件多了的话,这种方法肯定不行。
问题主要在while 1...wend 里。靠列举控件来判断事件已经不可行。逐个扫描效率又太低。
onevent如果能给函数传递参数那就太好了。不知道为什么不可以。。。
发表于 2008-5-23 22:01:43 | 显示全部楼层
你这用法可不是事件模式了, 虽然你提前声明了...

你没说清楚, 原来你用的TRAY,       事件模式中,TRAY有专门的宏
@TRAY_ID Last clicked item identifier during a TraySet(Item)OnEvent action.
@TrayIconFlashing Returns 1 if tray icon is flashing; otherwise, returns 0.
@TrayIconVisible Returns 1 if tray icon is visible; otherwise, returns 0.
去看看帮助吧, 很清楚了
 楼主| 发表于 2008-5-23 22:11:07 | 显示全部楼层
事件模式行不通,就换了呀。
还有TRAY的宏我也测试了呀,也是错误退出。没法用。。。
 楼主| 发表于 2008-5-23 22:17:07 | 显示全部楼层
tray只有三个宏:

1@TRAY_ID  事件模式中获得消息的菜单项的ID---> 只知道ID没多大用处呀,要想知道此ID对应的$i,就此例来说,是要找到某个ID的菜单项对应的$aData1[$i][1],按这种方法,还得对所有控件扫描搜索,来获得$i。

2.@TrayIconFlashing  托盘图标闪动,毫无干系。

3.@TrayIconVisible  托盘图标不可见,无关。

还有别的宏吗??
发表于 2008-5-23 22:18:24 | 显示全部楼层
能把你出错的测试代码发上来吗, 我觉得理论上可行的


实际使用AU3时, 发现这脚本语言还有很多不成熟, 语法不严谨,  使用不规范, 合理的语法有时却行不通.....数组的使用上, 很费劲....操作函数太贫乏无力....
发表于 2008-5-23 22:44:17 | 显示全部楼层
1@TRAY_ID 事件模式中获得消息的菜单项的ID---> 只知道ID没多大用处呀,要想知道此ID对应的$i,就此例来说,是要找到某个ID的菜单项对应的$aData1[$i][1],按这种方法,还得对所有控件扫描搜索,来获得$i。

关于这点, 确实得想其他办法解决,  因为你创建的TRAY控件不包含你想传递的参数值, 譬如把网址也放进TRAY菜单, 然后事件自定义函数中,解析这个TRAY_ID的信息,得到地址, 并打开...

显然, 放进网址,  会影响美观, 不是你想要的, 这里我只能找另个不严谨的做法了:
我们发现在AU3创建控件时, 其ID值是逐一增加的, 因为你创建的TRAY地址菜单时是连贯的, 所以其ID也是逐一增加的, 所以, 你该知道怎么做了...
 楼主| 发表于 2008-5-23 23:59:12 | 显示全部楼层
网址放到菜单里也可以啊。可以用函数将它分离出来。问题是,即便@TRAY_ID 能用,那只是个ID啊,如何找到与该ID对应的各项资源?(是不是还是要扫描所有控件),比如菜单的内容。
 楼主| 发表于 2008-5-24 00:00:13 | 显示全部楼层
控件少了怎么都好说。
多了就看出来严密与效率了。
10000个控件如何?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 17:45 , Processed in 0.078055 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表