Что нового

[Окна, Диалоги] Программа для тестирования уровня знаний

untento

Новичок
Сообщения
7
Репутация
0
Версия AutoIt: 3.3.6.1
Описание:
Помогите сотворить программу для тестирования знаний по учебной дисциплине. Загвоздка в том, что я не знаю как реализовать это все в одном окне, то есть имеется ввиду изменение содержимого окна при нажатии на кнопку продолжения.
Примечание:
Вот набросал примерный вид этого приложения (см. вложение)
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
untento сказал(а):
как реализовать это все в одном окне
После нажатия кнопки "далее", можно заносить ответы в массив, а реализование все в 1 окне это скрывать элементы(занести тоже в массив и циклом скрывать), если только будут label и radio то просто текст их занести в массив и от туда при нажатии кнопки "далее" переустанавливать текст
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
http://autoit-script.ru/index.php/topic,4687.msg33786.html#msg33786
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Например 2 начальных этапа у окна
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$GUI = GUICreate("Тест", 486, 218)
$Text = GUICtrlCreateLabel("Программа для тестирования уровня знаний", 88, 0, 292, 49, $SS_CENTER)
$Radio1 = GUICtrlCreateRadio("", 0, 72, 113, 17)
$Radio2 = GUICtrlCreateRadio("", 0, 96, 113, 17)
$Radio3 = GUICtrlCreateRadio("", 0, 120, 200, 17)
Global $aCtrl[3]=[$Radio1,$Radio2,$Radio3],$aText[3]=["4","8","Не знаю и не хочу знать"]
For $i=0 To 2
	__CH($aCtrl[$i])
Next
$Step = GUICtrlCreateButton("Начать тест", 376, 184, 91, 25)
$Exit = GUICtrlCreateButton("Выйти из теста", 256, 184, 107, 25)
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Step
			GUICtrlSetData($Text,"Сколько у котика лапок")
			GUICtrlSetData($Step,"Далее")
			For $i=0 To 2
				GUICtrlSetData($aCtrl[$i],$aText[$i])
				__CS($aCtrl[$i])
			Next
		Case $GUI_EVENT_CLOSE,$Exit
			Exit
	EndSwitch
WEnd
Func __CH($ctrl)
	GUICtrlSetState($ctrl,$gui_hide)
EndFunc
Func __CS($ctrl)
	GUICtrlSetState($ctrl,$gui_show)
EndFunc
 
Автор
U

untento

Новичок
Сообщения
7
Репутация
0
MnM а как на 3 этапе сделать так чтоб при выборе первого варианта на 2 этапе, появилось сообщение о правильности или не правильности ответа. То есть если я выбрал 4 лапки (второй этап), нажимаю далее (перехожу на 3 этап, то есть последний этап) который сообщает что всего у меня 1 правильный ответ.
OffTopic:
Вопрос в тесте на знания порадовал :smile:
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
если тестинг чуть продолжить страничками то:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$GUI = GUICreate("Тест", 486, 218)
$Text = GUICtrlCreateLabel("Программа для тестирования уровня знаний", 88, 0, 292, 49, $SS_CENTER)
$Radio1 = GUICtrlCreateRadio("", 0, 72, 113, 17)
$Radio2 = GUICtrlCreateRadio("", 0, 96, 113, 17)
$Radio3 = GUICtrlCreateRadio("", 0, 120, 200, 17)
Global $aCtrl[3]=[$Radio1,$Radio2,$Radio3],$aText[2][3]=[["4","8","Не знаю и не хочу знать"],["Все","Ничего","А зачем нам это?"]],$ii=1
For $i=0 To 2
	__CH($aCtrl[$i])
