Что нового

[Файловая система] Работа с текстом в поле Edit

Dmitriy Klim

Новичок
Сообщения
2
Репутация
0
Здравствуйте.
Столкнулся с такой проблемой. Я хочу написать программу, которая проводит тестирование, получая вопросы из ТХТ файла. Структура файла такая:

Вопрос 1
Текст вопроса.
Вариант А
Вариант Б
Вариант С
Ответ А

Вопрос 2
Текст вопроса.
Вариант А
Вариант Б
Вариант С
Ответ С
Мне необходимо, чтоб в поле Edit выводился вопрос. С остальным проблем нет. Как описать поиск определенного фрагмента текста и вывод его в поле? Потом поиск второго фрагмента и вывод его и так далее.
То, что уже написано - во вложении.
Спасибо.
 

Вложения

  • gui_v0.au3
    1.5 КБ · Просмотры: 7

AngrySpoon

Новичок
Сообщения
15
Репутация
0
Не претендую на единственно верный путь, но как вариант:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <File.au3>


$Form1_1 = GUICreate("Form1", 625, 442, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 8, 80, 609, 241)
GUICtrlSetData(-1, "Edit1")
$Exit = GUICtrlCreateButton("Exit", 184, 360, 75, 25, $WS_GROUP)
$Next = GUICtrlCreateButton("Next", 360, 360, 75, 25, $WS_GROUP)

$Checkbox1 = GUICtrlCreateCheckbox("Answer A", 16, 336, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Answer B", 16, 360, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox("Answer C", 16, 384, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox("Answer D", 16, 408, 97, 17)

GUISetState(@SW_SHOW)

$userdata="Questions.txt"
$questions=FileOpen($userdata)
;Текущая позиция в файле
$questionpos=1
;Число строк в файле
$qcount=_FileCountLines($userdata)
;Проверка корректности заполнения файла
if  mod($qcount,7) <> 0 Then
   MsgBox(0,'Error','Некорректно заполнен файл вопросов.')
EndIf

;Чтение вопроса
func ReadQuestion()
   ;Заполнение массива данными из файла
   ;$tmp[0]- вопрос
   ;$tmp[1]..$tmp[4] - варианты ответа
   ;$tmp[5] - ответ
   dim $tmp[6]
   for $i=0 to 5
	  $tmp[$i]=FileReadLine($userdata,$questionpos)
	  $questionpos+=1
   Next
   $questionpos+=1

;~    _ArrayDisplay($tmp)
   GUICtrlSetData($Edit1, $tmp[0])
   GUICtrlSetData($Checkbox1, $tmp[1])
   GUICtrlSetData($Checkbox2, $tmp[2])
   GUICtrlSetData($Checkbox3, $tmp[3])
   GUICtrlSetData($Checkbox4, $tmp[4])

   ;Отключение кнопки по достижению конца файла
   if $questionpos>=$qcount Then
	  GUICtrlSetState($Next,$GUI_DISABLE )
   EndIf

EndFunc



ReadQuestion()
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $exit
			Exit

		Case $Next
		   ReadQuestion()
	EndSwitch
WEnd
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Как описать поиск определенного фрагмента текста
Код:
StringInStr ( "Строка", "Искомый фрагмент текста"  )
Как по мне - корректнее было-бы выполнить поиск строки с текстом "Вопрос" и далее выводить следующую строку в поле. Чуть исправил:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <File.au3>


$Form1_1 = GUICreate("Form1", 625, 442, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 8, 80, 609, 241)
GUICtrlSetData(-1, "Edit1")
$Exit = GUICtrlCreateButton("Exit", 184, 360, 75, 25, $WS_GROUP)
$Next = GUICtrlCreateButton("Next", 360, 360, 75, 25, $WS_GROUP)

$Checkbox1 = GUICtrlCreateCheckbox("Answer A", 16, 336, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Answer B", 16, 360, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox("Answer C", 16, 384, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox("Answer D", 16, 408, 97, 17)

GUISetState(@SW_SHOW)

$userdata="Questions.txt"

;Текущая позиция в файле
$questionpos=0


func ReadQuestion()
   ;Заполнение массива данными из файла

     $tmp=FileReadToArray($userdata)



	For $i=$questionpos to UBound($tmp)-1
; Здесь только одно условие - сам текст вопроса не должен содержать слово "Вопрос" с заглавной буквы
	 If StringInStr($tmp[$i],'Вопрос',1) > 0 Then

	   GUICtrlSetData($Edit1, $tmp[$i+1])
       GUICtrlSetData($Checkbox1, $tmp[$i+2])
       GUICtrlSetData($Checkbox2, $tmp[$i+3])
       GUICtrlSetData($Checkbox3, $tmp[$i+4])
       GUICtrlSetData($Checkbox4, $tmp[$i+5]);Если это ответ, как в примере из поста №1, то его вряд-ли стоит светить :)
	   $questionpos=$i+7
	   ExitLoop
     EndIf

	Next

   ;Отключение кнопки по достижению конца файла
   if $questionpos>=UBound($tmp) Then
      GUICtrlSetState($Next,$GUI_DISABLE )
   EndIf

EndFunc



ReadQuestion()
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $exit
            Exit

        Case $Next
           ReadQuestion()
    EndSwitch
WEnd

Если количество вариантов ответов может меняться, то можно в цикл добавить поиск строки "Ответ"
и создавать CheckBox-ы по количеству вариантов. Так-же, если среди вариантов ответов только одна строка с правильным ответом , то лучше использовать
Код:
GUICtrlCreateRadio
во избежание выбора одновременно всех (или больше одного) вариантов ответа.
 

AngrySpoon

Новичок
Сообщения
15
Репутация
0
ra4o,
Как я уже сказал, не претендую на верность своего решения, но есть несколько моментов:

Код:
$tmp=FileReadToArray($userdata)

а если файл будет размером в несколько Гб? Весь файл прочитать в память?
Мне кажется, что построчное чтение несколько оптимальнее :smile:

Код:
For $i=$questionpos to UBound($tmp)-1
; Здесь только одно условие - сам текст вопроса не должен содержать слово "Вопрос" с заглавной буквы
     If StringInStr($tmp[$i],'Вопрос',1) > 0 Then

       GUICtrlSetData($Edit1, $tmp[$i+1])
       GUICtrlSetData($Checkbox1, $tmp[$i+2])
       GUICtrlSetData($Checkbox2, $tmp[$i+3])
       GUICtrlSetData($Checkbox3, $tmp[$i+4])
       GUICtrlSetData($Checkbox4, $tmp[$i+5]);Если это ответ, как в примере из поста №1, то его вряд-ли стоит светить :)
       $questionpos=$i+7
       ExitLoop
     EndIf


