1

Тема: Не обновляется ListView (После создания нового окна)

Столкнулся с проблемой, не обновляется ListView после смены игры. Вроде, это связанно с новым окном

https://youtu.be/BCg2RRfBTnE - То что происходит, хотя в скрипте прописано обновление списка (ReloadList)


;DS3 Сохранения
HotKey, *+F5, БыстроеСохранение
HotKey, *+F9, Загрузить

Gui, Show, w530 h300, DS3 Сохранения
Gui, Add, ListView, r14 w400 y10 x110 vList gList Checked SortDesc, Название
Gui, Add, Text, x110 y280 vStatus, 0000000000000000000000000000000000000000000000000000
Gui, Add, Text, y130 x12 vFolderUse, 0000000000
GuiControl, Text, Status , Работает
GuiControl, Text, FolderUse , Сохранения


Gui, Add, Button,y10 x10 gСохранение, Сохранить (+F5)
Gui, Add, Button,y40 x10 gЗагрузить, Загрузить (+F9)

Gui, Add, Button,y150 x10 gСохранения , Сохранения
Gui, Add, Button,y175 x10 gБэкапы , Бэкапы
Gui, Add, Button,y229 x10 gПереименовать , Переименовать
Gui, Add, Button,y253 x10 gОбновить, Обновить
Gui, Add, Button,y276.5 x456 gУдалить , Удалить

Gui, Add, CheckBox, y10 x514 vConfirmDelete

WindowCreated = No

GameChoice := "Dark Souls 3" 
DDDAFolder := "D:\Games\Dragon's Dogma Dark Arisen"
;
gosub, СменитьИгру

List:
If (A_GuiEvent = "DoubleClick")
{
	If (LV_GetCount("Selected")) > 0
	{
		LV_GetText(RowText, A_EventInfo)
		gosub, UpdateTimeBackup
		Filecopy %GameSave%\%SaveFileName%, %ScriptBackup%\%TimeB% - DoubleClick.%FileType%
		If FolderUse = Сохранения
			Filecopy %ScriptSave%\%RowText%, %GameSave%\%SaveFileName%, true
		If FolderUse = Бэкапы
			Filecopy %ScriptBackup%\%RowText%, %GameSave%\%SaveFileName%, true
	}
}
return
Help:
MsgBox 1
Return

; 					Клавиши

+F1::reload
F2::Gui, Show
Сохранение:
gosub, Сохранения
GuiControl, Text, Status , Жду название..
InputBox, FileName, Название, Введите название файла, , 420, 100, , , , , Save
If ErrorLevel
{
	GuiControl, Text, Status , Сохранение отменено
	return
}
else
	gosub, UpdateTimeBackup
	FileCopy %GameSave%\%SaveFileName%, %ScriptSave%\%TimeB% - %FileName%.%FileType%
	GuiControl, Text, Status , Сохранение успешно
	gosub, ReloadList
return



БыстроеСохранение:
GuiControl, Text, Status , Сохраняю..
gosub, UpdateTimeBackup
FileCopy %GameSave%\%SaveFileName%, %ScriptSave%\%TimeB% - F5 Save.%FileType%
gosub, ReloadList
SoundBeep, 750, 500
GuiControl, Text, Status , Сохранение успешно
return


Загрузить:
CheckCount = 0
Loop
{
    Check := LV_GetNext(Check, "Checked")
    if not Check
        break
    LV_GetText(Text, Check)
	CheckCount := CheckCount + 1
   
}
If CheckCount = 1
{
	CheckCol := LV_GetNext(0, "Checked")
	If not CheckCol = 0
	{
		GuiControl, Text, Status , Перемещаю..
		LV_GetText(FileC,CheckCol)
		;MsgBox %RowNumber% - %FileC% - %CheckCol%
		gosub, UpdateTimeBackup
		FileCopy %GameSave%\%SaveFileName%, %ScriptBackup%\%TimeB% - F9 Load.%FileType%
		Filecopy %ScriptSave%\%FileC%, %GameSave%\%SaveFileName%, true
		FileС := ""
		SoundBeep, 400, 500
		GuiControl, Text, Status , Успешная загрузка
	}
}
Else if CheckCount > 1
{
	GuiControl, Text, Status , Ты выбрал больше 1 файла, целых %CheckCount%
}
Else if CheckCount = 0
GuiControl, Text, Status , Чтобы загрузить, нужно выбрать 1 файл
Return

; 					Кнопки
; 					Первое окно

Переименовать:
RenameFileNumber = 0 
If (LV_GetCount("Selected")) > 0
{
Loop % LV_GetCount("Selected")
	
	{
		RenameFileNumber  := LV_GetNext(RenameFileNumber)
		if not RenameFileNumber 
			break
		LV_GetText(FileR, RenameFileNumber)
		InputBox, FileName, Название, Введите название файла, , 420, 100, , , , , %FileR%
		If FolderUse = Сохранения
		{
			FileMove %ScriptSave%\%FileR%, %ScriptSave%\%FileName%
		}
		If FolderUse = Бэкапы
		{
			FileMove %ScriptBackup%\%FileR%, %ScriptBackup%\%FileName%
		}
		
		
	}
If ErrorLevel = 1
{
	GuiControl, Text, Status , Переименовывание отменено
	return
}
else
	GuiControl, Text, Status , Переименовывание успешно
	gosub, ReloadList
}
Else
GuiControl, Text, Status , Всё же...необходимо выбрать 
return



