Что нового

Тренажер запоминания иностранных фраз

lemonia

Новичок
Сообщения
126
Репутация
0
Версия AutoIt: 3.3.12.0 и 3.3.14.0

Описание:
Изучаю по книге Драгункина "Малый прыжок в английский за 115 минут" с соответствующим аудиокурсом.
Сначала планирую изучить новые слова, делаю картонные карточки (пишу с двух сторон на русском и английском), а затем фразы, которые Драгункин рекомендует использовать, как шаблоны, подставляя в них другие слова. Есть бесплатный тренажер запоминания слов Anki, однако с ним не удобно, сложная структура меню в нем.

Итак, что нужно от программы.
В текстовой файл добавляю по три строки, затем чистая строка и так далее. Формат:
Строка фразы на английском
Строка транскрипции (у Драгункина это русские буквы с некоторыми английскими)
Строка фразы на русском

Пример:
"I AM in the forest".
ай аем ин дэ форист
Буквально:«Я ЕСТЬ в лесу»

I AM that white elephant.
ай аем дает wait элифэнт
Я тот белый слон

И так далее

В настройках программы можно чтобы было отключать отображение одной или двух строк, например первой и второй или других по выбору. Программа должна выводить на экран то, что разрешено, затем мысленно представляю то, что в неотображенных строках или пишу на листок, затем например нажимаю 2, если скрыта вторая строка и она отображается, нажимаю 1, если были скрыты 1 и 2 строки и отображается также 1.
Если угадал, то например жму пробел и перехожу к следующей фразе. Если не угадал, жму например Cntrl и программа пишет эти три строки в другой файл. Затем когда захочу повторить из второго файла, загружаю его в программу и работаю с ним. Таким образом, то что легко запомнилось, отбрасываю и работаю с тем, что в прошлый раз не было хорошо записано в памяти мозга.

Примечания: Операционная система Windows XP.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
lemonia [?]
затем мысленно представляю то, что в неотображенных строках или пишу на листок
Добавил вместо листка поля ввода для скрытых строк (можно выключить)

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <WinAPIShPath.au3>
#include <WinAPISys.au3>
#include <File.au3>
Opt("TrayAutoPause", 0)
FileChangeDir(@ScriptDir)

Global Const $HOTKEY_CHECKBOX1 = "1"
Global Const $HOTKEY_CHECKBOX2 = "2"
Global Const $HOTKEY_CHECKBOX3 = "3"
Global Const $HOTKEY_NEXT = "{SPACE}"
Global Const $HOTKEY_SAVE = "^{SPACE}"

Global Const $GUI_TITLE = "Тренажер"
Global Const $GUI_WIDTH = 500
Global Const $CONTROL_INDENT = 10
Global Const $CHECKBOX_HEIGHT = 20
Global Const $INPUT_HEIGHT = 20
Global Const $CHECKBOX_TEXT_DEFAULT = " . . . "
Global Const $CHECKBOX_TEXT_SETTINGS = "Отображать по умолчанию"
Global Const $MENU_TEXT_FILE = "Файл"
Global Const $MENU_TEXT_FILE_OPEN = "Открыть"
Global Const $MENU_TEXT_FILE_EXIT = "Выйти"
Global Const $MENU_TEXT_MODE_SETTING = "Режим настройки"
Global Const $MENU_TEXT_MODE_TRAIN = "Режим тренажера"
Global Const $MENU_TEXT_SHOWINPUT = "Показать поля ввода"
Global Const $MENU_TEXT_HIDEINPUT = "Cкрыть поля ввода"
Global Const $INI_FILE = StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -1)) & "ini"
Global Const $SAVE_FILE_FORMAT = "%s - Saved"
Global Const $OPEN_FILE_FILTER = "Текстовые документы (*.txt)|Все (*.*)"
Global Const $OPEN_FILE_ERROR_FORMAT = 'Фразы не найдены -> "%s"'

Global Enum $DCT_ENG, $DCT_TRANSC, $DCT_TRANSL, $DCT_MAX
Global Enum $CB_ID, $CB_DUMMY, $CB_INPUT, $CB_SEP, $CB_DEFSTATE, $CB_MAX
Global $g_hGUI, $g_idMenuFile, $g_idMenuShowInput, $g_aDict[1][$DCT_MAX] = [[0]], $g_aDictSave[1] = [-1], $g_aCB[$DCT_MAX][$CB_MAX], _
		$g_sFileOpen, $g_sFileSave, $g_bShowInput
_GUI_Init()

While Sleep(10)
WEnd

Func _GUI_Init()
	Opt("GUIResizeMode", $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKMENUBAR)
	Opt("GUIOnEventMode", 1)
	AutoItWinSetTitle($GUI_TITLE & @MDAY & @MON & @YEAR & @HOUR & @MIN & @SEC)
	_WinAPI_SetKeyboardLayout(WinGetHandle(AutoItWinGetTitle()), 0x0409)
	Local $iFullWidth = $GUI_WIDTH - $CONTROL_INDENT * 2, $iY = $CONTROL_INDENT
	$g_hGUI = GUICreate($GUI_TITLE, $GUI_WIDTH)
	GUISetOnEvent($GUI_EVENT_CLOSE, "_Event_Exit")
	$g_idMenuFile = GUICtrlCreateMenu($MENU_TEXT_FILE)
	GUICtrlCreateMenuItem($MENU_TEXT_FILE_OPEN, $g_idMenuFile)
	GUICtrlSetOnEvent(-1, "_Event_Open")
	GUICtrlCreateMenuItem("", $g_idMenuFile)
	GUICtrlCreateMenuItem($MENU_TEXT_FILE_EXIT, $g_idMenuFile)
	GUICtrlSetOnEvent(-1, "_Event_Exit")
	GUICtrlCreateMenuItem($MENU_TEXT_MODE_SETTING, -1)
	GUICtrlSetOnEvent(-1, "_Event_SetView")

	$g_bShowInput = IniRead($INI_FILE, "Data", "Input", "False") = "True"
	$g_idMenuShowInput = GUICtrlCreateMenuItem($g_bShowInput ? $MENU_TEXT_HIDEINPUT : $MENU_TEXT_SHOWINPUT, -1)
	GUICtrlSetOnEvent(-1, "_Event_ShowInput")

	For $i = 0 To $DCT_MAX - 1
		$g_aCB[$i][$CB_DEFSTATE] = Number(IniRead($INI_FILE, "View", $i, $GUI_CHECKED))
		$g_aCB[$i][$CB_ID] = GUICtrlCreateCheckbox($CHECKBOX_TEXT_DEFAULT, $CONTROL_INDENT, $iY, $iFullWidth, $CHECKBOX_HEIGHT)
		GUICtrlSetState(-1, $g_aCB[$i][$CB_DEFSTATE])
		GUICtrlSetOnEvent(-1, "_Event_ShowText")
		$g_aCB[$i][$CB_DUMMY] = GUICtrlCreateDummy()
		GUICtrlSetOnEvent(-1, "_Event_ShowText")
		$iY += $CHECKBOX_HEIGHT + $CONTROL_INDENT / 2
		$g_aCB[$i][$CB_INPUT] = GUICtrlCreateInput("", $CONTROL_INDENT, $iY, $iFullWidth, $INPUT_HEIGHT)
		If Not $g_bShowInput Or $g_aCB[$i][$CB_DEFSTATE] = $GUI_CHECKED Then
			GUICtrlSetState(-1, $GUI_HIDE)
		Else
			$iY += $INPUT_HEIGHT + $CONTROL_INDENT
		EndIf
		$g_aCB[$i][$CB_SEP] = GUICtrlCreateLabel("", $CONTROL_INDENT, $iY, $iFullWidth, 0, $SS_ETCHEDHORZ)
		$iY += $CONTROL_INDENT
	Next
	OnAutoItExitRegister("_OnExit")

	Local $sFile = IniRead($INI_FILE, "Data", "File", "")
	If FileExists($sFile) Then
		_Open($sFile)
		_Next(Int(IniRead($INI_FILE, "Data", "Index", "1")))
	EndIf

	_GUIResize($g_hGUI, Default, Default, Default, $iY)
	Local $idNext = GUICtrlCreateDummy()
	GUICtrlSetOnEvent(-1, "_Event_Next")
	Local $idSave = GUICtrlCreateDummy()
	GUICtrlSetOnEvent(-1, "_Event_Save")
	Local $aAccel[][] = [ _
			[$HOTKEY_CHECKBOX1, $g_aCB[$DCT_ENG][$CB_DUMMY]], _
			[$HOTKEY_CHECKBOX2, $g_aCB[$DCT_TRANSC][$CB_DUMMY]], _
			[$HOTKEY_CHECKBOX3, $g_aCB[$DCT_TRANSL][$CB_DUMMY]], _
			[$HOTKEY_NEXT, $idNext], _
			[$HOTKEY_SAVE, $idSave] _
			]
	GUISetAccelerators($aAccel)
	GUISetState()