Да, с точки зрения унификации - согласен, получается чуть больше свободы в формировании файла вопросов.
Однако выход из For по ExitLoop, мне кажется, несколько неоправданно в данном случае...

и по поводу $tmp[$i+5] - ТС как пример структуры привел три строки с вариантами, а на форму бросил четыре чекбокса, соответственно ответ не светится, а лежит в последнем элементе массива) Проверку ответа оставим на совести ТС))
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
В несколько ГБ текстовый файл ? это туда можно запихнуть "Большую Советскую энциклопедию" :smile: Хотя, в данном случае скорость обработки значения не имеет, и Вы правы- можно и построчно, я тоже не гуру просто предложил свой вариант. А чем плох выход из цикла по
Код:
ExitLoop
?
 

AngrySpoon

Новичок
Сообщения
15
Репутация
0
Не спорю, ExitLoop в Вашем варианте справляется с поставленной задачей, но как-то привычнее его видеть либо в бесконечных циклах, либо как выход по ошибке...
Опять же, как вопрос был сформулирован - такие решения и предоставили, если уж действительно делать приложение для тестирования, то подход имхо должен быть в корне другой))
 
Автор
Dmitriy Klim

Dmitriy Klim

Новичок
Сообщения
2
Репутация
0
Всем спасибо ОГРОМНОЕ за ответы. Сегодня - завтра попробую все варианты. =)))
 
Верх