Что нового

Изменение значений в ListView, добавление новых и сохранение их в .ini файл

Rinfes

Новичок
Сообщения
25
Репутация
0
Здравствуйте. Не получается изменить значения в ListView. А так же не получается добавить новые пункты(в двумерный массив) и после сохранить в .ini файл.
Код:
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <MsgBoxConstants.au3>

Global $hGUI, $ListView, $button
$sPath_ini = @ScriptDir & "\edit.ini"

$hGUI = GUICreate("ListView", 550, 650, 198, 67)
GUISetBkColor(0xd5d2af)

$ListView = GUICtrlCreateListView("Колонка1|Колонка2", 10, 10, 530, 550, $LVS_EDITLABELS)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 263)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 1, 263)
GUICtrlSetBkColor(-1, 0xFFFEEE)

$num = IniRead($sPath_ini, "Flag", "F1", "default") ; число строк, которые должны забиться в ListView

$a = 0 ; индекс элемента и счетчик для секции

 Dim $aItems[$num][2] ; заполнение массива
    For $n = 1 To $num
        $aItems[$a][0] = IniRead($sPath_ini, "Col1", $a + 1, "default")
        $aItems[$a][1] = IniRead($sPath_ini, "Col2", $a + 1, "default")
		$a += 1

    Next

    _GUICtrlListView_AddArray($ListView, $aItems)


$button = GUICtrlCreateButton("Добавить", 200, 600, 150, 25)

GUISetState()

While 1
    Switch GUIGetMsg()
	Case $button
			$num += 1
			ReDim $aItems[$num][2]
			$aItems[$num][0] = "*****"
			$aItems[$num][1] = "*****"
            


        Case $GUI_EVENT_CLOSE
		   IniWrite($sPath_ini, "Flag", "F1", $num)
		   $a = 0 ; элемент массива
		   $k = 1 ; счетчик для секции
		   For $n = 1 to $num
			  IniWriteSection($sPath_ini, "Col1", $k, $aItems[$a][0])
			  IniWriteSection($sPath_ini, "Col2", $k, $aItems[$a][1])
			  $a += 1
			  $k += 1
			Next

            Exit
    EndSwitch
WEnd


Содержимое ini файла:

Код:
[Col1]
1=Красная
2=Оранжевая
3=Желтый
4=Зеленое
5=Голубой

[Col2]
1=Площадь
2=Революция
3=Однуванчик
4=Яблоко
5=Щенок

[Flag]
F1=5
 

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
у меня ошибку выдает
\AutoIt\Temp\7.au3 (24) : ==> Array variable subscript badly formatted.:
 

Ksaan

Знающий
Сообщения
207
Репутация
15
Rinfes сказал(а):
Не получается изменить значения в ListView.
Ты присвайваешь значение не существующей ячейке массива
Код:
$num += 1
            ReDim $aItems[$num][2]
			$num -= 1
            $aItems[$num][0] = "*****"
            $aItems[$num][1] = "*****"
			_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView))
			_GUICtrlListView_AddArray($ListView, $aItems)
			$num += 1


Rinfes сказал(а):
не получается добавить новые пункты(в двумерный массив) и после сохранить в .ini файл.
Код:
$num -= 1
           IniWrite($sPath_ini, "Flag", "F1", $num)
           $a = 0 ; элемент массива
           $k = 1 ; счетчик для секции
           For $n = 1 to $num
              IniWrite($sPath_ini, "Col1", $k, $aItems[$a][0])
              IniWrite($sPath_ini, "Col2", $k, $aItems[$a][1])
              $a += 1
              $k += 1
            Next
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
можно сделать так
Код:
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <MsgBoxConstants.au3>

Global $hGUI, $ListView, $button, $num, $point = 0, $select, $edit = ''
Local $sPath_ini = @ScriptDir & "\edit.ini"

$hGUI = GUICreate("ListView", 550, 650, 198, 67)
GUISetBkColor(0xd5d2af)
$button = GUICtrlCreateButton("Добавить", 200, 600, 150, 25)
Global $ListView = GUICtrlCreateListView("Колонка1", 10, 10, 265, 550, $LVS_EDITLABELS)
GUICtrlSetBkColor(-1, 0xFFFEEE)
Global $ListView1 = GUICtrlCreateListView("Колонка2", 275, 10, 265, 550, $LVS_EDITLABELS)
GUICtrlSetBkColor(-1, 0xFFFEEE)
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 260)
GUICtrlSendMsg($ListView1, $LVM_SETCOLUMNWIDTH, 0, 260)

