Что нового

"Чистое" удаление элементов ListView (вместо присвоения значения "пусто")

dilon

Новичок
Сообщения
5
Репутация
0
Здравствуйте всем! Мною был создан скрипт на основе "редактирование Listview" от AZJIO http://autoit-script.ru/index.php?topic=11394.msg74901#msg74901, где ListView заполняется массивом из файла и, после внесения изменений, этот же файл перезаписывается.
Столкнулся с проблемой, что при удалении значений из списка ListView - они не удаляются, а заменяются "пустыми", т. е. количество элементов в массиве не уменьшается. Подскажите, пожалуйста, решение этого вопроса.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
вопрос слишком общий. нужно видеть пример проблемного кода
если подойти с другой стороны, то зачем использовать код по ссылке если можно написать свой.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
dilon [?]
при удалении значений из списка ListView - они не удаляются, а заменяются "пустыми", т. е. количество элементов в массиве не уменьшается
А в чём сложность удалять ячейки массива ассоциированные с элементами списка?
 
Автор
D

dilon

Новичок
Сообщения
5
Репутация
0
Переделанный мною скрипт от AZJIO:
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <Array.au3>


; En
$LngTitle = 'Double click the'
$LngCol = 'Col'

; Ru
; если русская локализация, то русский язык
If @OSLang = 0419 Then
        $LngTitle = 'Двойной клик на элементе'
        $LngCol = 'колонка'
EndIf

Opt("GUIOnEventMode", 1)
Global $aElement[2], $hActive, $iInput
Global $iListView, $hListView, $iExit, $iSaveChange
Global $sFilePath = @ScriptDir & "1.txt"

$hGUI = GUICreate($LngTitle, 450, 365)
GUISetOnEvent(-3, '_Exit')
$iInput = GUICtrlCreateInput("", 0, 0, 0, 0)
GUICtrlSetState(-1, $GUI_HIDE)
$iListView = GUICtrlCreateListView($LngCol, 5, 5, 220, 330, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS))
$hListView = GUICtrlGetHandle(-1)

_GUICtrlListView_SetExtendedListViewStyle ($hListView, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)


$iSave = GUICtrlCreateButton('Save', 10, 340, 70, 25)
GUICtrlSetOnEvent(-1, "_Save")

If Not FileExists($sFilePath) Then
    _FileCreate($sFilePath)
    _ListView_Random_Fill($iListView)
 Else
	Local $avArray
   _FileReadToArray($sFilePath, $avArray, 2)
   _ArrayDisplay($avArray)
   $r = UBound($avArray) - 1
	  For $i = 0 To $r
		  GUICtrlCreateListViewItem($avArray[$i], $iListView)
      Next

   EndIf



$iExit = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Exit")
$iSaveChange = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_SaveChange")
Global $AccelKeys[2][2] = [["{ESC}", $iExit],["{ENTER}", $iSaveChange]]
GUISetAccelerators($AccelKeys)
GUISetState()
GUIRegisterMsg(0x4E, "_WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; для скрытия поля ввода при потере фокуса.

While 1
        Sleep(100000)
WEnd

Func _ListView_Random_Fill($iListView)
        Local $item
        For $i = 1 To 10
                $item = Random(10, 99, 1)
	    GUICtrlCreateListViewItem($item, $iListView) ; создаём пункты
        Next
EndFunc

Func _Save()

   Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView), $iItemCount = _GUICtrlListView_GetItemCount($hListView)
   Local $aReturn[$iItemCount][$iColumnCount]
      For $i = 0 To $iItemCount - 1
        For $j = 0 To $iColumnCount - 1
            $aReturn[$i][$j] = _GUICtrlListView_GetItemText($hListView, $i, $j)
	    Next
    Next
   _FileWriteFromArray($sFilePath, $aReturn)
   ShellExecute($sFilePath)

EndFunc





