Не работают кнопки и сохранение в форме Topic is solved

Помощь в написании скриптов
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Не работают кнопки и сохранение в форме

26 Apr 2023, 08:37

Здравствуйте. Есть форма с ListView и кнопками для его редактирования ("Добавить", "Редактировать", "Удалить"). Введенные в таблицу значения должны сохраняться в отдельном файле (ini или txt)
Проблема 1 - кнопки категорически отказываются работать, хотя вроде бы все обработчики нажатия добавлены. Что здесь не так?
Проблема 2 - как реализовать сохранение введенных значений? Я знаю, как с помощью IniWrite сохранять данные из текстовых полей, но тут таблица, и данные будут не в единственном экземпляре...

Code: Select all

; Создаем форму
Gui +hwndhWnd
Gui Add, ListView, w200 r10, Название|Количество
T1=100
T2=100
LV_ModifyCol(1,T1)
LV_ModifyCol(2,T2)

Gui Add, Button, x10 y120 w80 h30 hwndhAddButton gAddButton, Добавить
Gui Add, Button, x100 y120 w80 h30 hwndhEditButton gEditButton, Редактировать
Gui Add, Button, x190 y120 w80 h30 hwndhDeleteButton gDeleteButton, Удалить
Gui Show

return

; Подпрограммы для обработки нажатия кнопок
AddSubroutine:
  InputBox, name, Название, Введите название товара:
  InputBox, count, Количество, Введите количество товара:
  LV_Add("", name, count)
return

EditSubroutine:
  selected := LV_GetNext()
  if (selected != "")
  {
    name := LV_GetText(selected, 1)
    count := LV_GetText(selected, 2)
    InputBox, name, Название, %name%
    InputBox, count, Количество, %count%
    LV_Modify(selected, "", name, count, price)
  }
return

DeleteSubroutine:
  selected := LV_GetNext()
  if (selected != "")
  {
    LV_Delete(selected)
  }
return

; Обработчики нажатия кнопок
AddButton:
  GoSub, AddSubroutine
return

EditButton:
  GoSub, EditSubroutine
return

DeleteButton:
  GoSub, DeleteSubroutine
return

; Связываем кнопки с соответствующими обработчиками нажатия
GuiControl, +gAddButton, % "hwnd" hAddButton
GuiControl, +gEditButton, % "hwnd" hEditButton
GuiControl, +gDeleteButton, % "hwnd" hDeleteButton
mcl
Posts: 359
Joined: 04 May 2018, 16:35

Re: Не работают кнопки и сохранение в форме

26 Apr 2023, 10:02

marusa122 wrote: Есть форма с ListView и кнопками для его редактирования ("Добавить", "Редактировать", "Удалить"). Введенные в таблицу значения должны сохраняться в отдельном файле (ini или txt)

Code: Select all

; Создаем форму
Gui +hwndhWnd
Gui Add, ListView, w260 r10 vLVPrices gLVPrices, Название|Количество
T1=150
T2=100
LV_ModifyCol(1,T1)
LV_ModifyCol(2,T2)

; У меня кнопки оказались перекрыты ListView, и оттого не нажимались.
Gui Add, Button, x10  y+m w80 h30 hwndhAddButton gAddButton, Добавить
Gui Add, Button, x100 yp  w80 h30 hwndhEditButton gEditButton, Изменить
Gui Add, Button, x190 yp  w80 h30 hwndhDeleteButton gDeleteButton, Удалить

Gui Add, Button, x10  y+m w125 h30 hwndhSaveButton gSaveButton, Сохранить
Gui Add, Button, x+10 yp  w125 h30 hwndhReadButton gReadButton, Загрузить
Gui Show

return


; Обработчики нажатия кнопок
AddButton:
  GoSub, AddSubroutine
return

EditButton:
  GoSub, EditSubroutine
return

DeleteButton:
  GoSub, DeleteSubroutine
return

SaveButton:
  GoSub, SaveSubroutine
Return

ReadButton:
  GoSub, ReadSubroutine
Return

LVPrices:
  If (A_GuiEvent == "DoubleClick")
    GoSub, EditSubroutine
Return


; Подпрограммы для обработки нажатия кнопок
AddSubroutine:
  InputBox, name, Название, Введите название товара:
  InputBox, count, Количество, Введите количество товара:
  LV_Add("", name, count)
return

EditSubroutine:
  selected := LV_GetNext(1)
  if (selected != 0)
  {
    ; Первым аргументом для LV_GetText - переменная для записи.
	; Глядя на LV_GetNext - да, выглядит нелогично, но что есть.
    LV_GetText(name,  selected, 1)
    LV_GetText(count, selected, 2)
    InputBox, name, Название, %name%,,,,,,,, %name%
    InputBox, count, Количество, %count%,,,,,,,, %count%
    LV_Modify(selected, "", name, count, price)
  }
return

DeleteSubroutine:
  selected := LV_GetNext()
  if (selected != 0)
  {
    LV_Delete(selected)
  }
return

SaveSubroutine:
  ; Если в файле уже было 5 строк, а мы запишем только 3,
  ; то две последние останутся с прошлого раза.
  ; Поэтому удалим всю секцию
  IniDelete, GoodsAndPrices.ini, Prices
  Loop % LV_GetCount()
  {
    LV_GetText(name , A_Index, 1)
    LV_GetText(count, A_Index, 2)
	IniWrite, %count%, GoodsAndPrices.ini, Prices, %name%
  }
  Return
return

ReadSubroutine:
  LV_Delete()
  GuiControl, -Redraw, LVPrices
  IniRead, allPrices, GoodsAndPrices.ini, Prices
  priceList := StrSplit(allPrices, "`n")
  For i, pricePair In priceList
  {
    pricePair := StrSplit(pricePair, "=",, 2)
	LV_Add("", pricePair[1], pricePair[2])
  }
  GuiControl, +Redraw, LVPrices
return
  

; Этот код никогда не выполнится:
; Секция автовыполнения закончилась после Gui Show,
; а больше сюда ничего не ведёт.
GuiControl, +gAddButton, % "hwnd" hAddButton
GuiControl, +gEditButton, % "hwnd" hEditButton
GuiControl, +gDeleteButton, % "hwnd" hDeleteButton
github://oGDIp - GDI+ wrapper for AHK v1.1
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Не работают кнопки и сохранение в форме

26 Apr 2023, 11:26

mcl, спасибо. Начала редактировать форму, и появились вопросы.

Code: Select all

; Создаем форму
Gui +hwndhWnd
Gui Add, ListView, w260 r10 vLVPrices gLVPrices, Название|Количество|Ссылка
T1=150
T2=100
T3=100
LV_ModifyCol(1,T1)
LV_ModifyCol(2,T2)
LV_ModifyCol(3,T3)