EndFunc   ;==>_GUI_Init

Func _Event_Save()
	If $g_aDict[0][1] > 0 And Not $g_aDictSave[$g_aDict[0][1]] Then
		$g_aDictSave[$g_aDict[0][1]] = True
		Local $sOut
		For $i = 0 To $DCT_MAX - 1
			$sOut &= $g_aDict[$g_aDict[0][1]][$i] & @CRLF
		Next
		FileWrite($g_sFileSave, $sOut & @CRLF)
		_SetTitle()
	EndIf
EndFunc   ;==>_Event_Save

Func _Event_ShowText()
	Local $bChecked
	For $i = 0 To $DCT_MAX - 1
		Switch @GUI_CtrlId
			Case $g_aCB[$i][$CB_DUMMY], $g_aCB[$i][$CB_ID]
				$bChecked = _IsChecked($g_aCB[$i][$CB_ID])
				If @GUI_CtrlId = $g_aCB[$i][$CB_DUMMY] Then
					GUICtrlSetState($g_aCB[$i][$CB_ID], $bChecked ? $GUI_UNCHECKED : $GUI_CHECKED)
					$bChecked = Not $bChecked
				EndIf
				Return _SetData($i, $bChecked)
		EndSwitch
	Next
EndFunc   ;==>_Event_ShowText

Func _Event_ShowInput()
	$g_bShowInput = Not $g_bShowInput
	_ShowInput()
EndFunc   ;==>_Event_ShowInput

Func _ShowInput()
	Local $iY = $CONTROL_INDENT
	GUICtrlSetData($g_idMenuShowInput, $g_bShowInput ? $MENU_TEXT_HIDEINPUT : $MENU_TEXT_SHOWINPUT)
	For $i = 0 To $DCT_MAX - 1
		GUICtrlSetPos($g_aCB[$i][$CB_ID], Default, $iY)
		$iY += $CHECKBOX_HEIGHT + $CONTROL_INDENT / 2
		If $g_bShowInput And $g_aCB[$i][$CB_DEFSTATE] = $GUI_UNCHECKED Then
			GUICtrlSetPos($g_aCB[$i][$CB_INPUT], Default, $iY)
			GUICtrlSetState($g_aCB[$i][$CB_INPUT], $GUI_SHOW)
			$iY += $INPUT_HEIGHT + $CONTROL_INDENT / 2
		Else
			GUICtrlSetState($g_aCB[$i][$CB_INPUT], $GUI_HIDE)
		EndIf
		GUICtrlSetPos($g_aCB[$i][$CB_SEP], Default, $iY)
		$iY += $CONTROL_INDENT
	Next
	_GUIResize($g_hGUI, Default, Default, Default, $iY)
EndFunc   ;==>_ShowInput

Func _Event_SetView()
	Local $idMenuMode = @GUI_CtrlId, $bChecked
	If GUICtrlRead($idMenuMode, $GUI_READ_EXTENDED) = $MENU_TEXT_MODE_SETTING Then

		Opt("GUIOnEventMode", 0)
		WinSetTitle($g_hGUI, "", $MENU_TEXT_MODE_SETTING)
		GUICtrlSetState($g_idMenuFile, $GUI_DISABLE)
		GUICtrlSetState($g_idMenuShowInput, $GUI_DISABLE)
		GUICtrlSetData($idMenuMode, $MENU_TEXT_MODE_TRAIN)
		For $i = 0 To $DCT_MAX - 1
			GUICtrlSetData($g_aCB[$i][$CB_ID], $CHECKBOX_TEXT_SETTINGS)
			GUICtrlSetState($g_aCB[$i][$CB_ID], $g_aCB[$i][$CB_DEFSTATE])
		Next

		While 1
			Switch GUIGetMsg()
				Case $GUI_EVENT_CLOSE, $idMenuMode
					ExitLoop
			EndSwitch
		WEnd

		For $i = 0 To $DCT_MAX - 1
			$bChecked = _IsChecked($g_aCB[$i][$CB_ID])
			$g_aCB[$i][$CB_DEFSTATE] = $bChecked ? $GUI_CHECKED : $GUI_UNCHECKED
			_SetData($i, $bChecked)
		Next
		GUICtrlSetData($idMenuMode, $MENU_TEXT_MODE_SETTING)
		GUICtrlSetState($g_idMenuFile, $GUI_ENABLE)
		GUICtrlSetState($g_idMenuShowInput, $GUI_ENABLE)
		_ShowInput()
		_SetTitle()
		Opt("GUIOnEventMode", 1)

	EndIf
EndFunc   ;==>_Event_SetView

Func _Event_Open()
	Local $sFile = FileOpenDialog("", "", $OPEN_FILE_FILTER, $FD_FILEMUSTEXIST, $g_sFileOpen, $g_hGUI)
	If Not @error Then
		_Open($sFile)
		_Event_Next()
	EndIf
EndFunc   ;==>_Event_Open