$num = IniRead($sPath_ini, "Flag", "F1", "n") ; число строк, которые должны забиться в ListView
Local $a = 1, $col1, $col2
Local $aItems[$num][2] ; заполнение массива
For $i = 0 To UBound($aItems) - 1
	$col1 = IniRead($sPath_ini, "Col1", $a, "n")
	$col2 = IniRead($sPath_ini, "Col2", $a, "n")
	If $col1 <> 'n' Then
		GUICtrlCreateListViewItem($col1, $ListView)
		$aItems[$i][0] = $col1
	EndIf
	If $col2 <> 'n' Then
		GUICtrlCreateListViewItem($col2, $ListView1)
		$aItems[$i][1] = $col2
	EndIf
	$a += 1
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Global $hList = GUICtrlGetHandle($ListView)
Global $hList1 = GUICtrlGetHandle($ListView1)

While 1
	If $point = 1 Then
		$edit = _GUICtrlListView_GetItemText($ListView, $select)
		$aItems[$select][0] = $edit
		$point = 0
	ElseIf $point = 2 Then
		$edit = _GUICtrlListView_GetItemText($ListView1, $select)
		$aItems[$select][1] = $edit
		$point = 0
	EndIf
	Switch GUIGetMsg()
		Case $button
			Local $ind = UBound($aItems)
			ReDim $aItems[$ind + 1][2]
			$aItems[$ind][0] = $ind;любое значение
			$aItems[$ind][1] = $ind;любое значение
			GUICtrlCreateListViewItem($ind, $ListView)
			GUICtrlCreateListViewItem($ind, $ListView1)
		Case $GUI_EVENT_CLOSE
			IniWrite($sPath_ini, "Flag", "F1", UBound($aItems))
			$k = 1 ; счетчик для секции
			For $i = 0 To UBound($aItems) - 1
				IniWrite($sPath_ini, "Col1", $k, $aItems[$i][0])
				IniWrite($sPath_ini, "Col2", $k, $aItems[$i][1])
				$k += 1
			Next
			Exit
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $imsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $wParam
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo
	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hList
			Switch $iCode
				Case $LVN_BEGINLABELEDITA, $LVN_BEGINLABELEDITW
					$tInfo = DllStructCreate($tagNMLVDISPINFO, $lParam)
					Return False
				Case $LVN_ENDLABELEDITA, $LVN_ENDLABELEDITW
					$tInfo = DllStructCreate($tagNMLVDISPINFO, $lParam)
					Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
					If StringLen(DllStructGetData($tBuffer, "Text")) Then
						$point = 1
						Return True
					EndIf
				Case $NM_RCLICK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$textedit = _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"))
					$select = DllStructGetData($tInfo, "Index")
					_GUICtrlListView_EditLabel($ListView, DllStructGetData($tInfo, "Index"))
			EndSwitch
		Case $hList1
			Switch $iCode
				Case $LVN_BEGINLABELEDITA, $LVN_BEGINLABELEDITW
					$tInfo = DllStructCreate($tagNMLVDISPINFO, $lParam)
					Return False
				Case $LVN_ENDLABELEDITA, $LVN_ENDLABELEDITW
					$tInfo = DllStructCreate($tagNMLVDISPINFO, $lParam)
					Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
					If StringLen(DllStructGetData($tBuffer, "Text")) Then
						$point = 2
						Return True
					EndIf
				Case $NM_RCLICK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$textedit = _GUICtrlListView_GetItemText($ListView1, DllStructGetData($tInfo, "Index"))
					$select = DllStructGetData($tInfo, "Index")
					_GUICtrlListView_EditLabel($ListView1, DllStructGetData($tInfo, "Index"))
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
Rinfes

Rinfes

Новичок
Сообщения
25
Репутация
0
Ksaan, спасибо. Заработало добавление в массив, но где то вычитается лишняя единица, поэтому он всегда записывает на 1 элемент меньше. А если вообще не было добавлений, то просто убирает 1 элемент.

joiner, большое спасибо за решение проблем. А так же за корректировку моего быдло-кода :ok:
Пара вопросов по коду:
1) Зачем нужны проверки при заполнении массива и добавления в ListView
Код:
If $col1 <> 'n' Then
        GUICtrlCreateListViewItem($col1, $ListView)
        $aItems[$i][0] = $col1
    EndIf

2) Эта часть кода отвечает за изменение текста в полях?
Код:
If $point = 1 Then
        $edit = _GUICtrlListView_GetItemText($ListView, $select)
        $aItems[$select][0] = $edit
        $point = 0
    ElseIf $point = 2 Then
        $edit = _GUICtrlListView_GetItemText($ListView1, $select)
        $aItems[$select][1] = $edit
        $point = 0
    EndIf
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
если ключа нет в файле, к примеру нет ключа 5, то не добавляется элемент. это можно не использовать, смотря какая задумка у тебя.
по второму вопросу: за изменение отвечает функция WM_NOTIFY. в основном цикле мы отлавливаем, что изменение было и получаем новые данные для изменения их в массиве. ведь из массива потом происходит запись в файл настроек
я исходил из твоего кода. поправил по мелочи - используй разные имена счетчиков.
 
Верх