fenhanxue 发表于 2017-9-4 21:53:11

msgbox不会出现【已解决】

本帖最后由 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

yamakawa 发表于 2017-9-4 22:46:51

一个界面能容纳的控件数目是有限的,,,那两个数字过大,应该直接无响应才对。。。因为超过gui容纳范围

fenhanxue 发表于 2017-9-4 22:54:43

回复 2# yamakawa

但是ConsoleWrite 这一行却有响应

yamakawa 发表于 2017-9-4 22:57:13

回复 1# fenhanxue


    {:face (394):}闲的蛋疼复制你的代码去运行。。然后卡了N久。。。。

fenhanxue 发表于 2017-9-4 22:59:29

回复 4# yamakawa


    哈哈。。。机器不给力。。。

yamakawa 发表于 2017-9-5 09:36:38

回复 5# fenhanxue


    {:face (394):}i7.。12g。。不算太渣吧。。。。另外,启动后,点击一切正常,msgbox有弹出来

fenhanxue 发表于 2017-9-5 10:44:02

回复 6# yamakawa


    实测发现我的电脑大概GUI创建个1W个左右lable后,就不会继续创建了,

kk_lee69 发表于 2017-9-5 11:31:15

回复 5# fenhanxue

真怪 的確彈不出來

kk_lee69 发表于 2017-9-5 11:40:21

回复 7# fenhanxue


    我的100個就彈不出來了....

kk_lee69 发表于 2017-9-5 11:41:57

回复 7# fenhanxue


    為什麼改已解決怎麼解決的??

yamakawa 发表于 2017-9-5 11:48:21

之前好像坛子里有讨论过。。最多只能有9000?多个控件。。
你把创建控件那个循环弄到guisetstate下面,并加上ConsoleWrite就能看见下面输出,大概到9000多就不创建了。因为到了gui能容纳的极限了。
msgbox不能弹出也是同样原因,,控件在gui中其实是以子窗口形式存在的,所以已经容不下msgbox窗口的存在了。。。

yamakawa 发表于 2017-9-5 11:50:37

实在想玩的话,你可以在那个循环结束后,枚举子窗口,删掉一两个,然后msgbox就可以运行了

fenhanxue 发表于 2017-9-5 11:56:36

回复 9# kk_lee69


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

所以问题其实还是没解决,只是感觉再怎么讨论可能也得不出好的解决办法,因为创建过多的控件是一条死路。。。所以就结帖了。。。

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

yamakawa 发表于 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
页: [1]
查看完整版本: msgbox不会出现【已解决】