Func _Open($sFile)
	Local $aRegExp = StringRegExp(FileRead($sFile) & @CRLF & @CRLF, "(.+?)\R(.+?)\R(.+?)\R\R", $STR_REGEXPARRAYGLOBALMATCH)
	If @error Then Return MsgBox($MB_ICONERROR + $MB_TOPMOST, $GUI_TITLE, StringFormat($OPEN_FILE_ERROR_FORMAT, $sFile), 0, $g_hGUI)

	Local $sDrive, $sDir, $sFName, $sExt
	$g_sFileOpen = $sFile
	_PathSplit($sFile, $sDrive, $sDir, $sFName, $sExt)
	$g_sFileSave = _PathMake($sDrive, $sDir, StringFormat($SAVE_FILE_FORMAT, $sFName), $sExt)
	;$g_sFileSave = _WinAPI_PathYetAnotherMakeUniqueName($g_sFileSave)

	Local $iCount = UBound($aRegExp), $sSaved = FileRead($g_sFileSave) & @CRLF & @CRLF
	Dim $g_aDict[$iCount / 3 + 1][$DCT_MAX] = [[0, 0]]
	Dim $g_aDictSave[$iCount / 3 + 1] = [-1]
	For $i = 0 To $iCount - 1 Step 3
		$g_aDict[0][0] += 1
		$g_aDict[$g_aDict[0][0]][$DCT_ENG] = $aRegExp[$i]
		$g_aDict[$g_aDict[0][0]][$DCT_TRANSC] = $aRegExp[$i + 1]
		$g_aDict[$g_aDict[0][0]][$DCT_TRANSL] = $aRegExp[$i + 2]
		$g_aDictSave[$g_aDict[0][0]] = StringInStr($sSaved, StringFormat("%s\r\n%s\r\n%s\r\n", $aRegExp[$i], $aRegExp[$i + 1], $aRegExp[$i + 2]))
	Next
EndFunc   ;==>_Open

Func _Event_Next()
	_Next($g_aDict[0][1] + 1)
EndFunc   ;==>_Event_Next

Func _Next($iIndex)
	If $g_aDict[0][0] > 0 Then
		$g_aDict[0][1] = $iIndex
		If $g_aDict[0][1] > $g_aDict[0][0] Then $g_aDict[0][1] = 0
		For $i = 0 To $DCT_MAX - 1
			_SetData($i, $g_aCB[$i][$CB_DEFSTATE] = $GUI_CHECKED)
			GUICtrlSetState($g_aCB[$i][$CB_ID], $g_aCB[$i][$CB_DEFSTATE])
			GUICtrlSetData($g_aCB[$i][$CB_INPUT], "")
		Next
		_SetTitle()
	EndIf
EndFunc   ;==>_Next

Func _GUIResize($hGUI, $iX, $iY = Default, $iW = Default, $iH = Default)
	Local $aClientWH = WinGetClientSize($hGUI)
	If @error Then Return SetError(@error, 0, 0)
	Local $aXYWH = WinGetPos($hGUI)
	If @error Then Return SetError(@error, 0, 0)
	If $iW <> Default Then $iW += $aXYWH[2] - $aClientWH[0]
	If $iH <> Default Then $iH += $aXYWH[3] - $aClientWH[1]
	Return WinMove($hGUI, "", $iX, $iY, $iW, $iH)
EndFunc   ;==>_GUIResize

Func _OnExit()
	For $i = 0 To $DCT_MAX - 1
		IniWrite($INI_FILE, "View", $i, $g_aCB[$i][$CB_DEFSTATE])
	Next
	IniWrite($INI_FILE, "Data", "File", $g_sFileOpen)
	IniWrite($INI_FILE, "Data", "Index", $g_aDict[0][1])
	IniWrite($INI_FILE, "Data", "Input", $g_bShowInput)
EndFunc   ;==>_OnExit

Func _SetTitle()
	Local $sFormat = "%s: *%s (%i/%i)"
	If $g_aDictSave[$g_aDict[0][1]] Then $sFormat = "%s: %s (%i/%i)"
	WinSetTitle($g_hGUI, "", StringFormat($sFormat, $GUI_TITLE, _WinAPI_PathFindFileName($g_sFileOpen), $g_aDict[0][1], $g_aDict[0][0]))
EndFunc   ;==>_SetTitle

Func _SetData($iIdx, $bSet)
	GUICtrlSetData($g_aCB[$iIdx][$CB_ID], ($bSet And $g_aDict[0][1] > 0) ? $g_aDict[$g_aDict[0][1]][$iIdx] : $CHECKBOX_TEXT_DEFAULT)
EndFunc   ;==>_SetData

Func _IsChecked($idCheckBox)
	Return BitAND(GUICtrlRead($idCheckBox), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func _Event_Exit()
	Exit
EndFunc   ;==>_Event_Exit
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Здравствуйте. Когда в поле ввода ввожу текст в верхней строке и нажимаю пробел перед следующим словом, то сбрасывается. AutoIt: 3.3.14.0.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
lemonia, для избежания этой проблемы вы можете использовать горячие клавиши которые не будут использоваться при вводе (или все, но с модификатором Alt, Ctrl...)

Например - Enter переход на следующую фразу, Ctrl + Space для сохранения
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <WinAPIShPath.au3>
#include <WinAPISys.au3>
#include <File.au3>
Opt("TrayAutoPause", 0)
FileChangeDir(@ScriptDir)

Global Const $HOTKEY_CHECKBOX1 = "1"
Global Const $HOTKEY_CHECKBOX2 = "2"
Global Const $HOTKEY_CHECKBOX3 = "3"
Global Const $HOTKEY_NEXT = "{ENTER}"
Global Const $HOTKEY_SAVE = "^{SPACE}"

Global Const $GUI_TITLE = "Тренажер"
Global Const $GUI_WIDTH = 500
Global Const $CONTROL_INDENT = 10
Global Const $CHECKBOX_HEIGHT = 20
Global Const $INPUT_HEIGHT = 20
Global Const $CHECKBOX_TEXT_DEFAULT = " . . . "
Global Const $CHECKBOX_TEXT_SETTINGS = "Отображать по умолчанию"
Global Const $MENU_TEXT_FILE = "Файл"
Global Const $MENU_TEXT_FILE_OPEN = "Открыть"
Global Const $MENU_TEXT_FILE_EXIT = "Выйти"
Global Const $MENU_TEXT_MODE_SETTING = "Режим настройки"
Global Const $MENU_TEXT_MODE_TRAIN = "Режим тренажера"
Global Const $MENU_TEXT_SHOWINPUT = "Показать поля ввода"
Global Const $MENU_TEXT_HIDEINPUT = "Cкрыть поля ввода"
Global Const $INI_FILE = StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -1)) & "ini"
Global Const $SAVE_FILE_FORMAT = "%s - Saved"
Global Const $OPEN_FILE_FILTER = "Текстовые документы (*.txt)|Все (*.*)"
Global Const $OPEN_FILE_ERROR_FORMAT = 'Фразы не найдены -> "%s"'

