找回密码
 加入
搜索
查看: 12391|回复: 45

[AU3基础] [已解决]看不懂的 If 循环。。。。。。

 火... [复制链接]
发表于 2012-6-10 21:48:21 | 显示全部楼层 |阅读模式
本帖最后由 131738 于 2012-6-14 00:28 编辑

以下是德国作品中一段提取图标 Dll文件,显示到 ListView 控件的代码,
虽然我已修改了这段代码,但好奇这段代码的 If 循环,贴出来向高手讨教!
        
$PicID = 1 ; 图标索引
$Limiter = 5 ;Bei 5 leeren icons, abbruch!
$iconcounter = 1 ; 图标计数
        
; 以下 3 句应该是初始化 ListView 控件吧?
_GUIImageList_AddIcon($FotoshImageList, $imagefile, 0, True) ; 添加图标到图像列表
_GUICtrlListView_SetImageList($Fotos_Thubnails, $FotoshImageList, 0) ; 分配图像列表到列表视图控件
_GUICtrlListView_AddItem($Fotos_Thubnails, "0", 0) ; 添加项目到列表的末尾
        
; 从 0 循环到 一千万(差一个)
For $iCntRow = 0 To 9999999
              $res = _GUIImageList_AddIcon($FotoshImageList, $imagefile, $PicID, True) ; 添加大图标到图像列表,返回图像的索引
                
        ; 退出 For 循环的条件:
        If $res = 0 Then
                $Limiter = $Limiter - 1
                If $Limiter < 1 Then ExitLoop ; 退出循环
        EndIf
                
        If Not $res = 0 Then ; 返回图像的索引不等于 0
                _GUICtrlListView_SetImageList($Fotos_Thubnails, $FotoshImageList, 0) ; 分配图像列表到(列表视图)控件
                _GUICtrlListView_AddItem($Fotos_Thubnails, $PicID, $PicID)
                $iconcounter = $iconcounter + 1 ; 图标计数+1
                GUICtrlSetData($statusbar, "发现图标:" & "(" & $iconcounter & ")...")
        EndIf
        $PicID = $PicID + 1 ; 图标索引+1
        Next
实际运行时,一个 300 多个图标的 Dll文件,运行 6 分钟,$iconcounter 计数到 6 万多,不出现一个图标!
似乎不达一千万不罢休!
实在看不懂这个 If 循环,有看懂的能指点一,二吗?
发表于 2012-6-10 23:16:32 | 显示全部楼层
前辈不知  我更看不懂
发表于 2012-6-11 00:59:50 | 显示全部楼层
回复 1# 131738

粗略看,逻辑上无问题。如果19-21行改为  ELSE更容易理解。
对比第9行与23行,似有语法不一致的地方,中间的那个$PICID似应为文本字串而非数字
 楼主| 发表于 2012-6-11 02:17:23 | 显示全部楼层
回复  131738

粗略看,逻辑上无问题。如果19-21行改为  ELSE更容易理解。
对比第9行与23行,似有语法不 ...
楼上风云 发表于 2012-6-11 00:59

谢谢!!!似乎是这句吧?
_GUICtrlListView_AddItem($Fotos_Thubnails, $PicID, $PicID)
但我只是将 9999999 替换为获取的图像列表中图像总数,这句没修改,
我再看看中间的 $PicID 返回什么?
发表于 2012-6-11 04:52:23 | 显示全部楼层
本帖最后由 user3000 于 2012-6-11 07:17 编辑

回复 1# 131738

$Limiter = 5 ;Bei 5 leeren icons, abbruch!
搜了下, 大约是5个空图标即结束循环的意思吧.
循环体里, 他是以 0 作为判断条件, 但是  _GUIImageList_AddIcon() 函数失败时返回 -1, 而第一次成功时是返回 0 !
略微修改了代码, 我用 shell32.dll 作了测试,成功添加238个图标,之后全失败,连续返回 -1. 与该文件里的图标总数相符.
测试用的完整代码如下:
#include <GuiListView.au3>
#include <GuiImageList.au3>
GUICreate('Test', 580, 280)
$ListView1 = GUICtrlCreateListView("", 5, 5, 570, 270)
_GUICtrlListView_SetView($ListView1, 1)
$PicID = 0 ; 图标索引, shell32.dll 以 0 为起始
$Limiter = 5 ;Bei 5 leeren icons, abbruch!
$iconcounter = 0 ; 图标计数
$imagefile = @SystemDir & "\shell32.dll"
; 以下 3 句应该是初始化 ListView 控件吧?
_GUIImageList_AddIcon($ListView1, $imagefile, 0, True) ; 添加图标到图像列表
$FotoshImageList = _GUIImageList_Create()
_GUICtrlListView_SetImageList($ListView1, $FotoshImageList, 0) ; 分配图像列表到列表视图控件
;_GUICtrlListView_AddItem($ListView1, "0", 0) ; 添加项目到列表的末尾
; 从 0 循环到 一千万(差一个)
For $iCntRow = 0 To 9999999
        $res = _GUIImageList_AddIcon($FotoshImageList, $imagefile, $PicID, True) ; 添加大图标到图像列表,返回图像的索引
        ConsoleWrite($PicID & @TAB & $res & @CR)
        ; 退出 For 循环的条件:
        If $res = -1 Then
                $Limiter = $Limiter - 1
                If $Limiter < 1 Then ExitLoop ; 退出循环
        Else; 返回图像的索引不等于 0
                _GUICtrlListView_SetImageList($ListView1, $FotoshImageList, 0) ; 分配图像列表到(列表视图)控件
                _GUICtrlListView_AddItem($ListView1, $PicID, $PicID)
                $iconcounter = $iconcounter + 1 ; 图标计数+1
                ;GUICtrlSetData($statusbar, "发现图标:" & "(" & $iconcounter & ")...")
        EndIf
        $PicID = $PicID + 1 ; 图标索引+1
