找回密码
 加入
搜索
查看: 2188|回复: 14

[AU3基础] msgbox不会出现【已解决】

  [复制链接]
发表于 2017-9-4 21:53:11 | 显示全部楼层 |阅读模式
本帖最后由 fenhanxue 于 2017-9-5 10:44 编辑

当修改第6、7行参数,大到一定程度后,程序会跳过第38行。
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)

;调整这两个参数,大到一定程度,msgbox就没响应了
Local $w = 100;
Local $h = 100;
;调整这两个参数,大到一定程度,msgbox就没响应了


$Form1 = GUICreate("Form1", $w, $h)
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")

Global $lable[$w+1][$h+1]
For $i = 1 To $w
        For $j = 1 To $h
                $lable[$i][$j] = GUICtrlCreateLabel('',$i-1,$j-1,1,1)
                GUICtrlSetOnEvent($lable[$i][$j] ,'test')
        Next
Next
GUISetState(@SW_SHOW)
        
While 1
        Sleep(10)
WEnd

Func test()

        For $i = 1 To $w
                For $j = 1 To $h
                        If @GUI_CtrlId = $lable[$i][$j]  Then
                                ExitLoop(2)
                        EndIf
                Next
        Next
        ;ConsoleWrite(2)
        ConsoleWrite($i&'-'&$j);本行有响应
        MsgBox(0,$i,$j);本行无响应,即直接跳过本行
        ConsoleWrite(@LF);本行有响应
EndFunc

Func SpecialEvents()
    Select
        Case @GUI_CtrlId = $GUI_EVENT_CLOSE
            Exit
    EndSelect
EndFunc   ;==>SpecialEvents
发表于 2017-9-4 22:46:51 | 显示全部楼层
一个界面能容纳的控件数目是有限的,,,那两个数字过大,应该直接无响应才对。。。因为超过gui容纳范围
 楼主| 发表于 2017-9-4 22:54:43 | 显示全部楼层
回复 2# yamakawa

但是ConsoleWrite 这一行却有响应

本帖子中包含更多资源

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

×
发表于 2017-9-4 22:57:13 | 显示全部楼层
回复 1# fenhanxue


    闲的蛋疼复制你的代码去运行。。然后卡了N久。。。。
 楼主| 发表于 2017-9-4 22:59:29 | 显示全部楼层
回复 4# yamakawa


    哈哈。。。机器不给力。。。
发表于 2017-9-5 09:36:38 | 显示全部楼层
回复 5# fenhanxue


    i7.。12g。。不算太渣吧。。。。另外,启动后,点击一切正常,msgbox有弹出来
 楼主| 发表于 2017-9-5 10:44:02 | 显示全部楼层
回复 6# yamakawa


    实测发现我的电脑大概GUI创建个1W个左右lable后,就不会继续创建了,
发表于 2017-9-5 11:31:15 | 显示全部楼层
回复 5# fenhanxue

真怪 的確彈不出來
发表于 2017-9-5 11:40:21 | 显示全部楼层
回复 7# fenhanxue


    我的100個就彈不出來了....
发表于 2017-9-5 11:41:57 | 显示全部楼层
回复 7# fenhanxue


    為什麼改已解決  怎麼解決的??
发表于 2017-9-5 11:48:21 | 显示全部楼层
之前好像坛子里有讨论过。。最多只能有9000?多个控件。。
你把创建控件那个循环弄到guisetstate下面,并加上ConsoleWrite就能看见下面输出,大概到9000多就不创建了。因为到了gui能容纳的极限了。
msgbox不能弹出也是同样原因,,控件在gui中其实是以子窗口形式存在的,所以已经容不下msgbox窗口的存在了。。。
发表于 2017-9-5 11:50:37 | 显示全部楼层
实在想玩的话,你可以在那个循环结束后,枚举子窗口,删掉一两个,然后msgbox就可以运行了
 楼主| 发表于 2017-9-5 11:56:36 | 显示全部楼层