Global Enum $DCT_ENG, $DCT_TRANSC, $DCT_TRANSL, $DCT_MAX
Global Enum $CB_ID, $CB_DUMMY, $CB_INPUT, $CB_SEP, $CB_DEFSTATE, $CB_MAX
Global $g_hGUI, $g_idMenuFile, $g_idMenuShowInput, $g_aDict[1][$DCT_MAX] = [[0]], $g_aDictSave[1] = [-1], $g_aCB[$DCT_MAX][$CB_MAX], _
		$g_sFileOpen, $g_sFileSave, $g_bShowInput
_GUI_Init()

While Sleep(10)
WEnd

Func _GUI_Init()
	Opt("GUIResizeMode", $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKMENUBAR)
	Opt("GUIOnEventMode", 1)
	AutoItWinSetTitle($GUI_TITLE & @MDAY & @MON & @YEAR & @HOUR & @MIN & @SEC)
	_WinAPI_SetKeyboardLayout(WinGetHandle(AutoItWinGetTitle()), 0x0409)
	Local $iFullWidth = $GUI_WIDTH - $CONTROL_INDENT * 2, $iY = $CONTROL_INDENT
	$g_hGUI = GUICreate($GUI_TITLE, $GUI_WIDTH)
	GUISetOnEvent($GUI_EVENT_CLOSE, "_Event_Exit")
	$g_idMenuFile = GUICtrlCreateMenu($MENU_TEXT_FILE)
	GUICtrlCreateMenuItem($MENU_TEXT_FILE_OPEN, $g_idMenuFile)
	GUICtrlSetOnEvent(-1, "_Event_Open")
	GUICtrlCreateMenuItem("", $g_idMenuFile)
	GUICtrlCreateMenuItem($MENU_TEXT_FILE_EXIT, $g_idMenuFile)
	GUICtrlSetOnEvent(-1, "_Event_Exit")
	GUICtrlCreateMenuItem($MENU_TEXT_MODE_SETTING, -1)
	GUICtrlSetOnEvent(-1, "_Event_SetView")

	$g_bShowInput = IniRead($INI_FILE, "Data", "Input", "False") = "True"
	$g_idMenuShowInput = GUICtrlCreateMenuItem($g_bShowInput ? $MENU_TEXT_HIDEINPUT : $MENU_TEXT_SHOWINPUT, -1)
	GUICtrlSetOnEvent(-1, "_Event_ShowInput")

	For $i = 0 To $DCT_MAX - 1
		$g_aCB[$i][$CB_DEFSTATE] = Number(IniRead($INI_FILE, "View", $i, $GUI_CHECKED))
		$g_aCB[$i][$CB_ID] = GUICtrlCreateCheckbox($CHECKBOX_TEXT_DEFAULT, $CONTROL_INDENT, $iY, $iFullWidth, $CHECKBOX_HEIGHT)
		GUICtrlSetState(-1, $g_aCB[$i][$CB_DEFSTATE])
		GUICtrlSetOnEvent(-1, "_Event_ShowText")
		$g_aCB[$i][$CB_DUMMY] = GUICtrlCreateDummy()
		GUICtrlSetOnEvent(-1, "_Event_ShowText")
		$iY += $CHECKBOX_HEIGHT + $CONTROL_INDENT / 2
		$g_aCB[$i][$CB_INPUT] = GUICtrlCreateInput("", $CONTROL_INDENT, $iY, $iFullWidth, $INPUT_HEIGHT)
		If Not $g_bShowInput Or $g_aCB[$i][$CB_DEFSTATE] = $GUI_CHECKED Then
			GUICtrlSetState(-1, $GUI_HIDE)
		Else
			$iY += $INPUT_HEIGHT + $CONTROL_INDENT
		EndIf
		$g_aCB[$i][$CB_SEP] = GUICtrlCreateLabel("", $CONTROL_INDENT, $iY, $iFullWidth, 0, $SS_ETCHEDHORZ)
		$iY += $CONTROL_INDENT
	Next
	OnAutoItExitRegister("_OnExit")

	Local $sFile = IniRead($INI_FILE, "Data", "File", "")
	If FileExists($sFile) Then
		_Open($sFile)
		_Next(Int(IniRead($INI_FILE, "Data", "Index", "1")))
	EndIf

	_GUIResize($g_hGUI, Default, Default, Default, $iY)
	Local $idNext = GUICtrlCreateDummy()
	GUICtrlSetOnEvent(-1, "_Event_Next")
	Local $idSave = GUICtrlCreateDummy()
	GUICtrlSetOnEvent(-1, "_Event_Save")
	Local $aAccel[][] = [ _
			[$HOTKEY_CHECKBOX1, $g_aCB[$DCT_ENG][$CB_DUMMY]], _
			[$HOTKEY_CHECKBOX2, $g_aCB[$DCT_TRANSC][$CB_DUMMY]], _
			[$HOTKEY_CHECKBOX3, $g_aCB[$DCT_TRANSL][$CB_DUMMY]], _
			[$HOTKEY_NEXT, $idNext], _
			[$HOTKEY_SAVE, $idSave] _
			]
	GUISetAccelerators($aAccel)
	GUISetState()
EndFunc   ;==>_GUI_Init

Func _Event_Save()
	If $g_aDict[0][1] > 0 And Not $g_aDictSave[$g_aDict[0][1]] Then
		$g_aDictSave[$g_aDict[0][1]] = True
		Local $sOut
		For $i = 0 To $DCT_MAX - 1
			$sOut &= $g_aDict[$g_aDict[0][1]][$i] & @CRLF
		Next
		FileWrite($g_sFileSave, $sOut & @CRLF)
		_SetTitle()
	EndIf
EndFunc   ;==>_Event_Save

Func _Event_ShowText()
	Local $bChecked
	For $i = 0 To $DCT_MAX - 1
		Switch @GUI_CtrlId
			Case $g_aCB[$i][$CB_DUMMY], $g_aCB[$i][$CB_ID]
				$bChecked = _IsChecked($g_aCB[$i][$CB_ID])
				If @GUI_CtrlId = $g_aCB[$i][$CB_DUMMY] Then
					GUICtrlSetState($g_aCB[$i][$CB_ID], $bChecked ? $GUI_UNCHECKED : $GUI_CHECKED)
					$bChecked = Not $bChecked
				EndIf
				Return _SetData($i, $bChecked)
		EndSwitch
	Next
EndFunc   ;==>_Event_ShowText

Func _Event_ShowInput()
	$g_bShowInput = Not $g_bShowInput
	_ShowInput()
EndFunc   ;==>_Event_ShowInput