; У меня кнопки оказались перекрыты ListView, и оттого не нажимались.
Gui Add, Button, x10  y+m w80 h30 hwndhAddButton gAddButton, Добавить
Gui Add, Button, x100 yp  w80 h30 hwndhEditButton gEditButton, Изменить
Gui Add, Button, x190 yp  w80 h30 hwndhDeleteButton gDeleteButton, Удалить

Gui Add, Button, x10  y+m w80 h30 hwndhSaveButton gSaveButton, Сохранить
Gui Add, Button, x+10 yp  w80 h30 hwndhReadButton gReadButton, Загрузить
Gui Add, Button, x+10 yp  w80 h30 hwndhReadButton gExitButton, Выйти ; добавила кнопку для выхода из формы и отмены несохраненных изменений
Gui, Show

return


; Обработчики нажатия кнопок
AddButton:
  GoSub, AddSubroutine
return

; эта кнопка почему-то не работает
EditButton:
  GoSub, EditSubroutine
return

DeleteButton:
  GoSub, DeleteSubroutine
return

SaveButton:
  GoSub, SaveSubroutine
Return

ReadButton:
  GoSub, ReadSubroutine
Return

LVPrices:
  If (A_GuiEvent == "DoubleClick")
    GoSub, EditSubroutine
Return

; Предполагается, что это обработчик для выхода из формы
ExitButton:
	ExitApp


; Подпрограммы для обработки нажатия кнопок
AddSubroutine:

; А можно ли вместо InputBox добавить окно с формой? Как тогда надо вписывать столбцы для добавления?
; это моя попытка написать такую форму, но при нажатии кнопки "Добавить" сразу открывается выбор папки
; который должен открываться при нажатии кнопки с многоточием
; и даже после выбора расположения папка не отображается в форме (и, соответственно, не сохраняется)

	Gui, New
	Gui, Add, Text  , Xm Y+m  W130 R1,  Название товара
	Gui, Add, Edit  , X+10  Yp   W120 R1,  %name%

	Gui, Add, Text  , Xm Y+m  W130 R1,  Количество
	Gui, Add, Edit  , X+10  Yp   W120 R1,  %count%
	
	Gui, Add, Text  , Xm+20 Y+m  W130 R1,  Ссылка:
	Gui, Add, Edit  , X+10  Yp   W100 R1,  %link%
	Gui, Add, Button, X+0   Yp   W20  R1   gOnButtonFolder,  ...

; предполагается, что это кнопки в форме для добавления строки таблицы
	; Gui, Add, Button, Xm  Y+m W285 R3  gOnButtonAdd  , Добавить
	; Gui, Add, Button, X+5 Yp     W140 R1  gOnButtonExit , Выйти

	Gui, Show

OnButtonFolder:
{
	FileSelectFolder, vOutFolder,, 3, Выберите папку для поиска товара
	If (ErrorLevel == 0)
		GuiControl, Text, Ed_Folder, %vOutFolder%
}

; Gui хотела добавить вместо этого

InputBox, name, Название, Введите название товара:
InputBox, count, Количество, Введите количество товара:
InputBox, link, Ссылка, Введите ссылку или расположение информации о товаре:
  LV_Add("", name, count, link)