Обновить:
GuiControl, Text, Status , Работает. Почти.
Gosub, ReloadList
return

Удалить:
Gui, Submit, nohide
If ConfirmDelete = 1
{
GuiControl, Text, Status , Удаляю..
DeleteFileNumber = 0 
If FolderUse = Сохранения
{
	Loop % LV_GetCount("Selected")
	{
		DeleteFileNumber  := LV_GetNext(DeleteFileNumber)
		if not DeleteFileNumber 
			break
		LV_GetText(FileD, DeleteFileNumber)
		FileRecycle, %ScriptSave%\%FileD%
		;msgBox %ScriptSave%\%FileD%
		GuiControl, Text, Status , Удаление успешно
	}
}
If FolderUse = Бэкапы
{
	Loop % LV_GetCount("Selected")
	{
		DeleteFileNumber := LV_GetNext(DeleteFileNumber)
		if not DeleteFileNumber 
			break
		LV_GetText(FileD, DeleteFileNumber)
		FileRecycle, %ScriptBackup%\%FileD%
		;msgBox %ScriptBackup%\%FileD%
		GuiControl, Text, Status , Удаление успешно
	}
}
If (LV_GetCount("Selected")) = 0
GuiControl, Text, Status , Ты ничего не выбрал :|
gosub, ReloadList
}
Else if ConfirmDelete = 0
{
GuiControl, Text, Status , Подтверди!
GuiControl, Hide, ConfirmDelete
sleep 100
GuiControl, Show, ConfirmDelete
sleep 100
GuiControl, Hide, ConfirmDelete
sleep 100
GuiControl, Show, ConfirmDelete
}
Return


Сохранения:
FolderUse = Сохранения
GuiControl, Text, FolderUse , Сохранения
gosub, ReloadList
return


Бэкапы:
FolderUse = Бэкапы
GuiControl, Text, FolderUse , Бэкапы
gosub, ReloadList
return

ReloadList:
LV_Delete()
If LV_GetCount() = 0
{
	If FolderUse = Сохранения
	{
		Loop, %ScriptSave%\*.%FileType%
		LV_Add("", A_LoopFileName)
		LV_ModifyCol()
		
	}
	Else if FolderUse = Бэкапы
	{
		Loop, %ScriptBackup%\*.%FileType%
		LV_Add("", A_LoopFileName)
		LV_ModifyCol()
	}
}
return

; 					Окно смена игры
СменитьИгру:
Gui, СменаИгры:Submit

If GameChoice = Dark Souls 3
{
	Game := "DS3"
}
If GameChoice = Dark Souls II Scholar of the First Sin
{
	Game := "DS2SoF"
}
If GameChoice = Dragon's Dogma Dark Arisen
{
	Game := "DDDA"
}
; Ниже есть настройки для этих игр:
; Dark Souls II Scholar of the First Sin
; Dark Souls 3
; Dragon's Dogma Dark Arisen
If Game = DS2SoF
{
	GameFolder = %Appdata%\DarkSoulsII
	GameSave = %GameFolder%\0140000100000001
	ScriptSave = %GameFolder%\Сохранения\Сохранения скрипта
	ScriptBackup = %GameFolder%\Сохранения\Сохранения скрипта\Бэкапы
	SaveFileName = DS2SOFS0000.sl2
	FileType = sl2
	FileCreateDir, %GameFolder%\Сохранения
	FileCreateDir, %GameFolder%\Сохранения\Сохранения скрипта
	FileCreateDir, %GameFolder%\Сохранения\Сохранения скрипта\Бэкапы
	FolderUse = Сохранения
}
If Game = DS3
{
	GameFolder = %Appdata%\DarkSoulsIII
	GameSave = %GameFolder%\0110000100000666
	ScriptSave = %GameFolder%\Сохранения\Сохранения скрипта
	ScriptBackup = %GameFolder%\Сохранения\Сохранения скрипта\Бэкапы
	SaveFileName = DS30000.sl2
	FileType = sl2
	FileCreateDir, %GameFolder%\Сохранения
	FileCreateDir, %GameFolder%\Сохранения\Сохранения скрипта
	FileCreateDir, %GameFolder%\Сохранения\Сохранения скрипта\Бэкапы
	FolderUse = Сохранения
}
If Game = DDDA
{
	GameFolder = %DDDAFolder%
	GameSave = %DDDAFolder%\Steam\MEX\remote
	ScriptSave = %GameFolder%\Steam\MEX\Сохранения\Сохранения скрипта
	ScriptBackup = %GameFolder%\Steam\MEX\Сохранения\Сохранения скрипта\Бэкапы
	SaveFileName = DDDA.sav
	FileType = sav
	FileCreateDir, %GameFolder%\Steam\MEX\Сохранения
	FileCreateDir, %GameFolder%\Steam\MEX\Сохранения\Сохранения скрипта
	FileCreateDir, %GameFolder%\Steam\MEX\Сохранения\Сохранения скрипта\Бэкапы
	FolderUse = Сохранения
}
Sleep 150
gosub, ReloadList
return
ОтменаСменыИгры:
Gui, СменаИгры:Hide 
return