Func _ShowInput()
	Local $iY = $CONTROL_INDENT
	GUICtrlSetData($g_idMenuShowInput, $g_bShowInput ? $MENU_TEXT_HIDEINPUT : $MENU_TEXT_SHOWINPUT)
	For $i = 0 To $DCT_MAX - 1
		GUICtrlSetPos($g_aCB[$i][$CB_ID], Default, $iY)
		$iY += $CHECKBOX_HEIGHT + $CONTROL_INDENT / 2
		If $g_bShowInput And $g_aCB[$i][$CB_DEFSTATE] = $GUI_UNCHECKED Then
			GUICtrlSetPos($g_aCB[$i][$CB_INPUT], Default, $iY)
			GUICtrlSetState($g_aCB[$i][$CB_INPUT], $GUI_SHOW)
			$iY += $INPUT_HEIGHT + $CONTROL_INDENT / 2
		Else
			GUICtrlSetState($g_aCB[$i][$CB_INPUT], $GUI_HIDE)
		EndIf
		GUICtrlSetPos($g_aCB[$i][$CB_SEP], Default, $iY)
		$iY += $CONTROL_INDENT
	Next
	_GUIResize($g_hGUI, Default, Default, Default, $iY)
EndFunc   ;==>_ShowInput

Func _Event_SetView()
	Local $idMenuMode = @GUI_CtrlId, $bChecked
	If GUICtrlRead($idMenuMode, $GUI_READ_EXTENDED) = $MENU_TEXT_MODE_SETTING Then

		Opt("GUIOnEventMode", 0)
		WinSetTitle($g_hGUI, "", $MENU_TEXT_MODE_SETTING)
		GUICtrlSetState($g_idMenuFile, $GUI_DISABLE)
		GUICtrlSetState($g_idMenuShowInput, $GUI_DISABLE)
		GUICtrlSetData($idMenuMode, $MENU_TEXT_MODE_TRAIN)
		For $i = 0 To $DCT_MAX - 1
			GUICtrlSetData($g_aCB[$i][$CB_ID], $CHECKBOX_TEXT_SETTINGS)
			GUICtrlSetState($g_aCB[$i][$CB_ID], $g_aCB[$i][$CB_DEFSTATE])
		Next

		While 1
			Switch GUIGetMsg()
				Case $GUI_EVENT_CLOSE, $idMenuMode
					ExitLoop
			EndSwitch
		WEnd

		For $i = 0 To $DCT_MAX - 1
			$bChecked = _IsChecked($g_aCB[$i][$CB_ID])
			$g_aCB[$i][$CB_DEFSTATE] = $bChecked ? $GUI_CHECKED : $GUI_UNCHECKED
			_SetData($i, $bChecked)
		Next
		GUICtrlSetData($idMenuMode, $MENU_TEXT_MODE_SETTING)
		GUICtrlSetState($g_idMenuFile, $GUI_ENABLE)
		GUICtrlSetState($g_idMenuShowInput, $GUI_ENABLE)
		_ShowInput()
		_SetTitle()
		Opt("GUIOnEventMode", 1)

	EndIf
EndFunc   ;==>_Event_SetView

Func _Event_Open()
	Local $sFile = FileOpenDialog("", "", $OPEN_FILE_FILTER, $FD_FILEMUSTEXIST, $g_sFileOpen, $g_hGUI)
	If Not @error Then
		_Open($sFile)
		_Event_Next()
	EndIf
EndFunc   ;==>_Event_Open

Func _Open($sFile)
	Local $aRegExp = StringRegExp(FileRead($sFile) & @CRLF & @CRLF, "(.+?)\R(.+?)\R(.+?)\R\R", $STR_REGEXPARRAYGLOBALMATCH)
	If @error Then Return MsgBox($MB_ICONERROR + $MB_TOPMOST, $GUI_TITLE, StringFormat($OPEN_FILE_ERROR_FORMAT, $sFile), 0, $g_hGUI)

	Local $sDrive, $sDir, $sFName, $sExt
	$g_sFileOpen = $sFile
	_PathSplit($sFile, $sDrive, $sDir, $sFName, $sExt)
	$g_sFileSave = _PathMake($sDrive, $sDir, StringFormat($SAVE_FILE_FORMAT, $sFName), $sExt)
	;$g_sFileSave = _WinAPI_PathYetAnotherMakeUniqueName($g_sFileSave)

	Local $iCount = UBound($aRegExp), $sSaved = FileRead($g_sFileSave) & @CRLF & @CRLF
	Dim $g_aDict[$iCount / 3 + 1][$DCT_MAX] = [[0, 0]]
	Dim $g_aDictSave[$iCount / 3 + 1] = [-1]
	For $i = 0 To $iCount - 1 Step 3
		$g_aDict[0][0] += 1
		$g_aDict[$g_aDict[0][0]][$DCT_ENG] = $aRegExp[$i]
		$g_aDict[$g_aDict[0][0]][$DCT_TRANSC] = $aRegExp[$i + 1]
		$g_aDict[$g_aDict[0][0]][$DCT_TRANSL] = $aRegExp[$i + 2]
		$g_aDictSave[$g_aDict[0][0]] = StringInStr($sSaved, StringFormat("%s\r\n%s\r\n%s\r\n", $aRegExp[$i], $aRegExp[$i + 1], $aRegExp[$i + 2]))
	Next
EndFunc   ;==>_Open

Func _Event_Next()
	_Next($g_aDict[0][1] + 1)
EndFunc   ;==>_Event_Next

Func _Next($iIndex)
	If $g_aDict[0][0] > 0 Then
		$g_aDict[0][1] = $iIndex
		If $g_aDict[0][1] > $g_aDict[0][0] Then $g_aDict[0][1] = 0
		For $i = 0 To $DCT_MAX - 1
			_SetData($i, $g_aCB[$i][$CB_DEFSTATE] = $GUI_CHECKED)
			GUICtrlSetState($g_aCB[$i][$CB_ID], $g_aCB[$i][$CB_DEFSTATE])
			GUICtrlSetData($g_aCB[$i][$CB_INPUT], "")
		Next
		_SetTitle()
	EndIf
EndFunc   ;==>_Next

Func _GUIResize($hGUI, $iX, $iY = Default, $iW = Default, $iH = Default)
	Local $aClientWH = WinGetClientSize($hGUI)
	If @error Then Return SetError(@error, 0, 0)
	Local $aXYWH = WinGetPos($hGUI)
	If @error Then Return SetError(@error, 0, 0)
	If $iW <> Default Then $iW += $aXYWH[2] - $aClientWH[0]
	If $iH <> Default Then $iH += $aXYWH[3] - $aClientWH[1]
	Return WinMove($hGUI, "", $iX, $iY, $iW, $iH)
EndFunc   ;==>_GUIResize

Func _OnExit()
	For $i = 0 To $DCT_MAX - 1
		IniWrite($INI_FILE, "View", $i, $g_aCB[$i][$CB_DEFSTATE])
	Next
	IniWrite($INI_FILE, "Data", "File", $g_sFileOpen)
	IniWrite($INI_FILE, "Data", "Index", $g_aDict[0][1])
	IniWrite($INI_FILE, "Data", "Input", $g_bShowInput)
