事件模式 FUNC 内的 控件变量是否全部都要设成Global 才可以??[已解决]
本帖最后由 kk_lee69 于 2017-7-24 10:20 编辑事件模式 FUNC 内的 控件变量是否全部都要设成Global 才可以??
请看以下的概念程序代码
Opt("GUIOnEventMode", 1) ;使用事件模式
$WinMain = GuiCreate("主程式".....)
MENU1()
While 1
Sleep(20)
WEnd
Func GUI_COMMAND()
Case $BUTTON1
MENU1()
Case $BUTTON2
MENU2()
Case $B1
Case $B2
Case $B3
Case $B4
Case $B5
Case $B6
.
.
CASE $B100
EndFunc
Func MENU1()
$B1
$B2
$B3
.
.
.
$B100;100個按鈕
GUICtrlSetOnEvent($B1, "GUI_COMMAND")
GUICtrlSetOnEvent($B2, "GUI_COMMAND")
.
.
EndFunc
如上所示
MENU1() 的100个 按钮 是否全部必须要设为 Global才可以??
这样写下来 不就几乎 所有的 控件都是 Global
有没有更好的写法可以讓 FUNC 裡面的盡量是 Local
另外 耗用資源有差異嗎
200個 Global 跟100個 Global 加上 100 Local
這樣兩種方式資源的耗用有差異嗎??
其實我的問題與疑問跟
http://www.autoitx.com/forum.php?mod=viewthread&tid=24528&highlight=%C8%AB%BE%D6
這篇文章中的疑問一樣事件模式 有太多的變數傳遞問題
求大神教学一下 回复 1# kk_lee69
Global是声明全局变量
这样就不用声明全局变量
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1) ;使用事件模式
$WinMain = GUICreate("主程式")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Form1Close")
$BUTTON1 = GUICtrlCreateButton('方式1', 15, 125, 100, 25)
$BUTTON2 = GUICtrlCreateButton('方式2', 125, 125, 100, 25)
$B3 = GUICtrlCreateButton('方式3', 235, 125, 100, 25)
$B100 = GUICtrlCreateButton('方式4', 15, 165, 100, 25) ;100個按鈕
GUISetState(@SW_SHOW, $WinMain)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
Sleep(20)
WEnd
Func _Form1Close()
GUIDelete()
Exit
EndFunc ;==>_Form1Close
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $hWndFrom = $lParam
Local $wID = _WinAPI_LoWord($wParam)
Local $iCode = _WinAPI_HiWord($wParam)
Switch $wID
Case $BUTTON1
MsgBox(0, "", "Button1", 1)
GUICtrlSetData($wID, '点击了')
Case $B3
MsgBox(0, "", "B3", 1)
GUICtrlSetData($wID, '点击了')
Case $BUTTON2
MsgBox(0, "", "Button2", 1)
GUICtrlSetData($wID, '点击了')
Case $B100
MsgBox(0, "", "B100", 1)
GUICtrlSetData($wID, '点击了')
EndSwitch
EndFunc ;==>WM_COMMAND
回复 1# kk_lee69
这样就得声明全局变量
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1) ;使用事件模式
Global $BUTTON1, $BUTTON2, $B3, $B100
WinMain()
Func WinMain()
$WinMain = GUICreate("主程式")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Form1Close")
$BUTTON1 = GUICtrlCreateButton('方式1', 15, 125, 100, 25)
$BUTTON2 = GUICtrlCreateButton('方式2', 125, 125, 100, 25)
$B3 = GUICtrlCreateButton('方式3', 235, 125, 100, 25)
$B100 = GUICtrlCreateButton('方式4', 15, 165, 100, 25) ;100個按鈕
GUISetState(@SW_SHOW, $WinMain)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
EndFunc ;==>WinMain
While 1
Sleep(20)
WEnd
Func _Form1Close()
GUIDelete()
Exit
EndFunc ;==>_Form1Close
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $hWndFrom = $lParam
Local $wID = _WinAPI_LoWord($wParam)
Local $iCode = _WinAPI_HiWord($wParam)
Switch $wID
Case $BUTTON1
MsgBox(0, "", "Button1", 1)
GUICtrlSetData($wID, '点击了')
Case $B3
MsgBox(0, "", "B3", 1)
GUICtrlSetData($wID, '点击了')
Case $BUTTON2
MsgBox(0, "", "Button2", 1)
GUICtrlSetData($wID, '点击了')
Case $B100
MsgBox(0, "", "B100", 1)
GUICtrlSetData($wID, '点击了')
EndSwitch
EndFunc ;==>WM_COMMAND
回复 2# chzj589
我懂但是我要問的是 FUNC 裡面的變數也要 變成全局不就等同
只有全局沒有 LOCAL 了.....
我想找到 可以使用LOCAL 但是 又可以傳遞給全局的方法
你可以看看 這篇文章 其實他的疑問是跟我一樣的
http://www.autoitx.com/forum.php?mod=viewthread&tid=24528&highlight=%C8%AB%BE%D6 本帖最后由 afan 于 2017-7-12 13:14 编辑
事件模式直接用一个控件数组 + @GUI_CtrlId 匹配就行了
或者使用单独的函数定义,那就不用控件变量了 回复 4# kk_lee69
学无止境,精益求精。 回复 5# afan
了解
只是 想請教 如果我全部使用 全局變量
會有甚麼缺點嗎 ??會比較耗用資源嗎?? 回复 5# afan
了解
只是我通常寫ERP 因此 有非常多的控件都是EDIT控件,這些控件 用不到 CASE,通常使用CASE 都是BUTTON ,但是EDIT控件 經常 要 GUICtrlSetData 或者 GUICtrlRead以前通常用 $TC001 或者 $TC002 這樣子 去記現在要變成控件組還得要 從30~50筆資料中找出這個控件是哪個
實務上 變麻煩了,因此才想說有沒有更好的方式 可以傳遞 本帖最后由 afan 于 2017-7-12 14:16 编辑
回复afan
了解
只是 想請教 如果我全部使用 全局變量
會有甚麼缺點嗎 ??會比較耗用資源嗎 ...
kk_lee69 发表于 2017-7-12 13:41 http://www.autoitx.com/images/common/back.gif
资源占用 这个完全可以忽略不计的缺点就是组织性需要严谨一点麻烦一点,因为全局使用需要其唯一性
页:
[1]