; Еще вопрос: как сделать информацию в третьем столбце (ссылку) кликабельной?
; Это мое предположение, но не уверена, что будет работать
;  if (urlx="http" || pathx=":\")
;     {
;     try
;	run,%link%
;	return
;     }
	 
return

; Вот эта кнопка ("Изменить") вообще не работает почему-то
EditSubroutine:
  selected := LV_GetNext(1)
  if (selected != 0)
  {
    ; Первым аргументом для LV_GetText - переменная для записи.
	; Глядя на LV_GetNext - да, выглядит нелогично, но что есть.
    LV_GetText(name,  selected, 1)
    LV_GetText(count, selected, 2)
    LV_GetText(link, selected, 2)
    InputBox, name, Название, %name%,,,,,,,, %name%
    InputBox, count, Количество, %count%,,,,,,,, %count%
    LV_Modify(selected, "", name, count, link)
  }
return

DeleteSubroutine:
  selected := LV_GetNext()
  if (selected != 0)
  {
    LV_Delete(selected)
  }
return

SaveSubroutine:
  ; Если в файле уже было 5 строк, а мы запишем только 3,
  ; то две последние останутся с прошлого раза.
  ; Поэтому удалим всю секцию
  IniDelete, GoodsAndPrices.ini, Prices
  Loop % LV_GetCount()
  {
    LV_GetText(name , A_Index, 1)
    LV_GetText(count, A_Index, 2)
	IniWrite, %count%, GoodsAndPrices.ini, Prices, %name%
  }
  Return
return

; Возможно ли, чтобы этот сценарий выполнялся автоматически при открытии формы?
ReadSubroutine:
  LV_Delete()
  GuiControl, -Redraw, LVPrices
  IniRead, allPrices, GoodsAndPrices.ini, Prices
  priceList := StrSplit(allPrices, "`n")
  For i, pricePair In priceList
  {
    pricePair := StrSplit(pricePair, "=",, 2)
	LV_Add("", pricePair[1], pricePair[2])
  }
  GuiControl, +Redraw, LVPrices
return
mcl
Posts: 359
Joined: 04 May 2018, 16:35

Re: Не работают кнопки и сохранение в форме

26 Apr 2023, 14:35

marusa122 wrote: Начала редактировать форму, и появились вопросы.

Code: Select all

; >>  Если вы хотите работать с несколькими окнами, дайте им имена.
; >>  Иначе скрипт может не понять, в какое окно вы кнопки добавляете.
; >>  И все переменные и метки, к ним относящиеся, тоже желательно назвать,
; >>  чтобы они не пересекались друг с другом.
; >>  И да – работать с этим будет непросто.

; >>  Не знаю, как у Вас, но у меня список визуально дребезжит при прокрутке.
; >>  А со стилем LVS_EX_DOUBLEBUFFER (+LV0x10000) - не дребезжит. Рекомендую.

Gui, guiMain: New, HWNDhwndGuiMain
Gui, guiMain: Add, ListView, w260 r10 vLVPrices gGuiMain_LVPrices +LV0x10000, Название|Количество|Ссылка
LV_ModifyCol(1, 150)  ; Название
LV_ModifyCol(2, 100)  ; Количество
LV_ModifyCol(3, 100)  ; Ссылка

Gui, guiMain: Add, Button, x10  y+m w80 h30  gGuiMain_ButtonAdd   , Добавить
Gui, guiMain: Add, Button, x100 yp  w80 h30  gGuiMain_ButtonEdit  , Изменить
Gui, guiMain: Add, Button, x190 yp  w80 h30  gGuiMain_ButtonDelete, Удалить

Gui, guiMain: Add, Button, x10  y+m w80 h30  gGuiMain_ButtonSave, Сохранить
Gui, guiMain: Add, Button, x+10 yp  w80 h30  gGuiMain_ButtonLoad, Загрузить
Gui, guiMain: Add, Button, x+10 yp  w80 h30  gGuiMain_ButtonExit, Выйти

; Загружаем элементы (как если бы мы нажали кнопку 'Загрузить')
GoSub, GuiMain_ButtonLoad

Gui, guiMain: Show,, <Program_Name>


; Создаём второе окно - для добавления/изменения новых строк, но его пока не показываем.
Gui, guiEditor: New
Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Название товара
Gui, guiEditor: Add, Edit  , X+10  Yp   W130 R1  vGuiEditor_ItemName

Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Количество
Gui, guiEditor: Add, Edit  , X+10  Yp   W130 R1  vGuiEditor_ItemCount

Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Ссылка:
Gui, guiEditor: Add, Edit  , X+10  Yp   W100 R1  vGuiEditor_ItemLink
Gui, guiEditor: Add, Button, X+0   Yp   W30  R1  gGuiEditor_ButtonFolder, ...

; >>  Обратите внимание: у кнопки 'Добавить' пока нет назначенной метки, только переменная!
; >>  Нужная метка добавляется в зависимости от того, добавляем ли мы строку или редактируем.
Gui, guiEditor: Add, Button, Xm   Y+m  W130 R3  vGuiEditor_ButtonSubmit , Добавить
Gui, guiEditor: Add, Button, X+m  Yp   W130 R3  gGuiEditor_ButtonExit   , Выйти
Return


; >>  Открывать ссылки по щелчку будет довольно сложно.
; >>  По горячей клавише будет проще.
#If WinActive("ahk_id " hwndGuiMain)
F3::
	; >>  Если нынешняя подпрограмма запущена не из окна, где ListView
	; >>  скрипту приходится напоминать, с чем именно мы работаем.
	Gui, guiMain: Default
	Gui, guiMain: ListView, LVPrices
	
	selected := LV_GetNext()
	If (selected == 0)
		Return
	
	LV_GetText(itemLink, selected, 3)
	If (itemLink == "")
		Return
	
	MsgBox, 0x24, Открыть ссылку?, Вы хотите перейти по ссылке`n %itemLink% ?
	IfMsgBox Yes
		Run, %itemLink%
	
	Return
#If


; Обработчики нажатия кнопок в главном окне
; =========================================
; >>  Добавлять в названия меток GuiMain_*/GuiAdd_* необязательно,
; >>  но так будет понятней, к какому окну они относятся.
; >>  Обратите внимание, что имя окна нужно добавлять к командам GuiControl.

; Кнопка 'Добавить'
GuiMain_ButtonAdd:
	; В редакторе напишем на кнопке 'Добавить' и по её нажатию пусть добавляет строку
	GuiControl, guiEditor:Text, GuiEditor_ButtonSubmit,  Добавить
	GuiControl, guiEditor:+gGuiEditor_SubmitAdd, GuiEditor_ButtonSubmit
	
	; Очистим поля, чтоб там не осталось ничего с прошлого раза
	GuiControl, guiEditor:Text, GuiEditor_ItemName , 
	GuiControl, guiEditor:Text, GuiEditor_ItemCount, 
	GuiControl, guiEditor:Text, GuiEditor_ItemLink , 
	
	; Показываем окно редактора, а дальше оно пускай само разбирается.
	Gui, guiMain: +Disabled
	Gui, guiEditor: Show,, Добавление
Return


; Кнопка 'Изменить'
GuiMain_ButtonEdit:
	selected := LV_GetNext()
	; Если ничего не выбрано, значит, добавляем новое.
	If (selected == 0)
		GoTo GuiMain_ButtonAdd
	
	; В редакторе напишем на кнопке 'Изменить' и по её нажатию пусть изменяет строку
	GuiControl, guiEditor:Text, GuiEditor_ButtonSubmit,  Изменить
	GuiControl, guiEditor:+gGuiEditor_SubmitEdit, GuiEditor_ButtonSubmit
	
	; Запишем в окно редактора имеющиеся значения
	LV_GetText( itemName , selected, 1 )
	LV_GetText( itemCount, selected, 2 )
	LV_GetText( itemLink , selected, 3 )
	
	GuiControl, guiEditor:Text, GuiEditor_ItemName , %itemName%
	GuiControl, guiEditor:Text, GuiEditor_ItemCount, %itemCount%
	GuiControl, guiEditor:Text, GuiEditor_ItemLink , %itemLink%
	
	; И покажем окно редактора
	Gui, guiMain: +Disabled
	Gui, guiEditor: Show,, Изменение
Return


; Кнопка 'Удалить'
GuiMain_ButtonDelete:
	selected := LV_GetNext()
	If (selected != 0)
	{
		LV_Delete(selected)
	}
Return


; Кнопка 'Сохранить'
GuiMain_ButtonSave:
	; Удаляем секцию в ini-файле
	IniDelete, GoodsAndPrices.ini, Prices
	Loop % LV_GetCount()
	{
		LV_GetText(itemName , A_Index, 1)
		LV_GetText(itemCount, A_Index, 2)
		LV_GetText(itemLink , A_Index, 3)
		IniWrite, %itemCount%=%itemLink%, GoodsAndPrices.ini, Prices, %itemName%
	}
	Return
Return


; Кнопка 'Прочитать'
GuiMain_ButtonLoad:
	; Очищаем текущий список и отключаем отрисовку ListView, чтобы он не мерцал.
	LV_Delete()
	GuiControl, -Redraw, LVPrices
	
	IniRead, allPrices, GoodsAndPrices.ini, Prices
	priceList := StrSplit(allPrices, "`n")
	
	For i, priceLine In priceList
	{
		priceLine := StrSplit(priceLine, "=",, 3)
		LV_Add("", priceLine[1], priceLine[2], priceLine[3])
	}
	
	GuiControl, +Redraw, LVPrices  ; Включаем отрисовку ListView
Return


; Двойной щелчок в ListView - редактирование имеющегося
GuiMain_LVPrices:
	If (A_GuiEvent == "DoubleClick")
		GoTo, GuiMain_ButtonEdit
Return


; >> Имя окна добавляется к меткам самого окна
GuiMainGuiClose:
GuiMain_ButtonExit:
	ExitApp


; Обработчики нажатия кнопок в окне добавления
; ============================================

; Выбор папки/ссылки
GuiEditor_ButtonFolder:
	FileSelectFolder, vOutFolder,, 3, Выберите папку для поиска товара
	If (ErrorLevel == 0)
		GuiControl, guiEditor:Text, GuiEditor_ItemLink, %vOutFolder%
Return


; Кнопка 'Выйти'
GuiEditorGuiClose:
GuiEditor_ButtonExit:
	Gui, guiMain: -Disabled
	Gui, guiEditor: Hide
Return


; Кнопка 'Добавить/Изменить' - добавление
GuiEditor_SubmitAdd:
	; Читаем из полей в переменные и прячем окно
	Gui, guiMain: -Disabled
	Gui, guiEditor: Submit
	
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	LV_Add("", GuiEditor_ItemName, GuiEditor_ItemCount, GuiEditor_ItemLink)
Return


; Кнопка 'Добавить/Изменить' - изменение
GuiEditor_SubmitEdit:
	; Читаем из полей в переменные и прячем окно
	Gui, guiMain: -Disabled
	Gui, guiEditor: Submit
	
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	selected := LV_GetNext()
	LV_Modify( selected, "", GuiEditor_ItemName, GuiEditor_ItemCount, GuiEditor_ItemLink)
Return
github://oGDIp - GDI+ wrapper for AHK v1.1
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Не работают кнопки и сохранение в форме

26 Apr 2023, 16:10

mcl, перенесла переход по ссылке не на горячую клавишу, а на двойной щелчок мышью. Работает, только двойной щелчок действует, и если делать его по ПКМ, и если делать по ЛКМ. Лучше бы только по ЛКМ. Изменение "DoubleClick" на "DoubleLeftClick"не помогло.
Хотела кнопки "Изменить" и "Удалить" сделать пунктами контекстного меню, появляющегося при нажатии ПКМ по пункту ListView (что-то многовато кнопок внизу получается), но код почему-то не срабатывает. Что здесь не так?

Code: Select all

; >>  Если вы хотите работать с несколькими окнами, дайте им имена.
; >>  Иначе скрипт может не понять, в какое окно вы кнопки добавляете.
; >>  И все переменные и метки, к ним относящиеся, тоже желательно назвать,
; >>  чтобы они не пересекались друг с другом.
; >>  И да – работать с этим будет непросто.

; >>  Не знаю, как у Вас, но у меня список визуально дребезжит при прокрутке.
; >>  А со стилем LVS_EX_DOUBLEBUFFER (+LV0x10000) - не дребезжит. Рекомендую.

Gui, guiMain: New, HWNDhwndGuiMain
Gui, guiMain: Add, ListView, w260 r10 vLVPrices gGuiMain_LVPrices +LV0x10000, Название|Количество|Ссылка
LV_ModifyCol(1, 150)  ; Название
LV_ModifyCol(2, 100)  ; Количество
LV_ModifyCol(3, 100)  ; Ссылка

Gui, guiMain: Add, Button, x10  y+m w80 h30  gGuiMain_ButtonAdd   , Добавить
Gui, guiMain: Add, Button, x100 yp  w80 h30  gGuiMain_ButtonEdit  , Изменить
Gui, guiMain: Add, Button, x190 yp  w80 h30  gGuiMain_ButtonDelete, Удалить

Gui, guiMain: Add, Button, x10  y+m w80 h30  gGuiMain_ButtonSave, Сохранить
Gui, guiMain: Add, Button, x+10 yp  w80 h30  gGuiMain_ButtonLoad, Загрузить
Gui, guiMain: Add, Button, x+10 yp  w80 h30  gGuiMain_ButtonExit, Выйти

; Загружаем элементы (как если бы мы нажали кнопку 'Загрузить')
GoSub, GuiMain_ButtonLoad

Gui, guiMain: Show,, <Program_Name>


; Создаём второе окно - для добавления/изменения новых строк, но его пока не показываем.
Gui, guiEditor: New
Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Название товара
Gui, guiEditor: Add, Edit  , X+10  Yp   W130 R1  vGuiEditor_ItemName

Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Количество
Gui, guiEditor: Add, Edit  , X+10  Yp   W130 R1  vGuiEditor_ItemCount

Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Ссылка:
Gui, guiEditor: Add, Edit  , X+10  Yp   W100 R1  vGuiEditor_ItemLink
Gui, guiEditor: Add, Button, X+0   Yp   W30  R1  gGuiEditor_ButtonFolder, ...

; >>  Обратите внимание: у кнопки 'Добавить' пока нет назначенной метки, только переменная!
; >>  Нужная метка добавляется в зависимости от того, добавляем ли мы строку или редактируем.
Gui, guiEditor: Add, Button, Xm   Y+m  W130 R3  vGuiEditor_ButtonSubmit , Добавить
Gui, guiEditor: Add, Button, X+m  Yp   W130 R3  gGuiEditor_ButtonExit   , Выйти
Return


; >>  Открывать ссылки по щелчку будет довольно сложно.
; >>  По горячей клавише будет проще.
#If WinActive("ahk_id " hwndGuiMain)
; F3::
	; >>  Если нынешняя подпрограмма запущена не из окна, где ListView
	; >>  скрипту приходится напоминать, с чем именно мы работаем.
	; Gui, guiMain: Default
	; Gui, guiMain: ListView, LVPrices
	
	selected := LV_GetNext()
	If (selected == 0)
		Return
	
	LV_GetText(itemLink, selected, 3)
	If (itemLink == "")
		Return
	
	MsgBox, 0x24, Открыть ссылку?, Вы хотите перейти по ссылке`n %itemLink% ?
	IfMsgBox Yes
		Run, %itemLink%
	
	Return
#If


; Обработчики нажатия кнопок в главном окне
; =========================================
; >>  Добавлять в названия меток GuiMain_*/GuiAdd_* необязательно,
; >>  но так будет понятней, к какому окну они относятся.
; >>  Обратите внимание, что имя окна нужно добавлять к командам GuiControl.

; Кнопка 'Добавить'
GuiMain_ButtonAdd:
	; В редакторе напишем на кнопке 'Добавить' и по её нажатию пусть добавляет строку
	GuiControl, guiEditor:Text, GuiEditor_ButtonSubmit,  Добавить
	GuiControl, guiEditor:+gGuiEditor_SubmitAdd, GuiEditor_ButtonSubmit
	
	; Очистим поля, чтоб там не осталось ничего с прошлого раза
	GuiControl, guiEditor:Text, GuiEditor_ItemName , 
	GuiControl, guiEditor:Text, GuiEditor_ItemCount, 
	GuiControl, guiEditor:Text, GuiEditor_ItemLink , 
	
	; Показываем окно редактора, а дальше оно пускай само разбирается.
	Gui, guiMain: +Disabled
	Gui, guiEditor: Show,, Добавление
Return


; Кнопка 'Изменить'
GuiMain_ButtonEdit:
	selected := LV_GetNext()
	; Если ничего не выбрано, значит, добавляем новое.
	If (selected == 0)
		GoTo GuiMain_ButtonAdd
	
	; В редакторе напишем на кнопке 'Изменить' и по её нажатию пусть изменяет строку
	GuiControl, guiEditor:Text, GuiEditor_ButtonSubmit,  Изменить
	GuiControl, guiEditor:+gGuiEditor_SubmitEdit, GuiEditor_ButtonSubmit
	
	; Запишем в окно редактора имеющиеся значения
	LV_GetText( itemName , selected, 1 )
	LV_GetText( itemCount, selected, 2 )
	LV_GetText( itemLink , selected, 3 )
	
	GuiControl, guiEditor:Text, GuiEditor_ItemName , %itemName%
	GuiControl, guiEditor:Text, GuiEditor_ItemCount, %itemCount%
	GuiControl, guiEditor:Text, GuiEditor_ItemLink , %itemLink%
	
	; И покажем окно редактора
	Gui, guiMain: +Disabled
	Gui, guiEditor: Show,, Изменение
Return


; Кнопка 'Удалить'
GuiMain_ButtonDelete:
	selected := LV_GetNext()
	If (selected != 0)
	{
		LV_Delete(selected)
	}
Return


; Кнопка 'Сохранить'
GuiMain_ButtonSave:
	; Удаляем секцию в ini-файле
	IniDelete, GoodsAndPrices.ini, Prices
	Loop % LV_GetCount()
	{
		LV_GetText(itemName , A_Index, 1)
		LV_GetText(itemCount, A_Index, 2)
		LV_GetText(itemLink , A_Index, 3)
		IniWrite, %itemCount%=%itemLink%, GoodsAndPrices.ini, Prices, %itemName%
	}
	Return
Return


; Кнопка 'Прочитать'
GuiMain_ButtonLoad:
	; Очищаем текущий список и отключаем отрисовку ListView, чтобы он не мерцал.
	LV_Delete()
	GuiControl, -Redraw, LVPrices
	
	IniRead, allPrices, GoodsAndPrices.ini, Prices
	priceList := StrSplit(allPrices, "`n")
	
	For i, priceLine In priceList
	{
		priceLine := StrSplit(priceLine, "=",, 3)
		LV_Add("", priceLine[1], priceLine[2], priceLine[3])
	}
	
	GuiControl, +Redraw, LVPrices  ; Включаем отрисовку ListView
Return


; Двойной щелчок в ListView - открытие ссылки
GuiMain_LVPrices:
	If (A_GuiEvent == "DoubleClick")
	#If WinActive("ahk_id " hwndGuiMain)
			Gui, guiMain: Default
			Gui, guiMain: ListView, LVPrices
	
			selected := LV_GetNext()
			If (selected == 0)
			Return
	
			LV_GetText(itemLink, selected, 3)
			If (itemLink == "")
			Return
	
			MsgBox, 0x24, Открыть ссылку?, Вы хотите перейти по ссылке`n %itemLink% ?
			IfMsgBox Yes
			Run, %itemLink%	
			Return
	#If

; Щелчок ПКМ  в ListView - открытие меню  с "Изменить" и "Удалить"
Menu, CMenu, Add, Изменить , menuDo
Menu, CMenu, Add, Удалить , menuDo

	If (A_GuiEvent == "RightClick")
  	{
	  goto,menux
	}
return

	menux:
Menu, CMenu, Show, %musX%,%musY%
return

menudo:
	Gui, submit, nohide
	If (A_ThisMenuItem = "Изменить")
	   gosub,GuiEditor_SubmitEdit
	If (A_ThisMenuItem = "Удалить")
	   gosub,GuiMain_ButtonDelete
return

; >> Имя окна добавляется к меткам самого окна
GuiMainGuiClose:
GuiMain_ButtonExit:
	ExitApp


; Обработчики нажатия кнопок в окне добавления
; ============================================

; Выбор папки/ссылки
GuiEditor_ButtonFolder:
	FileSelectFolder, vOutFolder,, 3, Выберите папку для поиска товара
	If (ErrorLevel == 0)
		GuiControl, guiEditor:Text, GuiEditor_ItemLink, %vOutFolder%
Return


; Кнопка 'Выйти'
GuiEditorGuiClose:
GuiEditor_ButtonExit:
	Gui, guiMain: -Disabled
	Gui, guiEditor: Hide
Return


; Кнопка 'Добавить/Изменить' - добавление
GuiEditor_SubmitAdd:
	; Читаем из полей в переменные и прячем окно
	Gui, guiMain: -Disabled
	Gui, guiEditor: Submit
	
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	LV_Add("", GuiEditor_ItemName, GuiEditor_ItemCount, GuiEditor_ItemLink)
Return


; Кнопка 'Добавить/Изменить' - изменение
GuiEditor_SubmitEdit:
	; Читаем из полей в переменные и прячем окно
	Gui, guiMain: -Disabled
	Gui, guiEditor: Submit
	
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	selected := LV_GetNext()
	LV_Modify( selected, "", GuiEditor_ItemName, GuiEditor_ItemCount, GuiEditor_ItemLink)
Return
mcl
Posts: 359
Joined: 04 May 2018, 16:35

Re: Не работают кнопки и сохранение в форме

26 Apr 2023, 17:40

marusa122 wrote: перенесла переход по ссылке не на горячую клавишу, а на двойной щелчок мышью. Работает, только двойной щелчок действует, и если делать его по ПКМ, и если делать по ЛКМ. Лучше бы только по ЛКМ. Изменение "DoubleClick" на "DoubleLeftClick"не помогло.
И не должно было помочь — события DoubleLeftClick нет. А вот для двойного щелчка ПКМ есть событие с чрезмерно лаконичным названием "R". Но дело в другом.

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

А вот обычный If у вас оказался без {блока}, и потому только первая команда выполнялась по условию, а все остальные – при любом событии (например, при перетаскивании строки, или щелчку по заголовку столбца, или — сюрприз! — по двойному щелчку ПКМ).

marusa122 wrote: Хотела кнопки "Изменить" и "Удалить" сделать пунктами контекстного меню, появляющегося при нажатии ПКМ по пункту ListView (что-то многовато кнопок внизу получается), но код почему-то не срабатывает. Что здесь не так?
В-нулевых, менюшку лучше сделать один раз, там же, где и окна.

Во-первых, причина та же, что и выше — из-за незакрытого If выполнялись другие команды, в т.ч. и Return, и до проверки на RightClick выполнение никогда не доходило. Во-вторых, событие "RightClick" появляется, только если у ListView задана опция AltSubmit (там же, где задаются размеры, переменная и g-метка).

Ну и в последних, окошко редактирования по пункту меню „Изменить“ у вас не откроется, вместо этого в строку сразу запишется то, что было в окошке редактора последний раз. Знаете, почему? :3

P.S. Кстати, в чём Вы редактируете код?
github://oGDIp - GDI+ wrapper for AHK v1.1
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Не работают кнопки и сохранение в форме

26 Apr 2023, 23:15

mcl wrote:
26 Apr 2023, 17:40
Ну и в последних, окошко редактирования по пункту меню „Изменить“ у вас не откроется, вместо этого в строку сразу запишется то, что было в окошке редактора последний раз. Знаете, почему? :3
Расписываюсь в своей тупости - даже не догадываюсь :crazy: .
mcl wrote:
26 Apr 2023, 17:40
P.S. Кстати, в чём Вы редактируете код?
В Блокноте.
Позакрывала (вроде бы) все If, добавила AltSubmit - теперь меню появляется при клике ПКМ по любому месту формы. И пункты меню не работают, как и соответствующие им кнопки. Даже наоборот - при нажатии пункта "Изменить" пропадает весь текст из строки. Я так понимаю, по той же причине, которую вы подразумеваете в предыдущей цитате.

Code: Select all

; >>  Если вы хотите работать с несколькими окнами, дайте им имена.
; >>  Иначе скрипт может не понять, в какое окно вы кнопки добавляете.
; >>  И все переменные и метки, к ним относящиеся, тоже желательно назвать,
; >>  чтобы они не пересекались друг с другом.
; >>  И да – работать с этим будет непросто.

; >>  Не знаю, как у Вас, но у меня список визуально дребезжит при прокрутке.
; >>  А со стилем LVS_EX_DOUBLEBUFFER (+LV0x10000) - не дребезжит. Рекомендую.

Gui, guiMain: New, HWNDhwndGuiMain
Gui, guiMain: Add, ListView, w260 r10 vLVPrices gGuiMain_LVPrices +LV0x10000 AltSubmit, Название|Количество|Ссылка
LV_ModifyCol(1, 150)  ; Название
LV_ModifyCol(2, 100)  ; Количество
LV_ModifyCol(3, 100)  ; Ссылка

Gui, guiMain: Add, Button, x10  y+m w80 h30  gGuiMain_ButtonAdd   , Добавить
Gui, guiMain: Add, Button, x100 yp  w80 h30  gGuiMain_ButtonEdit  , Изменить
Gui, guiMain: Add, Button, x190 yp  w80 h30  gGuiMain_ButtonDelete, Удалить

Gui, guiMain: Add, Button, x10  y+m w80 h30  gGuiMain_ButtonSave, Сохранить
Gui, guiMain: Add, Button, x+10 yp  w80 h30  gGuiMain_ButtonLoad, Загрузить
Gui, guiMain: Add, Button, x+10 yp  w80 h30  gGuiMain_ButtonExit, Выйти

; Загружаем элементы (как если бы мы нажали кнопку 'Загрузить')
GoSub, GuiMain_ButtonLoad

Gui, guiMain: Show,, <Program_Name>


; Создаём второе окно - для добавления/изменения новых строк, но его пока не показываем.
Gui, guiEditor: New
Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Название товара
Gui, guiEditor: Add, Edit  , X+10  Yp   W130 R1  vGuiEditor_ItemName

Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Количество
Gui, guiEditor: Add, Edit  , X+10  Yp   W130 R1  vGuiEditor_ItemCount

Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Ссылка:
Gui, guiEditor: Add, Edit  , X+10  Yp   W100 R1  vGuiEditor_ItemLink
Gui, guiEditor: Add, Button, X+0   Yp   W30  R1  gGuiEditor_ButtonFolder, ...

; >>  Обратите внимание: у кнопки 'Добавить' пока нет назначенной метки, только переменная!
; >>  Нужная метка добавляется в зависимости от того, добавляем ли мы строку или редактируем.
Gui, guiEditor: Add, Button, Xm   Y+m  W130 R3  vGuiEditor_ButtonSubmit , Добавить
Gui, guiEditor: Add, Button, X+m  Yp   W130 R3  gGuiEditor_ButtonExit   , Выйти
Return


; >>  Открывать ссылки по щелчку будет довольно сложно.
; >>  По горячей клавише будет проще.

; Обработчики нажатия кнопок в главном окне
; =========================================
; >>  Добавлять в названия меток GuiMain_*/GuiAdd_* необязательно,
; >>  но так будет понятней, к какому окну они относятся.
; >>  Обратите внимание, что имя окна нужно добавлять к командам GuiControl.

; Кнопка 'Добавить'
GuiMain_ButtonAdd:
	; В редакторе напишем на кнопке 'Добавить' и по её нажатию пусть добавляет строку
	GuiControl, guiEditor:Text, GuiEditor_ButtonSubmit,  Добавить
	GuiControl, guiEditor:+gGuiEditor_SubmitAdd, GuiEditor_ButtonSubmit
	
	; Очистим поля, чтоб там не осталось ничего с прошлого раза
	GuiControl, guiEditor:Text, GuiEditor_ItemName , 
	GuiControl, guiEditor:Text, GuiEditor_ItemCount, 
	GuiControl, guiEditor:Text, GuiEditor_ItemLink , 
	
	; Показываем окно редактора, а дальше оно пускай само разбирается.
	Gui, guiMain: +Disabled
	Gui, guiEditor: Show,, Добавление
Return


; Кнопка 'Изменить'
GuiMain_ButtonEdit:
	selected := LV_GetNext()
	; Если ничего не выбрано, значит, добавляем новое.
	If (selected == 0)
		GoTo GuiMain_ButtonAdd
	
	; В редакторе напишем на кнопке 'Изменить' и по её нажатию пусть изменяет строку
	GuiControl, guiEditor:Text, GuiEditor_ButtonSubmit,  Изменить
	GuiControl, guiEditor:+gGuiEditor_SubmitEdit, GuiEditor_ButtonSubmit
	
	; Запишем в окно редактора имеющиеся значения
	LV_GetText( itemName , selected, 1 )
	LV_GetText( itemCount, selected, 2 )
	LV_GetText( itemLink , selected, 3 )
	
	GuiControl, guiEditor:Text, GuiEditor_ItemName , %itemName%
	GuiControl, guiEditor:Text, GuiEditor_ItemCount, %itemCount%
	GuiControl, guiEditor:Text, GuiEditor_ItemLink , %itemLink%
	
	; И покажем окно редактора
	Gui, guiMain: +Disabled
	Gui, guiEditor: Show,, Изменение
Return


; Кнопка 'Удалить'
GuiMain_ButtonDelete:
	selected := LV_GetNext()
	If (selected != 0)
	{
		LV_Delete(selected)
	}
Return


; Кнопка 'Сохранить'
GuiMain_ButtonSave:
	; Удаляем секцию в ini-файле
	IniDelete, GoodsAndPrices.ini, Prices
	Loop % LV_GetCount()
	{
		LV_GetText(itemName , A_Index, 1)
		LV_GetText(itemCount, A_Index, 2)
		LV_GetText(itemLink , A_Index, 3)
		IniWrite, %itemCount%=%itemLink%, GoodsAndPrices.ini, Prices, %itemName%
	}
	Return
Return


; Кнопка 'Прочитать'
GuiMain_ButtonLoad:
	; Очищаем текущий список и отключаем отрисовку ListView, чтобы он не мерцал.
	LV_Delete()
	GuiControl, -Redraw, LVPrices
	
	IniRead, allPrices, GoodsAndPrices.ini, Prices
	priceList := StrSplit(allPrices, "`n")
	
	For i, priceLine In priceList
	{
		priceLine := StrSplit(priceLine, "=",, 3)
		LV_Add("", priceLine[1], priceLine[2], priceLine[3])
	}
	
	GuiControl, +Redraw, LVPrices  ; Включаем отрисовку ListView
Return


; Двойной щелчок в ListView - открытие ссылки
GuiMain_LVPrices:
	If (A_GuiEvent == "DoubleClick")
	{
			Gui, guiMain: Default
			Gui, guiMain: ListView, LVPrices
	
			selected := LV_GetNext()
			If (selected == 0)
			Return
	
			LV_GetText(itemLink, selected, 3)
			If (itemLink == "")
			Return
	
			MsgBox, 0x24, Открыть ссылку?, Вы хотите перейти по ссылке`n %itemLink% ?
			IfMsgBox Yes
			Run, %itemLink%	
			Return
	}

; Щелчок ПКМ  в ListView - открытие меню  с "Изменить" и "Удалить"
Menu, CMenu, Add, Изменить , menuDo
Menu, CMenu, Add, Удалить , menuDo

	If (A_GuiEvent == "RightClick")
  	{
{
  Row := A_EventInfo
  Col := LV_SubitemHitTest
  LV_GetText(result, Row, Col)
  loop,%total%
     c%a_index%:=""
  all:=""
  loop,%total% 
    {
    LV_GetText(result, Row, Col)
	all .= colx . dlm
	}
	  goto,menux
	return
	}
}

	menux:
if (rn=0)
  return
MouseGetPos, musX, musY
Menu, CMenu, Show, %musX%,%musY%
return

menudo:
	Gui, submit, nohide
	{
	If (A_ThisMenuItem = "Изменить")
	   gosub,GuiEditor_SubmitEdit
	If (A_ThisMenuItem = "Удалить")
	   gosub,GuiMain_ButtonDelete
	}
return

; >> Имя окна добавляется к меткам самого окна
GuiMainGuiClose:
GuiMain_ButtonExit:
	ExitApp


; Обработчики нажатия кнопок в окне добавления
; ============================================

; Выбор папки/ссылки
GuiEditor_ButtonFolder:
	FileSelectFolder, vOutFolder,, 3, Выберите папку для поиска товара
	If (ErrorLevel == 0)
		GuiControl, guiEditor:Text, GuiEditor_ItemLink, %vOutFolder%
Return


; Кнопка 'Выйти'
GuiEditorGuiClose:
GuiEditor_ButtonExit:
	Gui, guiMain: -Disabled
	Gui, guiEditor: Hide
Return


; Кнопка 'Добавить/Изменить' - добавление
GuiEditor_SubmitAdd:
	; Читаем из полей в переменные и прячем окно
	Gui, guiMain: -Disabled
	Gui, guiEditor: Submit
	
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	LV_Add("", GuiEditor_ItemName, GuiEditor_ItemCount, GuiEditor_ItemLink)
Return


; Кнопка 'Добавить/Изменить' - изменение
GuiEditor_SubmitEdit:
	; Читаем из полей в переменные и прячем окно
	Gui, guiMain: -Disabled
	Gui, guiEditor: Submit
	
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	selected := LV_GetNext()
	LV_Modify( selected, "", GuiEditor_ItemName, GuiEditor_ItemCount, GuiEditor_ItemLink)
Return
mcl
Posts: 359
Joined: 04 May 2018, 16:35

Re: Не работают кнопки и сохранение в форме  Topic is solved

27 Apr 2023, 08:03

marusa122 wrote:
...Знаете, почему? :3
Ох, ну конечно! Надо ведь было перейти на метку GuiMain_ButtonEdit, как будто мы нажали кнопку Изменить! :crazy: .

P.S. Кстати, в чём Вы редактируете код?
В Блокноте.
Серьёзно?! Возьмите хотя бы Notepad2.

Code: Select all

; >>  Если вы хотите работать с несколькими окнами, дайте им имена.
; >>  Иначе скрипт может не понять, в какое окно вы кнопки добавляете.
; >>  И все переменные и метки, к ним относящиеся, тоже желательно назвать,
; >>  чтобы они не пересекались друг с другом.
; >>  И да – работать с этим будет непросто.

Gui, guiMain: New, HWNDhwndGuiMain
Gui, guiMain: Add, ListView, w260 r10 vLVPrices gGuiMain_LVPrices +LV0x10000 AltSubmit, Название|Количество|Ссылка
LV_ModifyCol(1, 150)  ; Название
LV_ModifyCol(2, 100)  ; Количество
LV_ModifyCol(3, 100)  ; Ссылка

Gui, guiMain: Add, Button, x10  y+m w80 h30  gGuiMain_ButtonAdd   , Добавить
Gui, guiMain: Add, Button, x100 yp  w80 h30  gGuiMain_ButtonEdit  , Изменить
Gui, guiMain: Add, Button, x190 yp  w80 h30  gGuiMain_ButtonDelete, Удалить

Gui, guiMain: Add, Button, x10  y+m w80 h30  gGuiMain_ButtonSave, Сохранить
Gui, guiMain: Add, Button, x+10 yp  w80 h30  gGuiMain_ButtonLoad, Загрузить
Gui, guiMain: Add, Button, x+10 yp  w80 h30  gGuiMain_ButtonExit, Выйти

; Загружаем элементы (как если бы мы нажали кнопку 'Загрузить')
GoSub, GuiMain_ButtonLoad

Gui, guiMain: Show,, <Program_Name>


; Создаём второе окно - для добавления/изменения новых строк, но его пока не показываем.
Gui, guiEditor: New
Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Название товара
Gui, guiEditor: Add, Edit  , X+10  Yp   W130 R1  vGuiEditor_ItemName

Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Количество
Gui, guiEditor: Add, Edit  , X+10  Yp   W130 R1  vGuiEditor_ItemCount

Gui, guiEditor: Add, Text  , Xm    Y+m  W130 R1,  Ссылка:
Gui, guiEditor: Add, Edit  , X+10  Yp   W100 R1  vGuiEditor_ItemLink
Gui, guiEditor: Add, Button, X+0   Yp   W30  R1  gGuiEditor_ButtonFolder, ...

; >>  Обратите внимание: у кнопки 'Добавить' пока нет назначенной метки, только переменная!
; >>  Нужная метка добавляется в зависимости от того, добавляем ли мы строку или редактируем.
Gui, guiEditor: Add, Button, Xm   Y+m  W130 R3  vGuiEditor_ButtonSubmit , Добавить
Gui, guiEditor: Add, Button, X+m  Yp   W130 R3  gGuiEditor_ButtonExit   , Выйти


; Создаём меню с пунктами "Изменить" и "Удалить"
Menu, CMenu, Add, Изменить, OnLVMenu
Menu, CMenu, Add, Удалить , OnLVMenu
Return


; Обработчики нажатия кнопок в главном окне
; =========================================
; >>  Добавлять в названия меток GuiMain_*/GuiAdd_* необязательно,
; >>  но так будет понятней, к какому окну они относятся.
; >>  Обратите внимание, что имя окна нужно добавлять к командам GuiControl.

; Кнопка 'Добавить'
GuiMain_ButtonAdd:
	; В редакторе напишем на кнопке 'Добавить' и по её нажатию пусть добавляет строку
	GuiControl, guiEditor:Text, GuiEditor_ButtonSubmit,  Добавить
	GuiControl, guiEditor:+gGuiEditor_SubmitAdd, GuiEditor_ButtonSubmit
	
	; Очистим поля, чтоб там не осталось ничего с прошлого раза
	GuiControl, guiEditor:Text, GuiEditor_ItemName , 
	GuiControl, guiEditor:Text, GuiEditor_ItemCount, 
	GuiControl, guiEditor:Text, GuiEditor_ItemLink , 
	
	; Показываем окно редактора, а дальше оно пускай само разбирается.
	Gui, guiMain: +Disabled
	Gui, guiEditor: Show,, Добавление
Return


; Кнопка 'Изменить'
GuiMain_ButtonEdit:
	selected := LV_GetNext()
	; Если ничего не выбрано, значит, добавляем новое.
	If (selected == 0)
		GoTo GuiMain_ButtonAdd
	
	; В редакторе напишем на кнопке 'Изменить' и по её нажатию пусть изменяет строку
	GuiControl, guiEditor:Text, GuiEditor_ButtonSubmit,  Изменить
	GuiControl, guiEditor:+gGuiEditor_SubmitEdit, GuiEditor_ButtonSubmit
	
	; Запишем в окно редактора имеющиеся значения
	LV_GetText( itemName , selected, 1 )
	LV_GetText( itemCount, selected, 2 )
	LV_GetText( itemLink , selected, 3 )
	
	GuiControl, guiEditor:Text, GuiEditor_ItemName , %itemName%
	GuiControl, guiEditor:Text, GuiEditor_ItemCount, %itemCount%
	GuiControl, guiEditor:Text, GuiEditor_ItemLink , %itemLink%
	
	; И покажем окно редактора
	Gui, guiMain: +Disabled
	Gui, guiEditor: Show,, Изменение
Return


; Кнопка 'Удалить'
GuiMain_ButtonDelete:
	selected := LV_GetNext()
	If (selected != 0)
	{
		LV_Delete(selected)
	}
Return


; Кнопка 'Сохранить'
GuiMain_ButtonSave:
	; Удаляем секцию в ini-файле
	IniDelete, GoodsAndPrices.ini, Prices
	Loop % LV_GetCount()
	{
		LV_GetText(itemName , A_Index, 1)
		LV_GetText(itemCount, A_Index, 2)
		LV_GetText(itemLink , A_Index, 3)
		IniWrite, %itemCount%=%itemLink%, GoodsAndPrices.ini, Prices, %itemName%
	}
	Return
Return


; Кнопка 'Прочитать'
GuiMain_ButtonLoad:
	; Очищаем текущий список и отключаем отрисовку ListView, чтобы он не мерцал.
	LV_Delete()
	GuiControl, -Redraw, LVPrices
	
	IniRead, allPrices, GoodsAndPrices.ini, Prices
	priceList := StrSplit(allPrices, "`n")
	
	For i, priceLine In priceList
	{
		priceLine := StrSplit(priceLine, "=",, 3)
		LV_Add("", priceLine[1], priceLine[2], priceLine[3])
	}
	
	GuiControl, +Redraw, LVPrices  ; Включаем отрисовку ListView
Return


; Двойной щелчок в ListView - открытие ссылки
GuiMain_LVPrices:
	If (A_GuiEvent == "DoubleClick")
	{
		Gui, guiMain: Default
		Gui, guiMain: ListView, LVPrices
		
		selected := LV_GetNext()
		If (selected == 0)
		Return
		
		LV_GetText(itemLink, selected, 3)
		If (itemLink == "")
		Return
		
		MsgBox, 0x24, Открыть ссылку?, Вы хотите перейти по ссылке`n %itemLink% ?
		IfMsgBox Yes
		Run, %itemLink%	
		Return
	}
	
	If (A_GuiEvent == "RightClick")
  	{
		Menu, CMenu, Show
		Return
	}
Return

  
OnLVMenu:
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	If (A_ThisMenuItem = "Изменить")
		GoTo, GuiMain_ButtonEdit
	
	If (A_ThisMenuItem = "Удалить")
		GoTo, GuiMain_ButtonDelete
return

; >> Имя окна добавляется к меткам самого окна
GuiMainGuiClose:
GuiMain_ButtonExit:
	ExitApp


; Обработчики нажатия кнопок в окне добавления
; ============================================

; Выбор папки/ссылки
GuiEditor_ButtonFolder:
	FileSelectFolder, vOutFolder,, 3, Выберите папку для поиска товара
	If (ErrorLevel == 0)
		GuiControl, guiEditor:Text, GuiEditor_ItemLink, %vOutFolder%
Return


; Кнопка 'Выйти'
GuiEditorGuiClose:
GuiEditor_ButtonExit:
	Gui, guiMain: -Disabled
	Gui, guiEditor: Hide
Return


; Кнопка 'Добавить/Изменить' - добавить новую строку
GuiEditor_SubmitAdd:
	; Читаем из полей в переменные и прячем окно
	Gui, guiMain: -Disabled
	Gui, guiEditor: Submit
	
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	LV_Add("", GuiEditor_ItemName, GuiEditor_ItemCount, GuiEditor_ItemLink)
Return


; Кнопка 'Добавить/Изменить' - сохранить изменения
GuiEditor_SubmitEdit:
	; Читаем из полей в переменные и прячем окно
	Gui, guiMain: -Disabled
	Gui, guiEditor: Submit
	
	Gui, guiMain:Default
	Gui, guiMain:ListView, LVPrices
	
	selected := LV_GetNext()
	LV_Modify( selected, "", GuiEditor_ItemName, GuiEditor_ItemCount, GuiEditor_ItemLink)
Return
github://oGDIp - GDI+ wrapper for AHK v1.1
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Не работают кнопки и сохранение в форме

27 Apr 2023, 09:58

mcl wrote:
27 Apr 2023, 08:03
Серьёзно?! Возьмите хотя бы Notepad2
Спасибо, попробую. Но просто Блокнот на компьютере и так стоял - я и не подумала, что можно установить что-нибудь еще.
mcl, спасибо большое за ликбез для особо одаренных! Код работает отлично!

Return to “Помощь”

Who is online

Users browsing this forum: No registered users and 7 guests