EndFunc   ;==>_OnExit

Func _SetTitle()
	Local $sFormat = "%s: *%s (%i/%i)"
	If $g_aDictSave[$g_aDict[0][1]] Then $sFormat = "%s: %s (%i/%i)"
	WinSetTitle($g_hGUI, "", StringFormat($sFormat, $GUI_TITLE, _WinAPI_PathFindFileName($g_sFileOpen), $g_aDict[0][1], $g_aDict[0][0]))
EndFunc   ;==>_SetTitle

Func _SetData($iIdx, $bSet)
	GUICtrlSetData($g_aCB[$iIdx][$CB_ID], ($bSet And $g_aDict[0][1] > 0) ? $g_aDict[$g_aDict[0][1]][$iIdx] : $CHECKBOX_TEXT_DEFAULT)
EndFunc   ;==>_SetData

Func _IsChecked($idCheckBox)
	Return BitAND(GUICtrlRead($idCheckBox), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func _Event_Exit()
	Exit
EndFunc   ;==>_Event_Exit

Или вам нужен вариант именно с пробелом? Но тогда для перехода на следующую фразу нужно будет убирать фокус с поля ввода.
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Или вам нужен вариант именно с пробелом? Но тогда для перехода на следующую фразу нужно будет убирать фокус с поля ввода.
Не разобрался пока. Пробую вторую версию скрипта.
Вводил фразы, нажимая Ентер между ними. После того, как все прошел, что нажать, чтобы записался второй файл или это вносится в файл настроек?
Когда закрываю программу, она снова не запускается с первого раза (выдает ошибку), а только со второго раза стартует окно.
 

Вложения

  • Image 1.jpg
    Image 1.jpg
    31.9 КБ · Просмотры: 4

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
lemonia [?]
Когда закрываю программу, она снова не запускается с первого раза (выдает ошибку), а только со второго раза стартует окно.
Это скорее всего проблемы с вашей версией AutoIt

[?]
После того, как все прошел, что нажать, чтобы записался второй файл или это вносится в файл настроек?
Если не угадал, жму например Cntrl и программа пишет эти три строки в другой файл
После нажатия Ctrl + Space в файл записывается текущая фраза. Файл находится рядом с открытым, но с приставкой в конце "имя_открытого_файла - Saved"
Или вам нужно окно выбора куда сохранить файл после прохождения?
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Прикрепите пожалуйста внизу окна программы подсказку в виде описания горячих клавиш. А то не всем пользователям тренажера удобно будет смотреть в другое место для вспоминания, какую клавишу нажимать.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPIShPath.au3>
#include <WinAPISys.au3>
#include <String.au3>
#include <File.au3>
Opt("TrayAutoPause", 0)
FileChangeDir(@ScriptDir)

Global Const $HOTKEY_CHECKBOX1 = "1"
Global Const $HOTKEY_CHECKBOX2 = "2"
Global Const $HOTKEY_CHECKBOX3 = "3"
Global Const $HOTKEY_NEXT = "{ENTER}"
Global Const $HOTKEY_NEXT_TIP = "Далее - Enter"
Global Const $HOTKEY_SAVE = "^{SPACE}"
Global Const $HOTKEY_SAVE_TIP = "Cохранить фразу - Ctrl + Space"

Global Const $GUI_TITLE = "Тренажер"
Global Const $GUI_WIDTH = 600
Global Const $CONTROL_INDENT = 10
Global Const $CHECKBOX_HEIGHT = 20
Global Const $INPUT_HEIGHT = 20
Global Const $LABEL_TIP_HEIGHT = 20
Global Const $CHECKBOX_TEXT_DEFAULT = " . . . "
Global Const $CHECKBOX_TEXT_SETTINGS = "Отображать по умолчанию"
Global Const $MENU_TEXT_FILE = "Файл"
Global Const $MENU_TEXT_FILE_OPEN = "Открыть"
Global Const $MENU_TEXT_FILE_EXIT = "Выйти"
Global Const $MENU_TEXT_MODE_SETTING = "Режим настройки"
Global Const $MENU_TEXT_MODE_TRAIN = "Режим тренажера"
Global Const $MENU_TEXT_SHOWINPUT = "Показать поля ввода"
Global Const $MENU_TEXT_HIDEINPUT = "Cкрыть поля ввода"
Global Const $INI_FILE = StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -1)) & "ini"
Global Const $SAVE_FILE_FORMAT = "%s - Saved"
Global Const $OPEN_FILE_FILTER = "Текстовые документы (*.txt)|Все (*.*)"
Global Const $OPEN_FILE_ERROR_FORMAT = 'Фразы не найдены -> "%s"'

Global Enum $DCT_ENG, $DCT_TRANSC, $DCT_TRANSL, $DCT_MAX
Global Enum $CB_ID, $CB_DUMMY, $CB_INPUT, $CB_SEP, $CB_DEFSTATE, $CB_MAX
Global $g_hGUI, $g_idMenuFile, $g_idMenuShowInput, $g_aDict[1][$DCT_MAX] = [[0]], $g_aDictSave[1] = [-1], $g_aCB[$DCT_MAX][$CB_MAX], _
		$g_sFileOpen, $g_sFileSave, $g_bShowInput
_GUI_Init()

While Sleep(10)
WEnd

