Что нового

[Элементы GUI] Удаление из ListView и Массива одновременно

YOgen

Знающий
Сообщения
58
Репутация
5
При нажатии на кнопку "+" и последующем выборе папки в ListView и массив $Files добавляются все файлы из указанной папки.
А при выборе элементов в ListView и нажатии на "-" удаляется выбранное, НО в массиве то все без изменений! Подскажите, пожалуйста, как и из массива удалить соответствующие пункты.

Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#Include <File.au3>
#Include <Array.au3>
#include <image_get_info.au3>

$GUI = GUICreate ('Настройки', 470,420)
GUISetState (@SW_SHOW)

$Open_Button = GUICtrlCreateButton (' + ', 345,14, 26,18)
$Del_Button = GUICtrlCreateButton (' - ', 375,14, 26,18)

$ListView = GUICtrlCreateListView (' 1 | 1 ', 150,128, 304,275, $LVS_NOCOLUMNHEADER + $LVS_EX_FULLROWSELECT)
	_GUICtrlListView_SetColumnWidth ($ListView, 0, 196)
	_GUICtrlListView_SetExtendedListViewStyle ($ListView, $LVS_EX_GRIDLINES + $LVS_EX_INFOTIP)

While 1
	$GUI_Msg = GUIGetMsg ()
	Switch $GUI_Msg
		Case $Open_Button
				$Dest_Folder = FileSelectFolder ('Добавить папку:', '', 2)
				If @error Then 
					ContinueLoop
				Else
					$Files_Temp = _FileListToArray ($Dest_Folder, '*.jpg', 1)
					If Not @error Then
						Dim $Files[$Files_Temp[0] + 1][2] = [[$FIles_Temp[0]]]
						For $i = 1 To $Files[0][0]
							$Files[$i][0] = $Dest_Folder & '\' & $Files_Temp[$i]
							$Picture = _ImageGetInfo ($Files[$i][0])
							$Width = _ImageGetParam ($Picture, 'Width')
							$Height = _ImageGetParam ($Picture, 'Height')
							$Files[$i][1] = $Width & 'x' & $Height
							GUICtrlCreateListViewItem ($Files[$i][0] & '|' & '  ' & $Files[$i][1], $ListView)
						Next
						$Files_Temp = 0
						;_ArrayDisplay ($Files) ; массив со всеми файлами
					Else
					EndIf
				EndIf
		Case $Del_Button
			_GUICtrlListView_DeleteItemsSelected ($ListView)
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,757
Репутация
1,151
YOgen
_GUICtrlListView_GetSelectedIndices - возвращает индекс выделенного пункта.
_ArrayDelete - удаляет из массива указанный индекс.
Только индексы в ListView начинаются с 0, а в массиве возвращаемым с помощью _FileListToArray с 1.
 
Автор
YOgen

YOgen

Знающий
Сообщения
58
Репутация
5
AZJIO, Спасибо.

Возник еще один вопрос:
каждый раз при выборе папки через "+" формируется новый массив. А надо бы чтобы каждый последующий раз значения добавлялись в конец предыдущего.
А _ArrayConcatenate не желает почему-то объединять 2-мерный массив.
Как это организовать?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
открыть array.au3 посмотреть как реализована _ArrayConcatenate и сделать аналогичное для себя
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
YOgen,
Попробуйте так:
Код:
#include <File.au3>
#include <Array.au3>

Global $aFiles[1][2] = [[0]], _
		$aDir[3] = [2, @DesktopDir, @MyDocumentsDir]
For $i = 1 To $aDir[0]
	_Get_Files_Info($aFiles, $aDir[$i])
	If @error Then ContinueLoop
	_ArrayDisplay($aFiles, $i)
Next

Func _Get_Files_Info(ByRef $a_Array, $s_Dir, $s_Ext = '*')
	Local $a_Temp
	$a_Temp = _FileListToArray($s_Dir, '*', 1)
	If @error Then Return SetError(1)
	ReDim $a_Array[$a_Temp[0] + $a_Array[0][0] + 1][2]
	For $i = 1 To $a_Temp[0]
		$a_Array[$i + $a_Array[0][0]][0] = $a_Temp[$i]
		$a_Array[$i + $a_Array[0][0]][1] = FileGetSize($s_Dir & '\' & $a_Temp[$i]) & ' b';или что другое
	Next
	$a_Array[0][0] += $a_Temp[0]
EndFunc   ;==>_Get_Files_Info
 
Автор
YOgen

YOgen

Знающий
Сообщения
58
Репутация
5
Огромное спасибо, madmasles.
Подшаманил и все стало как надо.
В который раз уже помогаете :beer:
 
Верх