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 一个界面能容纳的控件数目是有限的,,,那两个数字过大,应该直接无响应才对。。。因为超过gui容纳范围 回复 2# yamakawa
但是ConsoleWrite 这一行却有响应
回复 1# fenhanxue
{:face (394):}闲的蛋疼复制你的代码去运行。。然后卡了N久。。。。 回复 4# yamakawa
哈哈。。。机器不给力。。。 回复 5# fenhanxue
{:face (394):}i7.。12g。。不算太渣吧。。。。另外,启动后,点击一切正常,msgbox有弹出来 回复 6# yamakawa
实测发现我的电脑大概GUI创建个1W个左右lable后,就不会继续创建了, 回复 5# fenhanxue
真怪 的確彈不出來 回复 7# fenhanxue
我的100個就彈不出來了.... 回复 7# fenhanxue
為什麼改已解決怎麼解決的?? 之前好像坛子里有讨论过。。最多只能有9000?多个控件。。
你把创建控件那个循环弄到guisetstate下面,并加上ConsoleWrite就能看见下面输出,大概到9000多就不创建了。因为到了gui能容纳的极限了。
msgbox不能弹出也是同样原因,,控件在gui中其实是以子窗口形式存在的,所以已经容不下msgbox窗口的存在了。。。 实在想玩的话,你可以在那个循环结束后,枚举子窗口,删掉一两个,然后msgbox就可以运行了 回复 9# kk_lee69
估计如yamakawa所说的,控件数量达到一定程度就不能再创建了,
所以问题其实还是没解决,只是感觉再怎么讨论可能也得不出好的解决办法,因为创建过多的控件是一条死路。。。所以就结帖了。。。 回复 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 试试我这段代码吧。。控件到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]