Next
$Step = GUICtrlCreateButton("Начать тест", 376, 184, 91, 25)
$Exit = GUICtrlCreateButton("Выйти из теста", 256, 184, 107, 25)
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Step
			If $ii=2 Then ;Кол-во этих блоков условий будет = кол-во вопросов(страничек)
				If BitAND(GUICtrlRead($Radio1),$gui_checked) Then
					MsgBox(0,'',"Вы ответили правильно")
				Else
					MsgBox(16,'',"Не правильно")
				EndIf
			ElseIf $ii=4 Then
				If BitAND(GUICtrlRead($Radio2),$gui_checked) Then
					MsgBox(0,'',"Вы ответили правильно")
				Else
					MsgBox(16,'',"Не правильно")
				EndIf
			ElseIf $ii=3 Then
				GUICtrlSetData($Text,"Что мы знаем")
				For $i=0 To 2
					GUICtrlSetData($aCtrl[$i],$aText[1][$i])
				Next
				For $i=0 To 2
					GUICtrlSetState($aCtrl[$i],$gui_unchecked)
				Next
			ElseIf $ii=1 Then
				GUICtrlSetData($Text,"Сколько у котика лапок")
				GUICtrlSetData($Step,"Далее")
				For $i=0 To 2
					GUICtrlSetData($aCtrl[$i],$aText[0][$i])
					__CS($aCtrl[$i])
				Next
			EndIf
			$ii+=1
		Case $GUI_EVENT_CLOSE,$Exit
			Exit
	EndSwitch
WEnd
Func __CH($ctrl)
	GUICtrlSetState($ctrl,$gui_hide)
EndFunc
Func __CS($ctrl)
	GUICtrlSetState($ctrl,$gui_show)
EndFunc



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

cnm сказал(а):
Помогите мне сделать через жопу
Не к месту вовсе.
cnm сказал(а):
Зачем вам нужна еще одна, сделнная(Пропускаете буквы!) на кривом языке, вашими кривыми руками?
А может человек хочет научится этому языку, и почему кривыми? Желаете "побазарить" создавайте темку в общении и там привязку к этой теме, и раздувайтесь сколько влезет. Хамить тоже не надо
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
cnm сказал(а):
Создать массив ответов будет проще.
Да если проверка на правильность ответов будет только в конце теста, я просто предложил проверку поэтапно сразу после ответа.
OffTopic:
cnm
Очень ваш ник мне напоминает свой :shok:

cnm сказал(а):
Тогда надо задавать вопросы разделе новичкам, а не в стол заказов.
Изначально там она и была
 

cnm

Новичок
Сообщения
58
Репутация
2
Да если проверка на правильность ответов будет только в конце теста, я просто предложил проверку поэтапно сразу после ответа.

я предполагал тоже поэтапно сделать - сверять ответ прямо в теле цикла и увеличивать кол-во правильных ответов.

Но идея о том, чтобы знаосить полученные ответы в массив и провести сверку в конце - хороша.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
cnm сказал(а):
Но идея о том, чтобы знаосить полученные ответы в массив и провести сверку в конце - хороша.
Ну так в основном программы тестинга на той же идее и основываются=)
 
Автор
U

untento

Новичок
Сообщения
7
Репутация
0
Чтобы внести ясность в ситуацию расскажу зачем мне нужна такая программа. В общем это задание по учёбе так сказать и оно заключается в создании своего проекта с поэтапным рассказом процесса создания. Я решил сделать программу тестирования, а так как я не профессиональный программист, но немного знаком с AutoIt и мне нравится этот язык по причине его относительной простоты для меня, то я решил что это задание можно реализовать с его помощью + это еще и дополнительные знания для дальнейшего моего развития и понимания этого языка. Так что уважаемый cnm вы явно поспешили с выводами.
 
Автор
U

untento

Новичок
Сообщения
7
Репутация
0
OffTopic:
Универ, дисциплина "Интеллектуальная собственность", задание "Создание своего интеллектуального продукта", причем в группе не должно быть похожих проектов. Программный продукт в моей группе никто создать не сможет, т.к. уровень их знаний о компьютере сводиться к тому что "внутри живут маленькие человечки которые показывают картинки на мониторе". Вот я и выбрал создание простенькой программы по тестированию по этой дисциплине.