;

UpdateTimeBackup:
FileGetTime, TimeB, %GameSave%\%SaveFileName%
FormatTime, TimeB, %TimeB%,  yy.MM.dd H;mm
return

GuiClose:
MsgBox % A_DefaultGui " " A_DefaultListView 
Return
GuiContextMenu:
If WindowCreated = No
{
Gui, СменаИгры:New,, Смена Игры
Gui,  СменаИгры:Add, Text, vText1
Gui,  СменаИгры:Add, Text, vText2
Gui,  СменаИгры:Add, Text, vText3
Gui,  СменаИгры:Add, DropDownList, x10 y120 vGameChoice Choose1 w380, Dark Souls 3|Dark Souls II Scholar of the First Sin|Dragon's Dogma Dark Arisen
Gui, СменаИгры:Add, Button,y165 x300 gСменитьИгру , Сменить игру
Gui, СменаИгры:Add, Button,y165 x247 gОтменаСменыИгры , Отмена
WindowCreated = Yes
}

Gui, СменаИгры:Show, h200 w400

2 (изменено: qqlexa, 2020-06-26 20:21:31)

Re: Не обновляется ListView (После создания нового окна)

Думаю, что Вы хотите становиться лучше, тогда накину советов:

  • 1) Оформлять название темы соответственно правилам форума

  • 2) Иметь единый стандарт оформления кода, а значит используете маленькую букву для if, return и прочих операторов - продолжайте это делать везде, а не там где вам угодно

  • 3) Желательно даже для одной строки открывать тело через фигурные скобки "{ .. }", так как вы уже потеряли как минимум на строчке 145 ход скрипта, так происходит в многих местах

  • 4) Если у вас в теле if присутствует оператор возврата return, не нужно делать else { }

  • 5) Одинаковый код нужно выводить в функции. Повторяется одно и то же как минимум раз - делаем функцию

  • 6) Лучше не использовать русских символов в названии переменных и меток, так как Ваш код может быть полезен и для других желающих, которые не смогут понять смысл метки

Думаю, после выполнения советов из этого списка вы отыскаете проблему

3 (изменено: AdcB, 2020-06-27 03:43:38)

Re: Не обновляется ListView (После создания нового окна)

  • 1) Оформлять название темы соответственно правилам форума

Согласен, правила оформления это хорошо.

  • 2) Иметь единый стандарт оформления кода, а значит используете маленькую букву для if, return и прочих операторов - продолжайте это делать везде, а не там где вам угодно

Я стараюсь так делать. Сейчас.. Этот скрипт писался с 11 числа.

  • 3) Желательно даже для одной строки открывать тело через фигурные скобки "{ .. }", так как вы уже потеряли как минимум на строчке 145 ход скрипта, так происходит в многих местах

Учту, спасибо. Лично я не совсем понимаю о чём речь про 145 строку. Да, советы дельные. Но в этом моменте мне нужно чтобы именно тут закончились действия, и никаких "Всё же...необходимо выбрать" не было.


If ErrorLevel = 1
{
	GuiControl, Text, Status , Переименовывание отменено
	return ; 145 строка
}
else
	GuiControl, Text, Status , Переименовывание успешно
	gosub, ReloadList
}
Else
GuiControl, Text, Status , Всё же...необходимо выбрать 
return

Сейчас перечитываю, и ведь действительно, их бы и не было без Return. Легче написать "Ретурн", чем разбираться в коде. И всё же в этом помогут скобки, да.

  • 4) Если у вас в теле if присутствует оператор возврата return, не нужно делать else { }

У меня они присутствуют скорее для уверенности что конец именно тут, они должны уйти на последней оптимизации скрипта.

  • 5) Одинаковый код нужно выводить в функции. Повторяется одно и то же как минимум раз - делаем функцию

Функции - пока-что для меня сложно, не очень понимаю как они работают. Но справка есть, почему нет, изучу на досуге.

  • 6) Лучше не использовать русских символов в названии переменных и меток, так как Ваш код может быть полезен и для других желающих, которые не смогут понять смысл метки

Изначально скрипт писался только для меня и МОЖЕТ БЫТЬ друзей. Хорошо я знаю только русский. Наверное мне так легче понимать про что этот кусок. Интересно, попадает ли столько цитат под запрет..

4

Re: Не обновляется ListView (После создания нового окна)

AdcB, в указанном участке кода оператором else Вы только изменяете текст статуса. gosub, ReloadList выполнится в любом случае, если вы заберёте return с проверочного тела. Поэтому и советую для Вас тело даже в одну строчку выделять скобками