; Выводит элемент Input на передний план
Func _GUICtrlListView_EditItem($hWnd, $iIndex, $iSubItem)
        ;funkey 19.02.2010
        If $iIndex < 0 Then Return
        Local $aPos, $aRect, $iSum = 0
        Local $x, $y, $w, $h
        For $i = 0 To $iSubItem - 1
                $iSum += _GUICtrlListView_GetColumnWidth($hWnd, $i)
        Next
        $aRect = _GUICtrlListView_GetItemRect($hWnd, $iIndex)
        $aPos = ControlGetPos($hGUI, "", $hWnd)
        $x = $iSum + $aPos[0] + $aRect[0]
        $y = $aPos[1] + $aRect[1]
        $w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
        $h = $aRect[3] - $aRect[1]
        GUICtrlSetPos($iInput, $x - 1, $y + 1, $w + 1, $h + 1)
        GUICtrlSetData($iInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
        GUICtrlSetState($iInput, $GUI_SHOW)
        GUICtrlSetState($iInput, $GUI_FOCUS)
        $aElement[0] = $iIndex
        $aElement[1] = $iSubItem
EndFunc

; Сохранить изменения редактирования пункта
Func _SaveChange()
        Local $sText = GUICtrlRead($iInput)
        If StringInStr($sText, @CR) Or StringInStr($sText, @LF) Then
                If StringLeft($sText, 1) <> '"' And StringInStr(StringMid($sText, 2, StringLen($sText) - 2), '"') Then $sText = StringReplace($sText, '"', "'")
                $sText = '"' & StringReplace($sText, '"', '') & '"'
        EndIf
        _GUICtrlListView_BeginUpdate($hActive)
        _GUICtrlListView_SetItemText($hActive, $aElement[0], $sText, $aElement[1])
        GUICtrlSetState($iInput, $GUI_HIDE)
        _GUICtrlListView_SetColumnWidth($hActive, $aElement[1], -2) ;$LVSCW_AUTOSIZE_USEHEADER
        _GUICtrlListView_EndUpdate($hActive)
        Return $sText ; возвращаем текст, если требуется его использовать после применения
EndFunc

Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $hListView
                        Switch $iCode
                                Case $LVN_BEGINSCROLL ; прокрутка ListView
                                        If $hActive Then
                                                $hActive = 0
                                                GUICtrlSetState($iInput, $GUI_HIDE)
                                                GUICtrlSetData($iInput, '') ; Очищаем поле ввода
                                        EndIf
                                Case $NM_DBLCLK ; двойной клик - редактируем пункт ListView
                                        Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                        $hActive = $hWndFrom
                                        _GUICtrlListView_EditItem($hActive, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
                                        ; _GUICtrlListView_EnsureVisible($hActive, DllStructGetData($tInfo, "Index"), True)
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg
        Local $iIDFrom, $iCode
        $iIDFrom = BitAND($iwParam, 0xFFFF) ; младшее слово
        $iCode = BitShift($iwParam, 16) ; старшее слово
        Switch $iIDFrom
                Case $iInput
                        Switch $iCode
                                Case $EN_KILLFOCUS
                                        GUICtrlSetState($iInput, $GUI_HIDE)
                                        GUICtrlSetData($iInput, '') ; Очищаем поле ввода
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc

Func _Exit()
        Exit
EndFunc

Я так понимаю нужно что-то добавить в Func WM_COMMAND?


Добавлено:
Сообщение автоматически объединено:

joiner сказал(а):
вопрос слишком общий. нужно видеть пример проблемного кода
если подойти с другой стороны, то зачем использовать код по ссылке если можно написать свой.

Пример привел. Свой код под себя с нуля не напишу - знаний хватит лишь на "добавить - убавить что-нибудь простенькое".


Добавлено:
Сообщение автоматически объединено:

CreatoR сказал(а):
dilon [?]
при удалении значений из списка ListView - они не удаляются, а заменяются "пустыми", т. е. количество элементов в массиве не уменьшается
А в чём сложность удалять ячейки массива ассоциированные с элементами списка?

Удалять на этапе редактирования ListView или при создании массива для записи в файл? В первом случае - не знаю как это реализовать, второй вариант, в принципе могу сделать - но мне, почему-то, кажется что есть путь попроще... Вот и обратился за помощью - может подскажите в каком направлении копать.

Используйте для AutoIt кода тег [autoit]
autoit.gif

madmasles.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
dilon
если я правильно понял из всей этой каши, то проблема в том, что, когда редактируешь сам файл со значениями, к примеру удаляешь в средине
Код:
34
45
       пустая строка в файле
67
89
       пустая строка в файле
23
42
то при выведении в List появляются пустые строки. так я понял?
если так, то нужно при наполнении включить проверку
найди в своем коде и измени
Код:
For $i = 0 To $r
		If $avArray[$i] Then  GUICtrlCreateListViewItem($avArray[$i], $iListView) ; проверяем, если строка не пустая, то создаем элемент List
       Next

ну и, как писал выше, можно написать свой код. задача у тебя не сложная. и код будет более компактным и понятным. а в этом коде много ненужного
 
Верх