CreatoR, MnM Спасибо за советы, внимание и базу для программы :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Вот набросал начало. Надо сделать отдельный шифровщик и использовать виртуальный INI, а то сейчас ответы можно вытащить из INI-файла.

Код:
#include <StaticConstants.au3>
#include <Array.au3>

$ini = StringTrimRight(@ScriptFullPath, 3) & 'ini'
If Not FileExists($ini) Then
	$hFile = FileOpen($ini, 2)
	FileWrite($hFile, _
			'[1]' & @CRLF & _
			'0 = 3.Какой цвет запрещающий' & @CRLF & _
			'1 = Зелёный' & @CRLF & _
			'2 = Жёлтый' & @CRLF & _
			'3 = Красный' & @CRLF & @CRLF & _
			'[2]' & @CRLF & _
			'0 = 3.Диаметр Сатурна' & @CRLF & _
			'1 = 12 000 км' & @CRLF & _
			'2 = 30 000 км' & @CRLF & _
			'3 = 60 000 км')
	FileClose($hFile)
EndIf

$ainiSection = IniReadSectionNames($Ini)

$iStep = 0 ; Счётсик шагов, чтобы завершить, когда достигнута последняя секция ini-файла
$iCountAnswer = 0 ; Счётчик результата, количество правильных ответов
$sCurAnswer = 0 ; Правильный ответ, чтобы сравнивать

$hGui = GUICreate('Program', 610, 220)
$iQuestion = GUICtrlCreateLabel('Программа для тестирования уровня знаний', 0, 25, 610, 22, $SS_CENTER)
Local $aID[2] = [1, 1] ; идентификаторы радиокнопок

$iBtnNext = GUICtrlCreateButton('Начать тест', 477, 176, 108, 28)
; $iStatusBar = GUICtrlCreateLabel('StatusBar', 5, 260 - 20, 150, 17)
GUISetState()
While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case -3
			Exit
		Case $iBtnNext
			If $aID[1] = -3 Then Exit
			_NextGUI()
		Case $aID[1] To $aID[$aID[0]]
			$j = $iMsg - $aID[1] + 1 ; Номер текущего выбора
			; MsgBox(0, 'Check', $j, 0, $hGui)
			If $j == $sCurAnswer Then
				$iCountAnswer += 1
				; MsgBox(0, 'Сообщение', 'Верно')
			EndIf
	EndSwitch
WEnd

Func _NextGUI()
	; _ArrayDisplay($ainiSection, 'ainiSection') ; Проверяем корректность массива имён секций
	$iStep += 1
	If $iStep = 1 Then GUICtrlSetData($iBtnNext, 'Далее') ; Изменение кнопки в начале опроса
	For $i = 1 To $aID[0]
		GUICtrlDelete($aID[$i]) ; Цикл удаление предыдущих элементов
	Next
	; MsgBox(0, 'Сообщение', $ainiSection[$iStep])
	If $iStep > $ainiSection[0] Then ; Достигнут конец имён секций, собственно самих вопросов
		Dim $aID[2] = [1, -3]
		GUICtrlSetData($iBtnNext, 'Выход') ; Изменение кнопки в конце опроса
		GUICtrlSetData($iQuestion, 'Результат, правильных ответов: ' & $iCountAnswer) ; Изменение вопроса
		Return
	EndIf
	$aSectionQuestion = IniReadSection($ini, $ainiSection[$iStep]) ; Запрос вопросов из секции
	ReDim $aID[$aSectionQuestion[0][0]]
	$aID[0] = $aSectionQuestion[0][0] - 1
	; _ArrayDisplay($aSectionQuestion, 'aSectionQuestion') ; Проверяем корректность массива вопросов
	$tmp = StringRegExp($aSectionQuestion[1][1], '(\d+?)\.(.*)', 1)
	If @error Then
		Dim $aID[2] = [1, 1]
		GUICtrlSetData($iQuestion, 'Внутренняя ошибка') ; Изменение вопроса
		Return
	EndIf
	$sCurAnswer = $tmp[0]
	GUICtrlSetData($iQuestion, 'Вопрос ' & $iStep & ': ' & $tmp[1]) ; Изменение вопроса
	$y = 29
	For $i = 2 To $aSectionQuestion[0][0]
		$y += 27
		$aID[$i - 1] = GUICtrlCreateRadio($aSectionQuestion[$i][1], 13, $y, 590, 22) ; Наполняем вопросами GUI
	Next
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
MnM
Учи астрономию, я знаю диаметры всех планет. С точки зрения программы количество правильных ответов будет меньше чем ты бы хотел.
12000 это диаметр Земли (округлённо). Известно что Сатурн второй после Юпитера по размеру. Юпитер в 11 раз больше Земли по диаметру. Естественно диаметр Сатурна не может быть 12000 и скорее всего больше чем 30000, потому что есть ещё Нептун и Уран (хотя это офтопик).
 