Next
ConsoleWrite('totle: ' & $iconcounter & @CR)
GUISetState(@SW_SHOW)
While GUIGetMsg() + 3
WEnd
补充: 其实我也看不懂原来的代码!
循环体里, 用原来的 If Not $res = -1 Then 语句则只'提取'出一个图标 (0 基那个)!

评分

参与人数 1金钱 +100 贡献 +25 收起 理由
131738 + 100 + 25 谢谢!!!

查看全部评分

 楼主| 发表于 2012-6-11 15:04:35 | 显示全部楼层
本帖最后由 131738 于 2012-6-11 15:23 编辑

回复 5# user3000

谢谢!!!我看看。。。

只是不懂为何要 $Limiter 从 5 递减到 0 才退出循环?

而不是 $res = -1 退出?

是否 DLL 类型的图标文件有什么奥妙。。。

我向开发者询问过,作者回复:

Der Loop sollte eigentlich stoppen sobald kein Icon mehr gefunden wurde... hm...
---------------
The loop should actually stop when no new icon is found ...hmmm ...
 楼主| 发表于 2012-6-11 15:25:45 | 显示全部楼层
回复 5# user3000

看你在线,刚才的回复我修改了,不知修改后是否看过。。。
发表于 2012-6-11 15:31:17 | 显示全部楼层
回复 6# 131738


    应该是担心某DLL'做工'不好, 预防提取它的图标时, 即使没到最后一个图标也出错的这种情况吧!
他设定5次失败后认为不能再'发现'该文件中的图标, 所以才中止循环.
 楼主| 发表于 2012-6-11 15:34:56 | 显示全部楼层
回复 5# user3000

Id 号的 3000 老觉得有点眼熟,翻看我的帖子列表,原来是帮我翻译过英文帖子的英文高手!
 楼主| 发表于 2012-6-11 15:36:30 | 显示全部楼层
回复  131738


    应该是担心某DLL'做工'不好, 预防提取它的图标时, 即使没到最后一个图标也出错的这 ...
user3000 发表于 2012-6-11 15:31


喔。。。有道理。。。佩服!!!
发表于 2012-6-11 15:39:22 | 显示全部楼层
回复 9# 131738

额, 终于走进前辈的视线了, 我也开始有点佩服我自己了. 哈哈!
发表于 2012-6-11 18:44:11 | 显示全部楼层
测试了一下,shell32.dll只能加载0-237
发表于 2012-6-11 19:03:24 | 显示全部楼层
回复 12# haijie1223


    猛然发现,你的注册日期我很是接近呀:同窗呀
 楼主| 发表于 2012-6-11 19:31:30 | 显示全部楼层
本帖最后由 131738 于 2012-6-11 20:18 编辑
回复  131738


    应该是担心某DLL'做工'不好, 预防提取它的图标时, 即使没到最后一个图标也出错的这 ...
user3000 发表于 2012-6-11 15:31


感觉还是不对,若是这样,“做工”不好的 dll 也必须要能返回 4(或5) 个 $res = 0,
才能退出,否则就是必须循环一千万次退出,那“做工”不好的 dll 对于这个循环不就是个标准文件了?
相反真正标准的 dll 反而是“做工”不好的了,是这样理解吗?

放弃这个回复!会过神了,全部图标完成,继续接收4或5个 -1 (0肯定不行)退出循环
发表于 2012-6-11 19:32:10 | 显示全部楼层
回复  131738

$Limiter = 5 ;Bei 5 leeren icons, abbruch!
搜了下, 大约是5个空图标即结束循环的意思 ...
user3000 发表于 2012-6-11 04:52



    我这测试没有返回 -1 的,空图标也是返回的 0 ,那样的话,原作
        If $res = 0 Then
                $Limiter = $Limiter - 1
                If $Limiter < 1 Then ExitLoop ; 退出循环

这部分就没问题…
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-17 04:33 , Processed in 0.093600 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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