jiataifeng 发表于 2008-5-23 11:24:44

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

一般情况是这样的。
GUICtrlSetOnEvent($okbutton, "OKButton")
Func OKButton()
MsgBox(0, "GUI 事件", '您按下了"确定"按钮!')
EndFunc
现在想在函数映射的时候向OKButton()传递一个参数,如何做到。



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

[ 本帖最后由 jiataifeng 于 2008-5-24 07:57 编辑 ]

jiataifeng 发表于 2008-5-23 11:29:00

也就是想:
Func OKButton($a)
MsgBox(0, "GUI 事件", $a')
EndFunc

llztt 发表于 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 函数.


你想函数加参数, 无非是想一函数多用,你可以根据以上的宏来判断并进而进行操作就可以了

jiataifeng 发表于 2008-5-23 19:05:05

你说的没错,只是还不够。
而且,我没有用GUI。@GUI_CtrlId 在程序里也试了,出错退出。
程序使用的是多维控件数组,控件是动态建立的,其事件过程也是动态。
所以,只知道表示标识似乎还不够,至少应该传递一个参数$i。

jiataifeng 发表于 2008-5-23 19:15:15

我用替代的办法解决的。
每获得一个消息,将所有的控件扫描一遍。相同则触发。
如果能传递参数,就没这么麻烦了。

llztt 发表于 2008-5-23 20:29:44

动态建立的GUI控件不一样注册事件么,为什么不能用@GUI_CtrlId 呢

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

不过你问题已解决了, 无所谓了

jiataifeng 发表于 2008-5-23 20:58:25

代码很简单。
请将附件压缩包里的ini文件和脚本放在一个目录里运行。
#include <IE.au3>
Opt("TrayMenuMode", 1)
Opt("GUIOnEventMode", 1)
Dim $MenuItem
$meun = -1
$aData1 = IniReadSection("favorate.ini", "web")
For $i = 1 To UBound($aData1) - 1
        $MenuItem[$i] = TrayCreateItem($aData1[$i], $meun)

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

        For $i = 1 To UBound($aData1) - 1
                If $msg = $MenuItem[$i] Then
                        openweb($aData1[$i])
                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

jiataifeng 发表于 2008-5-23 21:08:07

控件少也罢,控件多了的话,这种方法肯定不行。
问题主要在while 1...wend 里。靠列举控件来判断事件已经不可行。逐个扫描效率又太低。
onevent如果能给函数传递参数那就太好了。不知道为什么不可以。。。

llztt 发表于 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.
去看看帮助吧, 很清楚了

jiataifeng 发表于 2008-5-23 22:11:07

事件模式行不通,就换了呀。
还有TRAY的宏我也测试了呀,也是错误退出。没法用。。。

jiataifeng 发表于 2008-5-23 22:17:07

tray只有三个宏:

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

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

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

还有别的宏吗??

llztt 发表于 2008-5-23 22:18:24

能把你出错的测试代码发上来吗, 我觉得理论上可行的


实际使用AU3时, 发现这脚本语言还有很多不成熟, 语法不严谨,使用不规范, 合理的语法有时却行不通.....数组的使用上, 很费劲....操作函数太贫乏无力....

llztt 发表于 2008-5-23 22:44:17

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

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

显然, 放进网址,会影响美观, 不是你想要的, 这里我只能找另个不严谨的做法了:
我们发现在AU3创建控件时, 其ID值是逐一增加的, 因为你创建的TRAY地址菜单时是连贯的, 所以其ID也是逐一增加的, 所以, 你该知道怎么做了...

jiataifeng 发表于 2008-5-23 23:59:12

网址放到菜单里也可以啊。可以用函数将它分离出来。问题是,即便@TRAY_ID 能用,那只是个ID啊,如何找到与该ID对应的各项资源?(是不是还是要扫描所有控件),比如菜单的内容。

jiataifeng 发表于 2008-5-24 00:00:13

控件少了怎么都好说。
多了就看出来严密与效率了。
10000个控件如何?
页: [1] 2
查看完整版本: GUICtrlSetOnEvent如何向映射函数传递参数?