Автор
U

untento

Новичок
Сообщения
7
Репутация
0
AZJIO Отлично, большое спасибо, это то что надо!
P.S. обойдусь и без шифровщика, сомневаюсь что препод или еще кто то додумается стащить ответы из INI.
Благодарю за помощь :thanks:

P.S. Тоже не угадал диаметр Сатурна ;D
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
untento
Я поправил скрипт, блок выхода (-3) перенёс в начало, чтобы выход работал после завершения теста.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Почистил тему от флуда.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
untento сказал(а):
внутри живут маленькие человечки которые показывают картинки на мониторе
OffTopic:
Да у нас в группе почти так же, некоторые не знают зачем они вообще поступили на этот курс :D
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Мой вариант:

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

;[0...N][0] = Question
;[0...N][1] = Options (| delimited)
;[0...N][2] = Correct answer (1-based index in the Options list)
Global $aQstns_Data[4][3] = _
	[ _
		['Укажите неверное решение', '1 + 2 * 2 = 6|5 * 8 - 2 = 38|2 * 2 = 4|17 - 8 * 2 = 1', 1], _
		['Сколько раз в сумме 22 содержится число 2?', '3|4|5|1', 3], _
		['Представьте что вы водитель попавшего в аварию автомобиля, как по вашему мнению, звали водителя?', 'Вася|' & @UserName & '|Петя|Жора', 2], _
		['Монета 99 раз упала орлом, какова вероятность того, что она ещё раз упадёт также?', 'Большая|Малая|50 на 50|70 на 30 в пользу орла', 3] _
	]

Global $iTotal_Qstns = UBound($aQstns_Data)
Global $iTotal_Qstn_Opts = _Get_Total_QstnOpts()
Global $iCrrnt_Qstn = 0

Global $aQstn_Steps[$iTotal_Qstns][$iTotal_Qstn_Opts]

Global $iGUI_W = 600
Global $iGUI_H = 300

$hMain_GUI = GUICreate('Тест знаний!', $iGUI_W, $iGUI_H, -1, -1, $WS_POPUPWINDOW)

$iStart_Lbl = GUICtrlCreateLabel('Программа для тестирования уровня знаний', 10, 20, $iGUI_W - 20, 40, $SS_CENTER)
GUICtrlSetFont(-1, 12, 800)

$iBack_Bttn = GUICtrlCreateButton('Назад', $iGUI_W - 200, $iGUI_H - 30, 70, 20)
GUICtrlSetState(-1, $GUI_HIDE)
$iNext_Bttn = GUICtrlCreateButton('Начать тест', $iGUI_W - 100, $iGUI_H - 30, 80, 20)

_Set_Qstns_Steps()
_Set_Qstns_States()

GUISetState(@SW_SHOW, $hMain_GUI)