Func _GUI_Init()
	Opt("GUIResizeMode", $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKMENUBAR)
	Opt("GUIOnEventMode", 1)
	AutoItWinSetTitle($GUI_TITLE & @MDAY & @MON & @YEAR & @HOUR & @MIN & @SEC)
	_WinAPI_SetKeyboardLayout(WinGetHandle(AutoItWinGetTitle()), 0x0409)
	Local $iFullWidth = $GUI_WIDTH - $CONTROL_INDENT * 2, $iY = $CONTROL_INDENT
	$g_hGUI = GUICreate($GUI_TITLE, $GUI_WIDTH)
	GUISetOnEvent($GUI_EVENT_CLOSE, "_Event_Exit")
	$g_idMenuFile = GUICtrlCreateMenu($MENU_TEXT_FILE)
	GUICtrlCreateMenuItem($MENU_TEXT_FILE_OPEN, $g_idMenuFile)
	GUICtrlSetOnEvent(-1, "_Event_Open")
	GUICtrlCreateMenuItem("", $g_idMenuFile)
	GUICtrlCreateMenuItem($MENU_TEXT_FILE_EXIT, $g_idMenuFile)
	GUICtrlSetOnEvent(-1, "_Event_Exit")
	GUICtrlCreateMenuItem($MENU_TEXT_MODE_SETTING, -1)
	GUICtrlSetOnEvent(-1, "_Event_SetView")

	$g_bShowInput = IniRead($INI_FILE, "Data", "Input", "False") = "True"
	Local $aAccel[$DCT_MAX + 2][2], $iAcIdx = 0, $iShowed = 0, $bChecked
	For $i = 0 To $DCT_MAX - 1
		$g_aCB[$i][$CB_DEFSTATE] = Number(IniRead($INI_FILE, "View", $i, $GUI_CHECKED))
		$g_aCB[$i][$CB_ID] = GUICtrlCreateCheckbox($CHECKBOX_TEXT_DEFAULT, $CONTROL_INDENT, $iY, $iFullWidth, $CHECKBOX_HEIGHT)
		GUICtrlSetState(-1, $g_aCB[$i][$CB_DEFSTATE])
		GUICtrlSetOnEvent(-1, "_Event_ShowText")
		$g_aCB[$i][$CB_DUMMY] = GUICtrlCreateDummy()
		GUICtrlSetOnEvent(-1, "_Event_ShowText")
		$iY += $CHECKBOX_HEIGHT + $CONTROL_INDENT / 2
		$g_aCB[$i][$CB_INPUT] = GUICtrlCreateInput("", $CONTROL_INDENT, $iY, $iFullWidth, $INPUT_HEIGHT)
		$bChecked = $g_aCB[$i][$CB_DEFSTATE] = $GUI_CHECKED
		$iShowed += $bChecked
		If Not $g_bShowInput Or $bChecked Then
			GUICtrlSetState(-1, $GUI_HIDE)
		Else
			$iY += $INPUT_HEIGHT + $CONTROL_INDENT
		EndIf
		$g_aCB[$i][$CB_SEP] = GUICtrlCreateLabel("", $CONTROL_INDENT, $iY, $iFullWidth, 0, $SS_ETCHEDHORZ)
		$iY += $CONTROL_INDENT
		$aAccel[$iAcIdx][0] = Eval("HOTKEY_CHECKBOX" & $iAcIdx + 1)
		$aAccel[$iAcIdx][1] = $g_aCB[$i][$CB_DUMMY]
		If Not @error Then $iAcIdx += 1
	Next
	GUICtrlCreateLabel($HOTKEY_NEXT_TIP & ", " & $HOTKEY_SAVE_TIP, $CONTROL_INDENT, $iY, $iFullWidth, $LABEL_TIP_HEIGHT, BitOR($SS_CENTER, $SS_CENTERIMAGE))
	GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKSTATEBAR)

	$g_idMenuShowInput = GUICtrlCreateMenuItem($g_bShowInput ? $MENU_TEXT_HIDEINPUT : $MENU_TEXT_SHOWINPUT, -1)
	GUICtrlSetOnEvent(-1, "_Event_ShowInput")
	GUICtrlSetState($g_idMenuShowInput, ($iShowed = $DCT_MAX) ? $GUI_DISABLE : $GUI_ENABLE)
	$iY += $LABEL_TIP_HEIGHT + $CONTROL_INDENT
	_GUIResize($g_hGUI, Default, Default, Default, $iY)

	Local $sFile = IniRead($INI_FILE, "Data", "File", "")
	If FileExists($sFile) Then
		_Open($sFile)
		_Next(Int(IniRead($INI_FILE, "Data", "Index", "1")))
	EndIf
	OnAutoItExitRegister("_OnExit")

	$aAccel[$iAcIdx][0] = $HOTKEY_NEXT
	$aAccel[$iAcIdx][1] = GUICtrlCreateDummy()
	GUICtrlSetOnEvent(-1, "_Event_Next")
	$iAcIdx += 1
	$aAccel[$iAcIdx][0] = $HOTKEY_SAVE
	$aAccel[$iAcIdx][1] = GUICtrlCreateDummy()
	GUICtrlSetOnEvent(-1, "_Event_Save")
	ReDim $aAccel[$iAcIdx + 1][2]
	GUISetAccelerators($aAccel)

	GUISetState()
EndFunc   ;==>_GUI_Init

Func _Event_Save()
	If $g_aDict[0][1] > 0 And Not $g_aDictSave[$g_aDict[0][1]] Then
		$g_aDictSave[$g_aDict[0][1]] = True
		Local $sOut
		For $i = 0 To $DCT_MAX - 1
			$sOut &= $g_aDict[$g_aDict[0][1]][$i] & @CRLF
		Next
		FileWrite($g_sFileSave, $sOut & @CRLF)
		_SetTitle()
	EndIf
EndFunc   ;==>_Event_Save

Func _Event_ShowText()
	Local $bChecked
	For $i = 0 To $DCT_MAX - 1
		Switch @GUI_CtrlId
			Case $g_aCB[$i][$CB_DUMMY], $g_aCB[$i][$CB_ID]
				$bChecked = _IsChecked($g_aCB[$i][$CB_ID])
				If @GUI_CtrlId = $g_aCB[$i][$CB_DUMMY] Then
					GUICtrlSetState($g_aCB[$i][$CB_ID], $bChecked ? $GUI_UNCHECKED : $GUI_CHECKED)
					$bChecked = Not $bChecked
				EndIf
				Return _SetData($i, $bChecked)
		EndSwitch
	Next
EndFunc   ;==>_Event_ShowText

Func _Event_ShowInput()
	$g_bShowInput = Not $g_bShowInput
	_ControlsFormat()
EndFunc   ;==>_Event_ShowInput

Func _ControlsFormat()
	Local $iY = $CONTROL_INDENT
	GUICtrlSetData($g_idMenuShowInput, $g_bShowInput ? $MENU_TEXT_HIDEINPUT : $MENU_TEXT_SHOWINPUT)
	For $i = 0 To $DCT_MAX - 1
		GUICtrlSetPos($g_aCB[$i][$CB_ID], Default, $iY)
		$iY += $CHECKBOX_HEIGHT + $CONTROL_INDENT / 2
		If $g_bShowInput And $g_aCB[$i][$CB_DEFSTATE] = $GUI_UNCHECKED Then
			GUICtrlSetPos($g_aCB[$i][$CB_INPUT], Default, $iY)
			GUICtrlSetState($g_aCB[$i][$CB_INPUT], $GUI_SHOW)
			$iY += $INPUT_HEIGHT + $CONTROL_INDENT
		Else
			GUICtrlSetState($g_aCB[$i][$CB_INPUT], $GUI_HIDE)
		EndIf
		GUICtrlSetPos($g_aCB[$i][$CB_SEP], Default, $iY)
		$iY += $CONTROL_INDENT
	Next
	$iY += $LABEL_TIP_HEIGHT + $CONTROL_INDENT
	_GUIResize($g_hGUI, Default, Default, Default, $iY)
EndFunc   ;==>_ControlsFormat