回复 9# kk_lee69


    估计如yamakawa所说的,控件数量达到一定程度就不能再创建了,

所以问题其实还是没解决,只是感觉再怎么讨论可能也得不出好的解决办法,因为创建过多的控件是一条死路。。。所以就结帖了。。。
 楼主| 发表于 2017-9-5 11:59:42 | 显示全部楼层
回复 10# kk_lee69

看看这个例子,我电脑实测,300*300背景下,当i=34之后,lable不会继续创建
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)

;调整这两个参数,大到一定程度,msgbox就没响应了
Local $w = 300;
Local $h = 300;
;调整这两个参数,大到一定程度,msgbox就没响应了


$Form1 = GUICreate("Form1", $w, $h)
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")

Global $lable[$w+1][$h+1]
For $i = 1 To $w
        For $j = 1 To $h
                $lable[$i][$j] = GUICtrlCreateLabel('',$i-1,$j-1,1,1)
                GUICtrlSetOnEvent($lable[$i][$j] ,'test')
        Next
Next
GUISetState(@SW_SHOW)
aa()

While 1
        Sleep(10)
WEnd
Func aa()
        For $i = 30 To 50
                For $J = 0 To 300
                        GUICtrlSetBkColor($lable[$i][$j],0xFF0000)
                Next
        Next
EndFunc

Func test()

        For $i = 1 To $w
                For $j = 1 To $h
                        If @GUI_CtrlId = $lable[$i][$j]  Then
                                ExitLoop(2)
                        EndIf
                Next
        Next
        ;ConsoleWrite(2)
        ConsoleWrite($i&'-'&$j);本行有响应
        MsgBox(0,$i,$j);本行无响应,即直接跳过本行
        ConsoleWrite(@LF);本行有响应
EndFunc

Func SpecialEvents()
    Select
        Case @GUI_CtrlId = $GUI_EVENT_CLOSE
            Exit
    EndSelect
EndFunc   ;==>SpecialEvents
发表于 2017-9-5 12:18:52 | 显示全部楼层
试试我这段代码吧。。控件到9972就不动了。。然后我加了一个小循环,删除控件标识符大于9970的,然后msgbox有反应了
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1)

;调整这两个参数,大到一定程度,msgbox就没响应了
Local $w = 100;
Local $h = 100;
;调整这两个参数,大到一定程度,msgbox就没响应了


$Form1 = GUICreate("Form1", 500, 500)
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")

Global $lable[$w+1][$h+1]

GUISetState(@SW_SHOW)
        
                
                For $i = 1 To $w
        For $j = 1 To $h
                $lable[$i][$j] = GUICtrlCreateLabel('',$i-1,$j-1,1,1)
                                GUICtrlSetBkColor(-1,0xff00cc)
                GUICtrlSetOnEvent($lable[$i][$j] ,'test')
                                ConsoleWrite("控件标识符 " & $lable[$i][$j] & "$i  " & $i & "$j " & $j & @CRLF)
        Next
                Next
                
                For $z = 9970 To 10000;删几个
                        If GUICtrlDelete ( $z ) = 1 Then ConsoleWrite("删除了 标识符为 " & $z & "的控件" & @CRLF)
                Next
                



While 1
        Sleep(10)
WEnd

Func test()
Local $i,$j
        For $i = 1 To $w
                For $j = 1 To $h
                        If @GUI_CtrlId = $lable[$i][$j]  Then
                                ExitLoop(2)
                        EndIf
                Next
                Next

        ConsoleWrite($i&'-'&$j);本行有响应
      MsgBox(0,$i,$j );有反应了吧
        ConsoleWrite(@LF);本行有响应
EndFunc

Func SpecialEvents()
    Select
        Case @GUI_CtrlId = $GUI_EVENT_CLOSE
            Exit
    EndSelect
EndFunc   ;==>SpecialEvents
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 22:30 , Processed in 0.078403 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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