While 1
	$iMsg = GUIGetMsg()
	
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iNext_Bttn
			If $iCrrnt_Qstn > $iTotal_Qstns Then
				Exit
			EndIf
			
			If $iCrrnt_Qstn > 0 Then
				$iNext = 0
				
				For $i = 0 To $iTotal_Qstn_Opts - 1
					If GUICtrlRead($aQstn_Steps[$iCrrnt_Qstn - 1][$i]) = $GUI_CHECKED Then
						$iNext = 1
						ExitLoop
					EndIf
				Next
				
				If Not $iNext Then
					MsgBox(48, 'Внимание', 'Следует ответить на вопрос!', 0, $hMain_GUI)
					ContinueLoop
				EndIf
			EndIf
			
			$iCrrnt_Qstn += 1
			_Set_Qstns_States()
			
			If $iCrrnt_Qstn > $iTotal_Qstns Then
				$aAnswers = _Get_Qstns_Answers()
				$iGood_Answrs = @extended
				
				GUICtrlSetData($iStart_Lbl, 'Правильных ответов: [' & $iGood_Answrs & '] из [' & $iTotal_Qstns & ']')
				GUICtrlSetData($iNext_Bttn, 'Выход')
				GUICtrlSetState($iBack_Bttn, $GUI_HIDE)
				
				$iTop = 60
				
				For $i = 0 To UBound($aAnswers) - 1
					GUICtrlCreateLabel($aAnswers[$i][0] & ': ' & $aAnswers[$i][1], 20, $iTop, -1, 18)
					
					If $aAnswers[$i][2] = 1 Then
						GUICtrlSetColor(-1, 0x008000)
						GUICtrlSetFont(-1, 8, 400)
					Else
						GUICtrlSetColor(-1, 0xFF0000)
						GUICtrlSetFont(-1, 8, 800)
					EndIf
					
					$iTop += 20
				Next
			Else
				GUICtrlSetData($iStart_Lbl, $aQstns_Data[$iCrrnt_Qstn - 1][0])
				GUICtrlSetData($iNext_Bttn, 'Далее')
				GUICtrlSetState($iBack_Bttn, $GUI_SHOW)
			EndIf
		Case $iBack_Bttn
			$iCrrnt_Qstn -= 1
			_Set_Qstns_States()
			
			If $iCrrnt_Qstn < 1 Then
				GUICtrlSetData($iStart_Lbl, 'Программа для тестирования уровня знаний')
				GUICtrlSetData($iNext_Bttn, 'Начать тест')
				GUICtrlSetState($iBack_Bttn, $GUI_HIDE)
			Else
				GUICtrlSetData($iStart_Lbl, $aQstns_Data[$iCrrnt_Qstn - 1][0])
			EndIf
	EndSwitch
WEnd

Func _Get_Total_QstnOpts()
	Local $aSplit, $iTotal = 0
	
	For $i = 0 To $iTotal_Qstns - 1
		$aSplit = StringSplit($aQstns_Data[$i][1], '|')
		
		If $aSplit[0] > $iTotal Then
			$iTotal = $aSplit[0]
		EndIf
	Next
	
	Return $iTotal
EndFunc

Func _Get_Qstns_Answers()
	Local $aAnswers[$iTotal_Qstns][3]
	Local $iSubIndx, $iAnswrID, $iGood_Answrs
	
	For $i = 0 To $iTotal_Qstns - 1
		$iSubIndx = $aQstns_Data[$i][2] - 1
		
		If $iSubIndx >= $iTotal_Qstn_Opts Or $iSubIndx < 0 Then
			ContinueLoop
		EndIf
		
		$iAnswrID = $aQstn_Steps[$i][$iSubIndx]
		
		$aAnswers[$i][0] = $aQstns_Data[$i][0]
		$aAnswers[$i][1] = GUICtrlRead($iAnswrID, 1)
		$aAnswers[$i][2] = Int(GUICtrlRead($iAnswrID) = $GUI_CHECKED)
		
		$iGood_Answrs += $aAnswers[$i][2]
	Next
	
	Return SetExtended($iGood_Answrs, $aAnswers)
EndFunc

