Что нового

Удвоение строк Listview при обновлении

saavaage

Знающий
Сообщения
171
Репутация
17
Проблема: происходит добавление(дублирование) строк в окне вывода при каждом нажатии кнопки "Обновить".
Код:
Код:
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Global $sPathPrefetch = @WindowsDir & "\Prefetch"
Global $ListView_Prefetch

Opt("GUIOnEventMode", 1)

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Оптимизация Prefetch", 449, 332, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$ListView_Prefetch = GUICtrlCreateListView("Имя|Дата", 16, 16, 345, 265, -1, BitOR($WS_EX_CLIENTEDGE,$LVS_EX_CHECKBOXES))
_GUICtrlListView_SetColumnWidth(-1, 0, 240)
_GUICtrlListView_SetColumnWidth(-1, 1, 80)
GUICtrlCreateLabel("Размер Папки, Мб", 188, 298, 98, 17)
$Input_Size = GUICtrlCreateInput("Input1", 293, 294, 45, 21, $ES_READONLY)
GUICtrlCreateLabel("Кол-во строк", 26, 298, 70, 17)
$Input_Quality = GUICtrlCreateInput("Input1", 100, 294, 35, 21, $ES_READONLY)
$Button_SelectAll = GUICtrlCreateButton("Выделить все", 368, 16, 73, 41, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, "_SelectAllPrefetch")
$Button_UnSelectAll = GUICtrlCreateButton("Снять Выделение", 368, 71, 73, 41, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, "_UnSelectAllPrefetch")
$Button_Clean = GUICtrlCreateButton("Удалить", 368, 126, 73, 41, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, "_CleanPrefetch")
$Button_Refresh = GUICtrlCreateButton("Обновить", 369, 241, 73, 41, BitOR($BS_MULTILINE,$WS_GROUP))
GUICtrlSetOnEvent(-1, "_RefreshPrefetch")
#EndRegion ### END Koda GUI section ###
_ArPrefetch()

GUISetState()


While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc

Func _ArPrefetch()
$aTemp = _FileListToArray($sPathPrefetch)

Dim $aAll [$aTemp[0]][2]
For $i = 1 To UBound($aTemp) - 1
    $Date = FileGetTime($sPathPrefetch & "\" & $aTemp[$i], 1)
    $aAll [$i-1][0]=$aTemp[$i]
	$aAll [$i-1][1]=$Date[0] & "/" & $Date[1] & "/" & $Date[2]
Next
_GUICtrlListView_AddArray($ListView_Prefetch, $aAll)

GuiCtrlSetData($Input_Quality, _GUICtrlListView_GetItemCount($ListView_Prefetch))
GuiCtrlSetData($Input_Size, Round(DirGetSize($sPathPrefetch)/1024/1024,2))
EndFunc

Func _SelectAllPrefetch()
	_GUICtrlListView_SetItemChecked($ListView_Prefetch, -1)
EndFunc

Func _UnSelectAllPrefetch()
    _GUICtrlListView_SetItemChecked($ListView_Prefetch, -1, False)
EndFunc

Func _CleanPrefetch()
	For $p =1 To _GUICtrlListView_GetItemCount($ListView_Prefetch)
		If _GUICtrlListView_GetItemChecked($ListView_Prefetch, $p)=1 Then
			FileDelete($sPathPrefetch& "\" & _GUICtrlListView_GetItemText($ListView_Prefetch, $p, 0))
		Endif
	Next

EndFunc

Func _RefreshPrefetch()
	  GuiCtrlSetData($Input_Quality, '')
      GuiCtrlSetData($Input_Size, '')
     _GUICtrlListView_DeleteAllItems($ListView_Prefetch)
	_ArPrefetch()

EndFunc

Не понимаю, почему. Вроде _GUICtrlListView_DeleteAllItems($ListView_Prefetch) применил, но это результата не дает...


PS система XP SP3
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это баг в функции _GUICtrlListView_DeleteAllItems() в режиме "GUIOnEventMode". Вот почему я не люблю этот режим. Этого можно избежать, если использовать HANDLE вместо CtrlID. Да и вообще, я тебе рекомендую всегда использовать хендлы в _GUICtrl*_* функциях, а CtrlID, только для AutoIt функций - GUICtrl*.

В твоем случае, это лечится заменой одной строки:

Код:
$ListView_Prefetch = GUICtrlGetHandle(GUICtrlCreateListView("Имя|Дата", 16, 16, 345, 265, -1, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_CHECKBOXES)))


Вот и все.

;)
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Спасибо за совет. Думаю, много нервов сэкономит в будущем... :smile:

Тема решена, как всегда. За что большой респект форуму (в целом) и Yashied (в частности).
 
Верх