Что нового

Создание формы для заполнения по типу базы данных

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
ВиталийВВ [?]
а чем последний вариант отличаетсяот предпоследнего?
разница в принципе работы с дочерним окном, декларировании переменных плюс очищен разный "сумбур", короче, оптимизация кода

ra4o [?]
а затем его удалять, ведь если таких окон может быть несколько так будет проще, чем создавать все окна сразу и затем вызывать нужное , следить, что-бы не остались "старые" значения и относительно загрузки памяти рациональнее
проще для малых окон, но зачем? окон может быть сколь угодно. у всех есть дескрипторы. разные имена переменных. к тому же, старые значения удаляются во время установки новых.
можно все повесить на OnEvent и не опрашивать в цикле о наличии события.
короче, ребята, что использовать - это ваше дело. запомнить: все переменные нужно объявлять. иначе может появиться блуждающий глюк :smile:
осваивайте язык и недоумений не будет. коды клеить это хорошо, но придется когда-нить свое с нуля писать
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
joiner сказал(а):
прошу извинить, ошибся с предыдущим кодом.
нужный вариант
Код:
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <GuiButton.au3>
#include <File.au3>
#include <WindowsConstants.au3>

Global $iIndex, $EditLine = 0
; Создание GUI
Global $hGUI = GUICreate("Форма", 435, 350)
Global $iListView = GUICtrlCreateListView("№|Название Фирмы|ИНН|Адрес|Иное поле", 2, 2, 430, 200, $GUI_SS_DEFAULT_LISTVIEW, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
Global $hWndListView = GUICtrlGetHandle($iListView)
; Ширина колонки 0-я 30, остальные - 100
_GUICtrlListView_SetColumnWidth($iListView, 0, 30)
For $i = 1 To 4
	_GUICtrlListView_SetColumnWidth($iListView, $i, 100)
Next

; Поля ввода данных
Local $Name = GUICtrlCreateInput('Название Фирмы', 5, 250, 210, 30)
;GUICtrlSetFont(-1, 12, 500)
Local $INN = GUICtrlCreateInput('ИНН', 220, 250, 210, 30)
;GUICtrlSetFont(-1, 12, 500)
Local $Adres = GUICtrlCreateInput('Адрес', 5, 290, 210, 30)
;GUICtrlSetFont(-1, 12, 500)
Local $Else = GUICtrlCreateInput('Иное поле', 220, 290, 210, 30)
;GUICtrlSetFont(-1, 12, 500)

Local $AddBut = GUICtrlCreateButton('Добавить Запись', 10, 210, 110, 30)
Local $SaveBut = GUICtrlCreateButton('Запись в Файл', 130, 210, 110, 30)
Local $ReadBut = GUICtrlCreateButton('Прочитать из файла', 250, 210, 110, 30)
GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

Local $hAditLine_GUI = GUICreate('Редактировать данные', 280, 170, -1, -1, -1, -1, $hGUI) ; создаём окно
GUICtrlCreateLabel('Название', 5, 7, 60, 20)
Local $NameL = GUICtrlCreateInput('', 70, 5, 200, 20)
GUICtrlCreateLabel('ИНН', 5, 32, 60, 20)
Local $INNL = GUICtrlCreateInput('', 70, 30, 200, 20)
GUICtrlCreateLabel('Адрес', 5, 57, 60, 20)
Local $AdresL = GUICtrlCreateInput('', 70, 55, 200, 20)
GUICtrlCreateLabel('Иное поле', 5, 84, 60, 20)
Local $ElseL = GUICtrlCreateInput('', 70, 80, 200, 20)
Local $SaveButL = GUICtrlCreateButton('Сохранить', 80, 120, 120, 30)
GUISetState(@SW_HIDE, $hAditLine_GUI) 

Local $msg, $Text, $hFile
While 1
	$msg = GUIGetMsg(1)
	Switch $msg[0]
		Case $GUI_EVENT_CLOSE
			If $msg[1] = $hGUI Then
				Exit
			ElseIf $msg[1] = $hAditLine_GUI Then
				GUISetState(@SW_HIDE, $hAditLine_GUI)
				GUISetState(@SW_ENABLE, $hGUI)
				WinActivate($hGUI)
			EndIf
		Case $SaveButL
			_GUICtrlListView_SetItemText($iListView, $iIndex, GUICtrlRead($NameL), 1)
			_GUICtrlListView_SetItemText($iListView, $iIndex, GUICtrlRead($INNL), 2)
			_GUICtrlListView_SetItemText($iListView, $iIndex, GUICtrlRead($AdresL), 3)
			_GUICtrlListView_SetItemText($iListView, $iIndex, GUICtrlRead($ElseL), 4)
			GUISetState(@SW_HIDE, $hAditLine_GUI)
			GUISetState(@SW_ENABLE, $hGUI)
			WinActivate($hGUI)
		Case $AddBut ; Добавить пункт в таблицу
			GUICtrlCreateListViewItem(_GUICtrlListView_GetItemCount($iListView) + 1 & '|' & GUICtrlRead($Name) & '|' & GUICtrlRead($INN) & '|' & GUICtrlRead($Adres) & '|' & GUICtrlRead($Else), $iListView)
		Case $SaveBut ;Записать в файл
			Local $Path = FileSaveDialog("Выберите имя.", @ScriptDir, "Текстовый файл (*.txt)", 2)
			If Not @error Then
				$hFile = FileOpen($Path, 2)
				For $i = 0 To _GUICtrlListView_GetItemCount($iListView) - 1
					$Text = ''
					For $j = 1 To _GUICtrlListView_GetColumnCount($iListView) - 1
						$Text = $Text & _GUICtrlListView_GetItemText($iListView, $i, $j) & ';'
					Next
					FileWriteLine($hFile, $Text)
				Next
				FileClose($hFile)
			EndIf
		Case $ReadBut ;Заполнение таблицы из файла
			_GUICtrlListView_DeleteAllItems($iListView)
			Local $OpenPath = FileOpenDialog('Открыть файл', @ScriptDir, 'Текстовый файл (*.txt)', 1 + 2)
			If Not @error Then
				$hFile = FileOpen($OpenPath, 0)
				For $i = 1 To _FileCountLines($OpenPath)
					$Text = StringReplace(FileReadLine($hFile, $i), ';', '|')
					$Text = $i & '|' & StringTrimRight($Text, 1)
					GUICtrlCreateListViewItem($Text, $iListView)
				Next
				FileClose($hFile)
			EndIf
	EndSwitch
	If $EditLine = 1 Then
		GUISetState(@SW_DISABLE, $hGUI)
		GUISetState(@SW_SHOW, $hAditLine_GUI)
		GUICtrlSetData($NameL, _GUICtrlListView_GetItemText($iListView, $iIndex, 1))
		GUICtrlSetData($INNL, _GUICtrlListView_GetItemText($iListView, $iIndex, 2))
		GUICtrlSetData($AdresL, _GUICtrlListView_GetItemText($iListView, $iIndex, 3))
		GUICtrlSetData($ElseL, _GUICtrlListView_GetItemText($iListView, $iIndex, 4))
		$EditLine = 0
	EndIf
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iCode, $tNMHDR, $tInfo
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
	$iCode = DllStructGetData($tNMHDR, 'Code')
	Switch $hWndFrom
		Case $hWndListView
			Switch $iCode
				Case $NM_RCLICK ;один клик правой кнопки мыши
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					$iIndex = DllStructGetData($tInfo, 'Index')
					If $iIndex <> -1 Then
						$EditLine = 1
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Можно ли в этот код добавить кнопку удаления выбранной строки? (Редактирование - имеется,еще бы убрать сдуру введенную строку)

Можно, использую функцию: _GUICtrlListView_DeleteItem($iListView, GUICtrlRead($iListView))

Но сейчас наткнулся на сложность: если удаляю строку из середины ListView, то сбивается нумерация.
Как получить номер выделенной строки?
Я где то рядом с решением, но запутался :(



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

ВиталийВВ сказал(а):
joiner сказал(а):
прошу извинить, ошибся с предыдущим кодом.
нужный вариант
Код:
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <GuiButton.au3>
#include <File.au3>
#include <WindowsConstants.au3>

Global $iIndex, $EditLine = 0
; Создание GUI
Global $hGUI = GUICreate("Форма", 435, 350)
Global $iListView = GUICtrlCreateListView("№|Название Фирмы|ИНН|Адрес|Иное поле", 2, 2, 430, 200, $GUI_SS_DEFAULT_LISTVIEW, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
Global $hWndListView = GUICtrlGetHandle($iListView)
; Ширина колонки 0-я 30, остальные - 100
_GUICtrlListView_SetColumnWidth($iListView, 0, 30)
For $i = 1 To 4
	_GUICtrlListView_SetColumnWidth($iListView, $i, 100)
Next

; Поля ввода данных
Local $Name = GUICtrlCreateInput('Название Фирмы', 5, 250, 210, 30)
;GUICtrlSetFont(-1, 12, 500)
Local $INN = GUICtrlCreateInput('ИНН', 220, 250, 210, 30)
;GUICtrlSetFont(-1, 12, 500)
Local $Adres = GUICtrlCreateInput('Адрес', 5, 290, 210, 30)
;GUICtrlSetFont(-1, 12, 500)
Local $Else = GUICtrlCreateInput('Иное поле', 220, 290, 210, 30)
;GUICtrlSetFont(-1, 12, 500)

Local $AddBut = GUICtrlCreateButton('Добавить Запись', 10, 210, 110, 30)
Local $SaveBut = GUICtrlCreateButton('Запись в Файл', 130, 210, 110, 30)
Local $ReadBut = GUICtrlCreateButton('Прочитать из файла', 250, 210, 110, 30)
GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

Local $hAditLine_GUI = GUICreate('Редактировать данные', 280, 170, -1, -1, -1, -1, $hGUI) ; создаём окно
GUICtrlCreateLabel('Название', 5, 7, 60, 20)
Local $NameL = GUICtrlCreateInput('', 70, 5, 200, 20)
GUICtrlCreateLabel('ИНН', 5, 32, 60, 20)
Local $INNL = GUICtrlCreateInput('', 70, 30, 200, 20)
GUICtrlCreateLabel('Адрес', 5, 57, 60, 20)
Local $AdresL = GUICtrlCreateInput('', 70, 55, 200, 20)
GUICtrlCreateLabel('Иное поле', 5, 84, 60, 20)
Local $ElseL = GUICtrlCreateInput('', 70, 80, 200, 20)
Local $SaveButL = GUICtrlCreateButton('Сохранить', 80, 120, 120, 30)
GUISetState(@SW_HIDE, $hAditLine_GUI) 

Local $msg, $Text, $hFile
While 1
	$msg = GUIGetMsg(1)
	Switch $msg[0]
		Case $GUI_EVENT_CLOSE
			If $msg[1] = $hGUI Then
				Exit
			ElseIf $msg[1] = $hAditLine_GUI Then
				GUISetState(@SW_HIDE, $hAditLine_GUI)
				GUISetState(@SW_ENABLE, $hGUI)
				WinActivate($hGUI)
			EndIf
		Case $SaveButL
			_GUICtrlListView_SetItemText($iListView, $iIndex, GUICtrlRead($NameL), 1)
			_GUICtrlListView_SetItemText($iListView, $iIndex, GUICtrlRead($INNL), 2)
			_GUICtrlListView_SetItemText($iListView, $iIndex, GUICtrlRead($AdresL), 3)
			_GUICtrlListView_SetItemText($iListView, $iIndex, GUICtrlRead($ElseL), 4)
			GUISetState(@SW_HIDE, $hAditLine_GUI)
			GUISetState(@SW_ENABLE, $hGUI)
			WinActivate($hGUI)
		Case $AddBut ; Добавить пункт в таблицу
			GUICtrlCreateListViewItem(_GUICtrlListView_GetItemCount($iListView) + 1 & '|' & GUICtrlRead($Name) & '|' & GUICtrlRead($INN) & '|' & GUICtrlRead($Adres) & '|' & GUICtrlRead($Else), $iListView)
		Case $SaveBut ;Записать в файл
			Local $Path = FileSaveDialog("Выберите имя.", @ScriptDir, "Текстовый файл (*.txt)", 2)
			If Not @error Then
				$hFile = FileOpen($Path, 2)
				For $i = 0 To _GUICtrlListView_GetItemCount($iListView) - 1
					$Text = ''
					For $j = 1 To _GUICtrlListView_GetColumnCount($iListView) - 1
						$Text = $Text & _GUICtrlListView_GetItemText($iListView, $i, $j) & ';'
					Next
					FileWriteLine($hFile, $Text)
				Next
				FileClose($hFile)
			EndIf
		Case $ReadBut ;Заполнение таблицы из файла
			_GUICtrlListView_DeleteAllItems($iListView)
			Local $OpenPath = FileOpenDialog('Открыть файл', @ScriptDir, 'Текстовый файл (*.txt)', 1 + 2)
			If Not @error Then
				$hFile = FileOpen($OpenPath, 0)
				For $i = 1 To _FileCountLines($OpenPath)
					$Text = StringReplace(FileReadLine($hFile, $i), ';', '|')
					$Text = $i & '|' & StringTrimRight($Text, 1)
					GUICtrlCreateListViewItem($Text, $iListView)
				Next
				FileClose($hFile)
			EndIf
	EndSwitch
	If $EditLine = 1 Then
		GUISetState(@SW_DISABLE, $hGUI)
		GUISetState(@SW_SHOW, $hAditLine_GUI)
		GUICtrlSetData($NameL, _GUICtrlListView_GetItemText($iListView, $iIndex, 1))
		GUICtrlSetData($INNL, _GUICtrlListView_GetItemText($iListView, $iIndex, 2))
		GUICtrlSetData($AdresL, _GUICtrlListView_GetItemText($iListView, $iIndex, 3))
		GUICtrlSetData($ElseL, _GUICtrlListView_GetItemText($iListView, $iIndex, 4))
		$EditLine = 0
	EndIf
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iCode, $tNMHDR, $tInfo
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
	$iCode = DllStructGetData($tNMHDR, 'Code')
	Switch $hWndFrom
		Case $hWndListView
			Switch $iCode
				Case $NM_RCLICK ;один клик правой кнопки мыши
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					$iIndex = DllStructGetData($tInfo, 'Index')
					If $iIndex <> -1 Then
						$EditLine = 1
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Можно ли в этот код добавить кнопку удаления выбранной строки? (Редактирование - имеется,еще бы убрать сдуру введенную строку)

Можно, использую функцию: _GUICtrlListView_DeleteItem($iListView, GUICtrlRead($iListView))

Но сейчас наткнулся на сложность: если удаляю строку из середины ListView, то сбивается нумерация.
Как получить номер выделенной строки?
Я где то рядом с решением, но запутался :(

В итоге - сложность представляет получение номера строки для удаления. Удалять - просто, но нужно получить именно номер строки из ListView. Пока остановился на алгоритме (он корявый, но работает): получаю номер строки из столбика с номером, удаляю по нему строку, полученное скидывают в текстовый файл, обнуляю ListView, закачиваю все обратно.
Оно работает конечно, и нумерация получается красиво, но алгоритм, на мой взгляд, сильно не оптимальный :(
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Кажется, все таки смог (не без помощи форума :smile: , подсказали 1 функцию) решить проблему.
Код:
Case $del ; Очищение
			_GUICtrlListView_DeleteAllItems($iListView)
		Case $button ; Удаление
			  $qq = _GUICtrlListView_GetSelectedIndices($iListView)
			  If $qq <> "" Then _GUICtrlListView_DeleteItem($iListView, $qq)
			For $i = 0 To _GUICtrlListView_GetItemCount($iListView) - 1
				_GUICtrlListView_SetItemText($iListView, $i, $i+1, 0)
			Next
 
Верх