Func _Event_SetView()
	Local $idMenuMode = @GUI_CtrlId, $bChecked
	If GUICtrlRead($idMenuMode, $GUI_READ_EXTENDED) = $MENU_TEXT_MODE_SETTING Then

		Opt("GUIOnEventMode", 0)
		WinSetTitle($g_hGUI, "", $MENU_TEXT_MODE_SETTING)
		GUICtrlSetState($g_idMenuFile, $GUI_DISABLE)
		GUICtrlSetState($g_idMenuShowInput, $GUI_DISABLE)
		GUICtrlSetData($idMenuMode, $MENU_TEXT_MODE_TRAIN)
		For $i = 0 To $DCT_MAX - 1
			GUICtrlSetData($g_aCB[$i][$CB_ID], $CHECKBOX_TEXT_SETTINGS)
			GUICtrlSetState($g_aCB[$i][$CB_ID], $g_aCB[$i][$CB_DEFSTATE])
		Next

		While 1
			Switch GUIGetMsg()
				Case $GUI_EVENT_CLOSE, $idMenuMode
					ExitLoop
			EndSwitch
		WEnd

		Local $iShowed = 0
		For $i = 0 To $DCT_MAX - 1
			$bChecked = _IsChecked($g_aCB[$i][$CB_ID])
			$iShowed += $bChecked
			$g_aCB[$i][$CB_DEFSTATE] = $bChecked ? $GUI_CHECKED : $GUI_UNCHECKED
			_SetData($i, $bChecked)
		Next
		GUICtrlSetData($idMenuMode, $MENU_TEXT_MODE_SETTING)
		GUICtrlSetState($g_idMenuFile, $GUI_ENABLE)
		GUICtrlSetState($g_idMenuShowInput, ($iShowed = $DCT_MAX) ? $GUI_DISABLE : $GUI_ENABLE)
		_ControlsFormat()
		_SetTitle()
		Opt("GUIOnEventMode", 1)

	EndIf
EndFunc   ;==>_Event_SetView

Func _Event_Open()
	Local $sFile = FileOpenDialog("", "", $OPEN_FILE_FILTER, $FD_FILEMUSTEXIST, $g_sFileOpen, $g_hGUI)
	If Not @error Then
		_Open($sFile)
		_Event_Next()
	EndIf
EndFunc   ;==>_Event_Open

Func _Open($sFile)
	Local $aRegExp = StringRegExp(FileRead($sFile) & @CRLF & @CRLF, _StringRepeat("(.+?)\R", $DCT_MAX) & "\R", $STR_REGEXPARRAYGLOBALMATCH)
	If @error Then Return MsgBox($MB_ICONERROR + $MB_TOPMOST, $GUI_TITLE, StringFormat($OPEN_FILE_ERROR_FORMAT, $sFile), 0, $g_hGUI)

	Local $sDrive, $sDir, $sFName, $sExt
	$g_sFileOpen = $sFile
	_PathSplit($sFile, $sDrive, $sDir, $sFName, $sExt)
	$g_sFileSave = _PathMake($sDrive, $sDir, StringFormat($SAVE_FILE_FORMAT, $sFName), $sExt)
	;$g_sFileSave = _WinAPI_PathYetAnotherMakeUniqueName($g_sFileSave)

	Local $iCount = UBound($aRegExp), $sSaved = FileRead($g_sFileSave) & @CRLF & @CRLF, $sCheck
	Dim $g_aDict[$iCount / $DCT_MAX + 1][$DCT_MAX] = [[0, 0]]
	Dim $g_aDictSave[$iCount / $DCT_MAX + 1] = [-1]
	For $i = 0 To $iCount - 1 Step $DCT_MAX
		$g_aDict[0][0] += 1
		$sCheck = ""
		For $j = 0 To $DCT_MAX - 1
			$g_aDict[$g_aDict[0][0]][$j] = $aRegExp[$j]
			$sCheck &= $aRegExp[$i] & @CRLF
		Next
		$g_aDictSave[$g_aDict[0][0]] = StringInStr($sSaved, StringTrimRight($sCheck, StringLen(@CRLF)))
	Next
EndFunc   ;==>_Open

Func _Event_Next()
	_Next($g_aDict[0][1] + 1)
EndFunc   ;==>_Event_Next

Func _Next($iIndex)
	If $g_aDict[0][0] > 0 Then
		$g_aDict[0][1] = $iIndex
		If $g_aDict[0][1] > $g_aDict[0][0] Then $g_aDict[0][1] = 0
		For $i = 0 To $DCT_MAX - 1
			_SetData($i, $g_aCB[$i][$CB_DEFSTATE] = $GUI_CHECKED)
			GUICtrlSetState($g_aCB[$i][$CB_ID], $g_aCB[$i][$CB_DEFSTATE])
			GUICtrlSetData($g_aCB[$i][$CB_INPUT], "")
		Next
		_SetTitle()
	EndIf
EndFunc   ;==>_Next

Func _GUIResize($hGUI, $iX, $iY = Default, $iW = Default, $iH = Default)
	Local $aClientWH = WinGetClientSize($hGUI)
	If @error Then Return SetError(@error, 0, 0)
	Local $aXYWH = WinGetPos($hGUI)
	If @error Then Return SetError(@error, 0, 0)
	If $iW <> Default Then $iW += $aXYWH[2] - $aClientWH[0]
	If $iH <> Default Then $iH += $aXYWH[3] - $aClientWH[1]
	Return WinMove($hGUI, "", $iX, $iY, $iW, $iH)
EndFunc   ;==>_GUIResize

Func _OnExit()
	For $i = 0 To $DCT_MAX - 1
		IniWrite($INI_FILE, "View", $i, $g_aCB[$i][$CB_DEFSTATE])
	Next
	IniWrite($INI_FILE, "Data", "File", $g_sFileOpen)
	IniWrite($INI_FILE, "Data", "Index", $g_aDict[0][1])
	IniWrite($INI_FILE, "Data", "Input", $g_bShowInput)
EndFunc   ;==>_OnExit

Func _SetTitle()
	Local $sFormat = "%s: *%s (%i/%i)"
	If $g_aDictSave[$g_aDict[0][1]] Then $sFormat = "%s: %s (%i/%i)"
	WinSetTitle($g_hGUI, "", StringFormat($sFormat, $GUI_TITLE, _WinAPI_PathFindFileName($g_sFileOpen), $g_aDict[0][1], $g_aDict[0][0]))
EndFunc   ;==>_SetTitle

Func _SetData($iIdx, $bSet)
	GUICtrlSetData($g_aCB[$iIdx][$CB_ID], ($bSet And $g_aDict[0][1] > 0) ? $g_aDict[$g_aDict[0][1]][$iIdx] : $CHECKBOX_TEXT_DEFAULT)
EndFunc   ;==>_SetData

Func _IsChecked($idCheckBox)
	Return BitAND(GUICtrlRead($idCheckBox), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func _Event_Exit()
	Exit
EndFunc   ;==>_Event_Exit
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Благодарю за работу. Подскажите пожалуйста, с какими версиями операционных систем, кроме моей, работает и с какими версиями AutoIt?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
lemonia, я писал под 3.3.14.5
Для неё на официальном сайте указаны:
Windows XP and Windows Server 2003
Windows Vista and Windows Server 2008/2008 R2
Windows 7
Windows 8 (desktop mode)
Windows 10 (desktop mode)



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

В предыдущем сообщении исправил подбор размера окна
 
Верх