找回密码
 加入
搜索
查看: 1807|回复: 8

[AU3基础] 事件模式 FUNC 内的 控件变量是否全部都要设成Global 才可以??[已解决]

[复制链接]
发表于 2017-7-12 10:35:28 | 显示全部楼层 |阅读模式
本帖最后由 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 ... hlight=%C8%AB%BE%D6

這篇文章中的疑問一樣  事件模式 有太多的變數傳遞問題

求大神教学一下
发表于 2017-7-12 11:09:30 | 显示全部楼层
回复 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
发表于 2017-7-12 11:18:39 | 显示全部楼层
回复 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
 楼主| 发表于 2017-7-12 11:19:09 | 显示全部楼层
回复 2# chzj589

我懂  但是我要問的是 FUNC 裡面的變數也要 變成全局  不就等同
只有全局  沒有 LOCAL 了.....

我想找到 可以使用LOCAL 但是 又可以傳遞給全局的方法

你可以看看 這篇文章 其實他的疑問是跟我一樣的
http://www.autoitx.com/forum.php ... hlight=%C8%AB%BE%D6
发表于 2017-7-12 13:08:03 | 显示全部楼层
本帖最后由 afan 于 2017-7-12 13:14 编辑

事件模式直接用一个控件数组 + @GUI_CtrlId 匹配就行了
或者使用单独的函数定义,那就不用控件变量了
发表于 2017-7-12 13:14:37 | 显示全部楼层
回复 4# kk_lee69
学无止境,精益求精。
 楼主| 发表于 2017-7-12 13:41:20 | 显示全部楼层
回复 5# afan

了解   

只是 想請教 如果我全部使用 全局變量  
會有甚麼缺點嗎 ??  會比較耗用資源嗎??
 楼主| 发表于 2017-7-12 13:46:58 | 显示全部楼层
回复 5# afan

了解   

只是我通常寫ERP 因此 有非常多的控件都是EDIT控件,這些控件 用不到 CASE  ,通常使用CASE 都是BUTTON ,但是EDIT控件 經常 要 GUICtrlSetData 或者 GUICtrlRead  以前通常用 $TC001 或者 $TC002 這樣子 去記  現在要變成控件組  還得要 從30~50筆資料中  找出這個控件是哪個

實務上 變麻煩了  ,因此才想說有沒有更好的方式 可以傳遞
发表于 2017-7-12 14:13:56 | 显示全部楼层
本帖最后由 afan 于 2017-7-12 14:16 编辑
回复  afan

了解   

只是 想請教 如果我全部使用 全局變量  
會有甚麼缺點嗎 ??  會比較耗用資源嗎 ...
kk_lee69 发表于 2017-7-12 13:41



    资源占用 这个完全可以忽略不计的  缺点就是组织性需要严谨一点  麻烦一点,因为全局使用  需要其唯一性
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 01:16 , Processed in 0.071683 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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