kk_lee69 发表于 2017-7-12 10:35:28

事件模式 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

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

求大神教学一下

chzj589 发表于 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

chzj589 发表于 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

kk_lee69 发表于 2017-7-12 11:19:09

回复 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:08:03

本帖最后由 afan 于 2017-7-12 13:14 编辑

事件模式直接用一个控件数组 + @GUI_CtrlId 匹配就行了
或者使用单独的函数定义,那就不用控件变量了

chzj589 发表于 2017-7-12 13:14:37

回复 4# kk_lee69
学无止境,精益求精。

kk_lee69 发表于 2017-7-12 13:41:20

回复 5# afan

了解   

只是 想請教 如果我全部使用 全局變量
會有甚麼缺點嗎 ??會比較耗用資源嗎??

kk_lee69 发表于 2017-7-12 13:46:58

回复 5# afan

了解   

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

實務上 變麻煩了,因此才想說有沒有更好的方式 可以傳遞

afan 发表于 2017-7-12 14:13:56

本帖最后由 afan 于 2017-7-12 14:16 编辑

回复afan

了解   

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


    资源占用 这个完全可以忽略不计的缺点就是组织性需要严谨一点麻烦一点,因为全局使用需要其唯一性
页: [1]
查看完整版本: 事件模式 FUNC 内的 控件变量是否全部都要设成Global 才可以??[已解决]