Func _Set_Qstns_Steps()
	Local $aSplit, $iTop
	
	For $i = 0 To $iTotal_Qstns - 1
		$aSplit = StringSplit($aQstns_Data[$i][1], '|')
		
		$iTop = ($iGUI_H / 2) - 40
		
		For $j = 0 To $iTotal_Qstn_Opts - 1
			If $j + 1 > $aSplit[0] Then
				ContinueLoop
			EndIf
			
			GUICtrlCreateLabel($j + 1 & ')', 20, $iTop + 2, -1, 20)
			GUICtrlSetFont(-1, 9, 600)
			$aQstn_Steps[$i][$j] = GUICtrlCreateRadio($aSplit[$j + 1], 40, $iTop, -1, 20)
			$iTop += 25
		Next
	Next
EndFunc

Func _Set_Qstns_States()
	Local $iState
	
	For $i = 0 To $iTotal_Qstns - 1
		$iState = $GUI_HIDE
		
		If $iCrrnt_Qstn = $i + 1 Then
			$iState = $GUI_SHOW
		EndIf
		
		For $j = 0 To $iTotal_Qstn_Opts - 1
			GUICtrlSetState($aQstn_Steps[$i][$j] - 1, $iState)
			GUICtrlSetState($aQstn_Steps[$i][$j], $iState)
		Next
	Next
EndFunc


По сути все данные хранятся в массиве $aQstns_Data, где первая (нулевая) колонка ячейки это вопрос, вторая это разделённые (через |) опции вопроса, и третья это собственно ответ (индекс в списке опции - вторая колонка ячейки).
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Новая версия.
1. Добавлена кнопка "Назад", но при переходе к результатам кнопка "Назад" не доступна, чтобы не подбирать ответы. При использовании кнопки "Назад" ответы сохраняются от ранее сделанного выбора.
2. Теперь ответы сохраняются с помощью формулы, то есть не зная её нельзя определить номер правильного ответа в ini-файле.
3. Добавлен режим шифрования ответов, то есть после написания ini-файла запускаем программу с любым параметром ком-строки, начинаем тест, делаем выбор правильного ответа и на вопросе вызываем конт.меню и кликнуть пункт, при этом номер ответа шифруется и сохраняется в ini-файл. Режим редактирования работает ТОЛЬКО при запуске через ком-строку.
4. Добавлены ещё проверки на ошибки не соответствия ini-файла необходимому формату.
5. Удалено выравнивание по центру, изменена структура размещения информации.

Обновлено 3 раза.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <Array.au3>

$ini = StringTrimRight(@ScriptFullPath, 3) & 'ini'
If Not FileExists($ini) Then
	$hFile = FileOpen($ini, 2)
	FileWrite($hFile, _
			'[1]' & @CRLF & _
			'0 = 840.Какой цвет запрещающий' & @CRLF & _
			'1 = Зелёный' & @CRLF & _
			'2 = Жёлтый' & @CRLF & _
			'3 = Красный' & @CRLF & @CRLF & _
			'[2]' & @CRLF & _
			'0 = 5210.Диаметр Сатурна' & @CRLF & _
			'1 = 12 000 км' & @CRLF & _
			'2 = 30 000 км' & @CRLF & _
			'3 = 60 000 км')
	FileClose($hFile)
EndIf

$ainiSection = IniReadSectionNames($ini)
If @error Then Exit MsgBox(0, 'Сообщение', 'ini-файл пустой')

$iStep = 0 ; Счётсик шагов, чтобы завершить, когда достигнута последняя секция ini-файла
Local $aiCountAnswer[$ainiSection[0] + 1][2] = [[0]] ; Счётчик результата, количество правильных ответов
$sCurAnswer = 0 ; Правильный ответ, чтобы сравнивать

