papapa314 发表于 2011-4-2 15:45:08

为什么用这种方法一次性只能在listview中导入1500左右的item?

一次性选择多于1500个文件的时候listview中只显示1500个item,不知什么原因,请教各位,代码如下:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include<file.au3>
#include<array.au3>
#Include <GuiListView.au3>


$Form1_1 = GUICreate(" ", 587, 572);
$listview1=GUICtrlCreateListView("路径",50,50,400,400)
$buton1=GUICtrlCreateButton("添加",450,450,50,50)
$lable=GUICtrlCreateLabel("",250,500,200,50)
GUISetState()


While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $buton1
                        open()

        EndSwitch
WEnd

       



Func open()

$file=FileOpenDialog("","","(*.*)",4)
;MsgBox(0,0,$file)
$filearray=StringSplit($file,"|")
;_ArrayDisplay($filearray)
Dim $path[$filearray-1]
For $i=0 To $filearray-2
        $path[$i]=$filearray&"\"&$filearray[$i+2]
Next;...........................................多选文件时得到每个文件的完整路径

;_ArrayDisplay($path)
For $i=0 To $filearray-2
;MsgBox(0,0,$path[$i])

GUICtrlCreateListViewItem($path[$i],$listview1)

Next

GUICtrlSetData($lable,"一共有"&_GUICtrlListView_GetItemCount($listview1)&"个文件")
EndFunc

papapa314 发表于 2011-4-2 15:52:24

本帖最后由 papapa314 于 2011-4-2 15:57 编辑

对了,大家可以用以下代码产生几千个txt文件,然后添加到上面的程序中测试:

DirCreate("C:\test")

For $i=1 To 3000
        FileWrite("C:\test\"&$i&"呵呵呵呵呵呵呵呵呵呵.txt",$i)
Next

似乎是跟文件名的长度有关系的,文件名长度短,就可以添加多点的文件,反之亦然。但不知所以然,还望提供一种解决办法

3mile 发表于 2011-4-2 17:08:06

没有问题
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include<file.au3>
#include<array.au3>
#Include <GuiListView.au3>


$Form1_1 = GUICreate(" ", 587, 572);
$listview1=GUICtrlCreateListView("序号|路径",50,50,400,400)
$buton1=GUICtrlCreateButton("添加",450,450,50,50)
$lable=GUICtrlCreateLabel("",250,500,200,50)
GUISetState()


While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $buton1
                        open()

      EndSwitch
WEnd

Func open()
        if FileExists("aa.txt") then FileDelete("aa.txt")
        RunWait(@ComSpec & " /c " & "dir c:\*.* /s/b >aa.txt")
        local $temp
        _FileReadToArray("aa.txt",$temp)
       
GUICtrlSetData($lable,"一共有"&$temp&"个文件")
GUICtrlSetBkColor($lable,0xff0000)
For $i=1 To $temp
        GUICtrlCreateListViewItem($i&"|"&$temp[$i],$listview1)
Next
EndFunc

3mile 发表于 2011-4-2 17:20:43

加上UPDATA减少GUI绘制时的资源占用率.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include<file.au3>
#include<array.au3>
#Include <GuiListView.au3>


$Form1_1 = GUICreate(" ", 587, 572);
$listview1=GUICtrlCreateListView("序号|路径",50,50,400,400)
$buton1=GUICtrlCreateButton("添加",450,450,50,50)
$lable=GUICtrlCreateLabel("",250,500,200,50)
GUISetState()


While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $buton1
                        open()

      EndSwitch
WEnd

Func open()
        if FileExists("aa.txt") then FileDelete("aa.txt")
        RunWait(@ComSpec & " /c " & "dir c:\*.* /s/b >aa.txt")
        local $temp
        _FileReadToArray("aa.txt",$temp)
       
GUICtrlSetData($lable,"一共有"&$temp&"个文件"&@crlf&"生成LISTVIEW中,请等待....")
GUICtrlSetBkColor($lable,0xff0000)

GUICtrlSetState($buton1,$gui_disable)

_GUICtrlListView_BeginUpdate($ListView1)
For $i = 1 To $temp
    _GUICtrlListView_AddItem($ListView1, $i, 0)
    _GUICtrlListView_AddSubItem($ListView1, $i-1,$temp[$i], 1)
Next
_GUICtrlListView_EndUpdate($ListView1)
GUICtrlSetState($buton1,$gui_Enable)

EndFunc

papapa314 发表于 2011-4-2 21:57:00

回复 4# 3mile


    谢谢! 果然是一种好的算法,效率很高,我那种方法文件稍微多点速度就很明显得慢了。但我看了很久还是不明白下面这几句代码是什么意思,不知向阳坊大哥(3mile--sunmile 哈哈)能否解释下?另外,如果文件的路径是从fileopendialog函数的返回值得到的话的,能否用你的这种方法呢?
      
    if FileExists("aa.txt") then FileDelete("aa.txt")


      RunWait(@ComSpec & " /c " & "dir c:\*.* /s/b >aa.txt")


      local $temp


      _FileReadToArray("aa.txt",$temp)

pusofalse 发表于 2011-4-3 19:53:01

这不是ListView的问题,FileOpenDialog最多给你返回1500个文件(?)。

kadingxiaodi 发表于 2011-4-10 08:25:41

学习一下将多个文件内容写入的方法

guang19831217 发表于 2011-4-10 20:30:45

以前学过,好像有什么限制字节的问题,搜下应该有。

nnlenx 发表于 2011-4-30 12:55:29

回复 5# papapa314


   先判断文件“aa.txt”是否已存在,如果存在就删除它
列出C盘的所有文件名(包括子目录中的文件名),并保存到aa.txt文件
再把文件名从aa.txt文件存至$temp数组中
页: [1]
查看完整版本: 为什么用这种方法一次性只能在listview中导入1500左右的item?