Что нового

Добавление через GUI новых элементов, с последующим сохранением

Rinfes

Новичок
Сообщения
25
Репутация
0
Здравствуйте. Прошу помочь решить проблему. Нужно, чтобы по клику созданной в GUI кнопки "Добавить", ниже уже созданных элементов Edit, появлялись новые элементы. Ну и чтобы сохранялись и появлялись при повторном запуске скрипта как новосозданные элементы, так и их содержимое.

Так как, скорее всего, возникнут проблемы с сохранением информации, содержащейся в поле Edit, может быть придется совсем переписать код. То есть создавать элементы Edit циклом. Ну и сохранять все через циклы, добавив пару счетчиков.

Ну или может подадите какую то иную идею. Спасибо.

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$sPath_ini = @ScriptDir & "\edit.ini"

$Form1 = GUICreate("Редактирование", 503, 650, 198, 67)


$Edit1 = GUICtrlCreateEdit("", 24, 16, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit1", "default"))
$Edit2 = GUICtrlCreateEdit("", 208, 16, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit2", "default"))
$Edit3 = GUICtrlCreateEdit("", 24, 48, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit3", "default"))
$Edit4 = GUICtrlCreateEdit("", 208, 48, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit4", "default"))
$Edit5 = GUICtrlCreateEdit("", 24, 80, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit5", "default"))
$Edit6 = GUICtrlCreateEdit("", 208, 80, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit6", "default"))
$Edit7 = GUICtrlCreateEdit("", 24, 112, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit7", "default"))
$Edit8 = GUICtrlCreateEdit("", 208, 112, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit8", "default"))
$Edit9 = GUICtrlCreateEdit("", 24, 144, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit9", "default"))
$Edit10 = GUICtrlCreateEdit("", 208, 144, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit10", "default"))
$Edit11 = GUICtrlCreateEdit("", 24, 176, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit11", "default"))
$Edit12 = GUICtrlCreateEdit("", 208, 176, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit12", "default"))
$Edit13 = GUICtrlCreateEdit("", 24, 208, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit13", "default"))
$Edit14 = GUICtrlCreateEdit("", 208, 208, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit14", "default"))
$Edit15 = GUICtrlCreateEdit("", 24, 240, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit15", "default"))
$Edit16 = GUICtrlCreateEdit("", 208, 240, 161, 17, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSetData(-1, IniRead($sPath_ini, "Edit_Text", "Edit16", "default"))



$Button1 = GUICtrlCreateButton("Добавить", 392, 16, 75, 25)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			IniWrite($sPath_ini, "Edit_Text", "Edit1", GUICtrlRead($Edit1))
			IniWrite($sPath_ini, "Edit_Text", "Edit2", GUICtrlRead($Edit2))
			IniWrite($sPath_ini, "Edit_Text", "Edit3", GUICtrlRead($Edit3))
			IniWrite($sPath_ini, "Edit_Text", "Edit4", GUICtrlRead($Edit4))
			IniWrite($sPath_ini, "Edit_Text", "Edit5", GUICtrlRead($Edit5))
			IniWrite($sPath_ini, "Edit_Text", "Edit6", GUICtrlRead($Edit6))
			IniWrite($sPath_ini, "Edit_Text", "Edit7", GUICtrlRead($Edit7))
			IniWrite($sPath_ini, "Edit_Text", "Edit8", GUICtrlRead($Edit8))
			IniWrite($sPath_ini, "Edit_Text", "Edit9", GUICtrlRead($Edit9))
			IniWrite($sPath_ini, "Edit_Text", "Edit10", GUICtrlRead($Edit10))
			IniWrite($sPath_ini, "Edit_Text", "Edit11", GUICtrlRead($Edit11))
			IniWrite($sPath_ini, "Edit_Text", "Edit12", GUICtrlRead($Edit12))
			IniWrite($sPath_ini, "Edit_Text", "Edit13", GUICtrlRead($Edit13))
			IniWrite($sPath_ini, "Edit_Text", "Edit14", GUICtrlRead($Edit14))
			IniWrite($sPath_ini, "Edit_Text", "Edit15", GUICtrlRead($Edit15))
			IniWrite($sPath_ini, "Edit_Text", "Edit16", GUICtrlRead($Edit16))
			Exit

	EndSwitch
WEnd
 

joiner

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

$sPath_ini = @ScriptDir & "\edit.ini"

$Form1 = GUICreate("Редактирование", 503, 650, 198, 67)
GUICtrlCreateButton("Добавить", 392, 16, 75, 25)
Local $left = 24, $left1 = 200, $steptop = 32, $top = 16, $flag = -1, $allind = 0, $flagind = 0
Local $iniread = IniReadSection($sPath_ini, "Edit_Text")
If Not @error Then
	$allind = $iniread[0][0]
	For $i = 1 To $iniread[0][0]
		GUICtrlCreateEdit($iniread[$i][1], $left, $top, 161, 17, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
		$flag = 0
		If $i >= $iniread[0][0] Then ExitLoop
		GUICtrlCreateEdit($iniread[$i + 1][1], $left1, $top, 161, 17, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
		$flag = 1
		$top += $steptop
		$i += 1
	Next
EndIf
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg(1)
	Select
		Case $nMsg[0] = $GUI_EVENT_CLOSE
			If $flagind Then
				Local $ind = 4
				For $i = 1 To $allind
					Local $data = GUICtrlRead($ind)
					If $data Then IniWrite($sPath_ini, "Edit_Text", "Edit" & $i, $data)
					$ind += 1
				Next
			EndIf
			Exit
		Case $nMsg[0] = 3
			$flagind = 1
			If $flag = 1 Or $flag = -1 Then
				GUICtrlCreateEdit('', $left, $top, 161, 17, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
				$flag = 0
				$allind += 1
			ElseIf $flag = 0 Then
				GUICtrlCreateEdit('', $left1, $top, 161, 17, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
				$top += $steptop
				$flag = 1
				$allind += 1
			EndIf

	EndSelect
WEnd
 
Автор
Rinfes

Rinfes

Новичок
Сообщения
25
Репутация
0
joiner
Огромное спасибо)
И у самого не получается добавить полосу прокрутки, так как будет много созданных элементов :( Можешь помочь?
Код:
$WS_VSCROLL
у меня работает криво

И мог бы, пожалуйста, добавить комментарии к коду? Многое не понимаю. Например
Код:
$allind = $iniread[0][0]

Как понимать эти нули?)

OffTopic:
как поднимать репутацию? не вижу плюсов, стрелочек вверх и т.д
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
пробуй так
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiScrollBars.au3>
#include <StructureConstants.au3>
Local $left = 24, $left1 = 200, $steptop = 32, $top = 16, $flag = -1, $allind = 0, $flagind = 0
Local $sPath_ini = @ScriptDir & "\edit.ini"
Local $Form1 = GUICreate("Редактирование", 500, 200, -1, -1)
GUICtrlCreateButton("Добавить", 400, 16, 75, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
_GUIScrollBars_Init($Form1)
Local $iniread = IniReadSection($sPath_ini, "Edit_Text")
If Not @error Then
	$allind = $iniread[0][0]
	For $i = 1 To $iniread[0][0]
		GUICtrlCreateEdit($iniread[$i][1], $left, $top, 161, 17, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
		$flag = 0
		If $i >= $iniread[0][0] Then ExitLoop
		GUICtrlCreateEdit($iniread[$i + 1][1], $left1, $top, 161, 17, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
		$flag = 1
		$top += $steptop
		$i += 1
	Next
EndIf

While 1
	$nMsg = GUIGetMsg(1)
	Select
		Case $nMsg[0] = $GUI_EVENT_CLOSE
			If $flagind Then
				Local $ind = 4
				For $i = 1 To $allind
					Local $data = GUICtrlRead($ind)
					If $data Then IniWrite($sPath_ini, "Edit_Text", "Edit" & $i, $data)
					$ind += 1
				Next
			EndIf
			Exit
		Case $nMsg[0] = 3
			$flagind = 1
			If $flag = 1 Or $flag = -1 Then
				GUICtrlCreateEdit('', $left, $top, 161, 17, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
				$flag = 0
				$allind += 1
			ElseIf $flag = 0 Then
				GUICtrlCreateEdit('', $left1, $top, 161, 17, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
				$top += $steptop
				$flag = 1
				$allind += 1
			EndIf

	EndSelect
WEnd

Func WM_VSCROLL($hWnd, $iMsg, $wParam, $lParam)
	#forceref $iMsg, $wParam, $lParam
	Local $iScrollCode = BitAND($wParam, 0x0000FFFF)
	Local $iIndex = -1, $iCharY, $iPosY
	Local $iMin, $iMax, $iPage, $iPos, $iTrackPos
	For $x = 0 To UBound($__g_aSB_WindowInfo) - 1
		If $__g_aSB_WindowInfo[$x][0] = $hWnd Then
			$iIndex = $x
			$iCharY = $__g_aSB_WindowInfo[$iIndex][3]
			ExitLoop
		EndIf
	Next
	If $iIndex = -1 Then Return 0
	Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
	$iMin = DllStructGetData($tSCROLLINFO, "nMin")
	$iMax = DllStructGetData($tSCROLLINFO, "nMax")
	$iPage = DllStructGetData($tSCROLLINFO, "nPage")
	$iPosY = DllStructGetData($tSCROLLINFO, "nPos")
	$iPos = $iPosY
	$iTrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
	Switch $iScrollCode
		Case $SB_TOP
			DllStructSetData($tSCROLLINFO, "nPos", $iMin)
		Case $SB_BOTTOM
			DllStructSetData($tSCROLLINFO, "nPos", $iMax)
		Case $SB_LINEUP
			DllStructSetData($tSCROLLINFO, "nPos", $iPos - 1)
		Case $SB_LINEDOWN
			DllStructSetData($tSCROLLINFO, "nPos", $iPos + 1)
		Case $SB_PAGEUP
			DllStructSetData($tSCROLLINFO, "nPos", $iPos - $iPage)
		Case $SB_PAGEDOWN
			DllStructSetData($tSCROLLINFO, "nPos", $iPos + $iPage)
		Case $SB_THUMBTRACK
			DllStructSetData($tSCROLLINFO, "nPos", $iTrackPos)
	EndSwitch
	DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
	_GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
	_GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
	$iPos = DllStructGetData($tSCROLLINFO, "nPos")
	If ($iPos <> $iPosY) Then
		_GUIScrollBars_ScrollWindow($hWnd, 0, $iCharY * ($iPosY - $iPos))
		$iPosY = $iPos
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_VSCROLL
Rinfes [?]
Как понимать эти нули?)
функция чтения файла настроек возвращает массив. смотри справку
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Автор
Rinfes

Rinfes

Новичок
Сообщения
25
Репутация
0
AZJIO, спасибо за информацию. Пример joiner'a тяжеловат мне. И в конкретном случае, мне важен не столько результат, сколько понимание того, что происходит в скрипте)
Почитаю тогда про ListView, и попробую сам написать.
 

joiner

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


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

как то писал базу для принтеров и запчастей к ним. база основана на обычном ini-файле. там использовать ListView , живой поиск по базе, редактирование и сохранение. если нужно будет как пример, то дам ссылку
сделано было для работы. поэтому важен был функционал
 
Автор
Rinfes

Rinfes

Новичок
Сообщения
25
Репутация
0
joiner Был бы признателен. Интересно было бы ознакомиться.
Я тут начал писать через ListView. Возникла проблема с редактированием строки.
Если около 10 раз кликнуть на СТРОКУ! то можно изменить текст в нужной строке в 1 колонке. Но если кликнуть потом в любом месте, то текст возвращается к исходному. Как решить эту проблему?
Код:
$ListView = GUICtrlCreateListView("Колонка1|Колонка2", 10, 10, 530, 550, $LVS_EDITLABELS)
не помогло
 

joiner

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Rinfes,
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 
Верх