; Максимальное число ответов по шифрованию 10, по размеру GUI - 9
$hGui = GUICreate('Программа для тестирования уровня знаний', 610, 320) ; идентификаторы GUI начинаются с 3
GUISetFont(11)
$iQuestion = GUICtrlCreateLabel('', 5, 5, 600, 66) ; стили центрирования $SS_CENTER + $SS_CENTERIMAGE
; GUICtrlSetBkColor(-1, 0xfdffae)
$iHorz = GUICtrlCreateLabel('-', 5, 71, 600, 0, $SS_ETCHEDHORZ) ; горизонтальная линия
GUICtrlSetState(-1, $GUI_HIDE)

If $CmdLine[0] Then ; Если передан параметр ком-строки, то включаем рещим редактирования
	$iMenu = GUICtrlCreateContextMenu($iQuestion)
	$iRnd = GUICtrlCreateMenuItem('Сохранить выбранный ответ', $iMenu)
Else ; Иначе создаём пустышку
	$iRnd = GUICtrlCreateDummy()
EndIf

Local $aID[1] = [0] ; идентификаторы радиокнопок
$ID_Start = 0 ; Комбинация ID при которых Switch -> Case не сработает
$ID_End = -1

$iBtnNext = GUICtrlCreateButton('Начать тест', 477, 276, 108, 28)
$iBtnBack = GUICtrlCreateButton('Назад', 367, 276, 108, 28)
GUICtrlSetState(-1, $GUI_HIDE)
; $iStatusBar = GUICtrlCreateLabel('StatusBar', 5, 260 - 20, 150, 17)
GUISetState()
While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case -3
			Exit
		Case $iRnd
			; $iRndAns = InputBox(' ', ' ', '', '', 170, 150)
			; If Not @error And StringIsDigit($iRndAns) Then
				; If StringLen($iRndAns) = 1 Then
					; ClipPut((Random(1, 99, 1) & $iRndAns) * 19 + 23)
				; Else
					; ClipPut($iRndAns * 19 + 23)
				; EndIf
			; EndIf
			; Ввод правильного ответа
			For $i = 1 To $aID[0]
				If GUICtrlRead($aID[$i]) = $GUI_CHECKED Then
					$j = $aID[$i] - $aID[1] + 1 ; Номер текущего выбора
					$tmp = IniRead($ini, $ainiSection[$iStep], '0', 'Ошибка') ; Запрос ответа
					$tmp = StringRegExp($tmp, '^\d+?\.(.*)$', 1)
					If @error Then
						MsgBox(0, 'ошибка', 'ошибка')
						ContinueLoop
					EndIf
					IniWrite($ini, $ainiSection[$iStep], '0', (Random(1, 99, 1) & $j) * 19 + 23 & '.' & $tmp[0])
					ExitLoop
				EndIf
			Next
		Case $iBtnNext
			If $ID_End = -3 Then Exit
			_StepGUI()
			; Если ответ содержит ID, то отмечаем выбор
			If $ID_End <> -3 And $aiCountAnswer[$iStep][1] Then GUICtrlSetState($aiCountAnswer[$iStep][1], $GUI_CHECKED)
		Case $iBtnBack
			_StepGUI(0)
			; Если ответ содержит ID, то отмечаем выбор
			If $ID_End <> -1 And $aiCountAnswer[$iStep][1] Then GUICtrlSetState($aiCountAnswer[$iStep][1], $GUI_CHECKED)
		Case $ID_Start To $ID_End
			$j = $iMsg - $ID_Start + 1 ; Номер текущего выбора
			; MsgBox(0, 'Check', $j, 0, $hGui)
			$aiCountAnswer[$iStep][1] = $iMsg ; Сохраняем ID, чтобы при возврате автоматом выставлять выбор
			If $j == StringRight(($sCurAnswer - 23) / 19, 1) Then ; номер ответа * 19 + 23, например для 3 будет 43 * 19 + 23 = 840
				$aiCountAnswer[$iStep][0] = 1 ; 'Верно
			Else
				$aiCountAnswer[$iStep][0] = 0 ; Не верно
			EndIf
	EndSwitch
WEnd

