Что нового

[Элементы GUI] Сохранение из GUICtrlCreateListView в БД/файл

---Zak---

Скриптер
Сообщения
455
Репутация
120
Добрый всем день или вечер.

Версия AutoIt: 3.3.8.0

Описание:
Как-то давным давно писал программу с GUICtrlCreateListView. Но решил пойти дальше, т.к. хорошая вещь и которую можно редактировать прям по двум кликам. В итоге вот в какую сторону копать не знаю.

Есть пример (см. "Примечание"), в котором с помощью двух кликов можно редактировать поля в GUICtrlCreateListView, с помощью скрытого Input... но как такое все добро сохранить желательно в БД не представляет возможности.

В следствии чего прошу у Вас помощи =) по созданию кнопочки, через которую все элементы из GUICtrlCreateListView сохранятся в файл, ну а в БД я сам переведу, если что =)
Примечания:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiHeader.au3>
#include <GuiListView.au3>

Opt("GUIOnEventMode", 1)
Global $sTitle = "Двойной клик на элементе", $aElement[2], $hActive

$GUI=GUICreate($sTitle, 650, 660)
GUISetOnEvent(-3, '_Exit')
Global $hInput = GUICtrlCreateInput("", 0, 0, 0, 0, 0x280)
GUICtrlSetState(-1, $GUI_HIDE)
Global $hLV = GUICtrlCreateListView('колонка 1|колонка 2', 11, 25, 622, 615, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
Global $hListView = GUICtrlGetHandle(-1)
$item1=GUICtrlCreateListViewItem('Пример|Редактирования', $hLV) ; создаём пункты
$item2=GUICtrlCreateListViewItem('текста|в итемах', $hLV )
$item3=GUICtrlCreateListViewItem('Списка|на основе' , $hLV)
$item4=GUICtrlCreateListViewItem('скрытого|инпута' , $hLV)
Global $dummy1 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Exit")
Global $dummy2 = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_SaveChange")
Global $AccelKeys[2][2] = [["{ESC}", $dummy1],["{ENTER}", $dummy2]]
GUISetAccelerators($AccelKeys)
GUISetState ()
GUIRegisterMsg(0x4E, "_WM_NOTIFY")

While 1
	Sleep(100000)
WEnd

Func _SaveChange()
	Local $sText = GUICtrlRead($hInput)
	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($hInput, $GUI_HIDE)
		_GUICtrlListView_SetColumnWidth($hListView, $aElement[1], -2) ;$LVSCW_AUTOSIZE_USEHEADER
	_GUICtrlListView_EndUpdate($hActive)
EndFunc 

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($sTitle, "", $hWnd)
	$x = $iSum + $aPos[0] + $aRect[0]
	$y = $aPos[1] + $aRect[1]
	$w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
	$h = $aRect[3] - $aRect[1]
	GUICtrlSetPos($hInput, $x + 3, $y + 1, $w, $h + 4)
	GUICtrlSetData($hInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
	GUICtrlSetState($hInput, $GUI_SHOW)
	GUICtrlSetState($hInput, $GUI_FOCUS)
	$aElement[0] = $iIndex
	$aElement[1] = $iSubItem
EndFunc

Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
	$hWndListView = $hLV ; ID des LV
	If Not IsHWnd($hWndListView) Then $hWndListView = GUICtrlGetHandle($hWndListView)
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hWndListView
			Switch $iCode
				Case $NM_DBLCLK ; двойной клик - редактируем пункт ListView
					Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					_GUICtrlListView_EditItem($hWndListView, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
					$hActive = $hWndListView
				Case $NM_CLICK ; одинарный клик - получаем индексы выделенных пунтков ListView
					GUICtrlSetState($hInput, $GUI_HIDE)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc

Func _Exit()
	Exit
EndFunc
Взято от сюда: http://pastebin.com/WhPLnjRN
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
For $i = 0 To _GUICtrlListView_GetItemCount(GUICtrlGetHandle($hListView)) - 1
	$First = _GUICtrlListView_GetItemText(GUICtrlGetHandle($hListView),$i)
	$Second= _GUICtrlListView_GetItemText(GUICtrlGetHandle($hListView),$i,1)
	ConsoleWrite($i & ") " & $First & "|" & $Second)
Next
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Вот так прошло, но идею я понял - спасиб огромное... оперативно прям =)
Код:
For $i = 0 To _GUICtrlListView_GetItemCount(GUICtrlGetHandle($hLV)) - 1
		 $First = _GUICtrlListView_GetItemText(GUICtrlGetHandle($hLV),$i)
		 $Second= _GUICtrlListView_GetItemText(GUICtrlGetHandle($hLV),$i,1)
		 ConsoleWrite($i & ") " & $First & "|" & $Second)
   Next
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Ну да, это я просто из своей программы вытащил =)
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Вдруг кому пригодиться:

В данном примере еще понадобится
Код:
_GUICtrlListView_GetColumnCount($hLV)

считает сколько столбцов...

ЗЫ: а то кому-нибудь вдруг лень читать =)
ЗЫЫ: тему закрываю :laugh:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
---Zak---,
Если строк много, то посмотрите здесь.
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
madmasles
На первое время можно сказать их нет - но возьму на заметку =) Пасиб
 
Верх