Func _StepGUI($iNext = 1)
	If $iNext Then
		$iStep += 1
	Else
		$iStep -= 1
	EndIf
	For $i = 1 To $aID[0]
		GUICtrlDelete($aID[$i]) ; Цикл удаление предыдущих элементов
	Next
	If $iStep = 1 Then
		GUICtrlSetData($iBtnNext, 'Далее') ; Изменение кнопки в начале опроса
		GUICtrlSetState($iBtnBack, $GUI_SHOW) ; Показывает кнопку "Назад"
		GUICtrlSetState($iHorz, $GUI_SHOW) ; Показывает линию
	EndIf
	If $iStep <= 0 Then ; Если номер окна равен 0 или меньше то сброс
		Dim $aID[1] = [0]
		$ID_Start = 0 ; Комбинация ID при которых Switch -> Case не сработает
		$ID_End = -1
		GUICtrlSetData($iBtnNext, 'Начать тест') ; Изменение кнопки при возврате в начало
		GUICtrlSetState($iBtnBack, $GUI_HIDE) ; Скрывает кнопку "Назад"
		GUICtrlSetData($iQuestion, '') ; Вступительный текст при возврате в начало
		WinSetTitle($hGui, '', 'Программа для тестирования уровня знаний')
		GUICtrlSetState($iHorz, $GUI_HIDE) ; Скрывает линию
		Return
	EndIf
	If $iStep > $ainiSection[0] Then ; Достигнут конец имён секций, собственно самих вопросов
		Dim $aID[1] = [0]
		$ID_Start = 0 ; Комбинация ID при которых Switch -> Case не сработает
		$ID_End = -3
		GUICtrlSetData($iBtnNext, 'Выход') ; Изменение кнопки в конце опроса
		GUICtrlSetState($iBtnBack, $GUI_HIDE)
		Local $iCountAnswer = 0
		For $i = 1 To UBound($aiCountAnswer) - 1
			$iCountAnswer += $aiCountAnswer[$i][0]
		Next
		GUICtrlSetData($iQuestion, 'Правильных ответов: ' & $iCountAnswer & ' из ' & $ainiSection[0]) ; Изменение вопроса
		WinSetTitle($hGui, '', 'Результат')
		GUICtrlSetState($iHorz, $GUI_HIDE) ; Скрывает линию
		Return
	EndIf
	WinSetTitle($hGui, '', 'Вопрос ' & $iStep & ' из ' & $ainiSection[0]) ; Дублировать в заголовке
	$aSectionQuestion = IniReadSection($ini, $ainiSection[$iStep]) ; Запрос вопросов из секции
	If @error Or $aSectionQuestion[0][0] < 2 Then Return ; выход если число параметров меньше минимального
	Dim $aID[$aSectionQuestion[0][0]] = [$aSectionQuestion[0][0] - 1] ; Пересоздание массива идентификаторов по числу вопросов
	$tmp = StringRegExp($aSectionQuestion[1][1], '(\d+?)\.(.*)', 1) ; Парсинг вопроса и ответа
	If @error Then ; Ошибка формата строки вопроса и ответа
		Dim $aID[1] = [0]
		$ID_Start = 0 ; Комбинация ID при которых Switch -> Case не сработает
		$ID_End = -2
		GUICtrlSetData($iQuestion, 'Внутренняя ошибка') ; Изменение вопроса на предупреждение
		Return
	EndIf
	$sCurAnswer = $tmp[0]
	GUICtrlSetData($iQuestion,  $tmp[1]) ; Изменение вопроса
	$y = 50
	For $i = 2 To $aSectionQuestion[0][0]
		$y += 22
		$aID[$i - 1] = GUICtrlCreateRadio($aSectionQuestion[$i][1], 13, $y, 590, 22) ; Наполняем вопросами GUI
	Next
	$ID_Start = $aID[1] ; Комбинация ID при которых Switch -> Case срабатывает на указанное колическтво вопросов
	$ID_End = $aID[$aID[0]]
EndFunc   ;==>_StepGUI
 
Верх