Окна редактирования снабжены многими функциями, свойственными большинству редакторов. Например, в них предусмотрены типичные комбинации «горячих» клавиш: Ctrl-C — копирование выделенного текста в буфер обмена Clipboard (команда Copy), Ctrl-X — вырезание выделенного текста в буфер Clipboard (команда Cut), Ctrl-V — вставка текста из буфера Clipboard в позицию курсора (команда Paste), Ctrl-Z — отмена последней команды редактирования.
Edit можно использовать и просто как компоненты отображения текста. Для этого надо установить в true его свойство ReadOnly и целесообразно установить AutoSelect в false. В этом случае пользователь не сможет изменять отображаемый текст, и окно редактирования становится подобным меткам. При использовании окон редактирования для вывода, ввода и редактирования чисел необходимо использовать функции взаимного преобразования строк и чисел. Для вывода это описанные при рассмотрении меток функции FloatToStr и IntToStr. При вводе это функции StrToFloat — преобразование строки в значение с плавающей запятой, и StrToInt — преобразование строки в целое значение. Если вводимый текст не соответствует числу (например, содержит недопустимые символы), то функции преобразования генерируют исключение EConvertError.
Этот код обеспечивает сообщение пользователю об ошибке ввода и предотвращает ошибочные вычисления. Впрочем, это не лучший вариант предотвратить ошибочный ввод, поскольку пользователь узнает о своей ошибке только после того, как программа пытается использовать введенные данные. Лучше, если пользователь просто не сможет ввести неправильные символы. Например, если вы хотите, чтобы пользователь мог вводить в окно редактирования Edit только цифры и символ точки, вы можете в обработчик события OnKeyPress этого компонента вставить оператор:
if not (Key in ['0'..'9', ',']) then Key := #0;
Этот оператор подменит все символы, кроме цифр и запятой, нулевым символом, который не занесется в текст окна Edit.
Внешний вид формы (Form2) в дизайнере форм. Иерархия расположения компонентов на форме приведена на рис.1.
.
Рисунок 1 - Иерархия расположения компонентов на форме
2.3 Функции
Ниже я приведу описание функций:
1) функция, ss2nn которая переводит секунды в минуты + секунды в строковом формате (необходимо для подсчета времени прошедшего с начала тестирования):
function TForm2.ss2nn(Seconds: Integer): String;
var
nMin, nSec: Integer;
begin
{Проверяем, меньше чем 1/Min}
if Seconds < 60 then Result := '0 минут ' + IntToStr(Seconds) + ' секунд'
else begin
{Определяем минуты}
nMin := Seconds div 60;
{Определяем секунды}
nSec := Seconds - (nMin * 60);
{Возвращаем результат}
Result := IntToStr(nMin) + ' минут ' + IntToStr(nSec) + ' секунд';
end;
Функции надо передать количество секунд и в результате мы получим значение типа string. Например, если мы передадим функции число 70, то получим в результате 1 минут 10 секунд.
2) процедура ShowQuestion - функция, которая загружает текст вопроса и варианты ответов, а так же показывает текст вопроса и варианты ответов на текстовых метках.
procedure TForm2.ShowQuestion;
Count, i: Integer;
if (QuestNum > QuestCount) and (QuestNum > 0) then
{ Если номер текущего вопроса больше чем должно быть показано и кол-во вопросов >0 то выполняем следующее....}
Form3 := TForm3.Create(self);//создаем форму с результатами тестирования
res := (Scores * 100) div QuestCount;// узнаем кол-во правильных ответов
Form3.Gauge1.Progress := res; // выводим правильные ответы на графике в %
Form3.Gauge2.Progress := 100-res; //выводим кол-во неправильных ответов
//сколько всего вопросов....
Form3.Label5.Caption := 'Вопросов в тесте: '+IntToStr(QuestCount);
//пишем на label кол-во правильных ответов
Form3.Label3.Caption := IntToStr(Scores);
//тоже самое, только неправильные
Form3.Label4.Caption := IntToStr(Wrong);
Timer1.Enabled:=False; //выключаем таймер времени
Form3.TimeLabel.Caption:=TimeLabel.Caption; //выводим время на label времени
Form3.ShowModal;// наконец показываем форму с результатами
Form2.close; //закрываем форму с вопросами end;
Если данное условие не выполняется, то…
Рассмотрим это фрагмент функции более подробно. Для загрузки вопросов я использовал класс TIniFile – этот класс используется для работы с ini-файлами[1]. Список вопросов и ответов хранится в специально сформированном файле Test.ini, откуда программа их загружает. Вот вырезка из файла Test.ini:
[Тест]
Количество Вопросов=15
Название теста = Проверка знаний по русскому языку
[Вопрос №1]
Текст вопроса = Вставьте проверяемые безударные гласные А или О. Укажите слова с буквой О.
Текст кнопки 1 = ХВ__ТАТЬ
Текст кнопки 2 = К__РАТЕЛЬНЫЙ
Текст кнопки 3 = НАК__ПИТЬ ДЕНЬГИ
Текст кнопки 4 = НАСЛ__ЖДАТЬСЯ
Правильный вариант = 3
...
Ниже приведена процедура загрузки вопроса и вариантов ответов:
//загружаем текст вопроса
Label1.Caption := Ini.ReadString('Вопрос №' + inttostr(QuestNum), 'Текст вопроса', 'Вопрос отсутствует');
//загружаем варианты ответов
RadioButton1.Caption := Ini.ReadString('Вопрос №' + inttostr(QuestNum), 'Текст кнопки 1', 'ERROR');
RadioButton2.Caption := Ini.ReadString('Вопрос №' + inttostr(QuestNum), 'Текст кнопки 2', 'ERROR');
RadioButton3.Caption := Ini.ReadString('Вопрос №' + inttostr(QuestNum), 'Текст кнопки 3', 'ERROR');
RadioButton4.Caption := Ini.ReadString('Вопрос №' + inttostr(QuestNum), 'Текст кнопки 4', 'ERROR');
{Процедура загрузки завершена}
В данной функции метод ReadString класса TIniFile собственно и производит загрузку начальных значений меток (label) с вопросом и вариантами ответов.
3 Процедуры
1) Процедура – обработчик события нажатия на кнопку «Начать тест»(Button1):
procedure TForm2.Button1Click(Sender: TObject);
Count:=0;
Timer1.Enabled:=True;
Label10.Visible:=True;
TimeLabel.Visible:=True;
BitBtn1.Visible := true;
Panel3.Visible := true;
Button1.Visible := false;
Label9.Visible:=True;
BitBtn1.OnClick(self);
Во время выполнения этой процедуры происходит показ всех нужных для правильной работы программы компонентов, запуск таймера, а также скрытие самой кнопки «Начать тест».
2) процедура – обработчик события нажатия на кнопку «Ответить»(Button):
procedure TForm2.BitBtn1Click(Sender: TObject);
Answer, CA: Integer;
Answer := Ini.ReadInteger('Вопрос №' + inttostr(QuestNum), 'Правильный вариант', -1);
if Answer < 0 then Exception.Create('В файле с вопросами не написан правильный вариант');
ca := 0;
if RadioButton1.Checked then
Ca := 1;
if RadioButton2.Checked then
Ca := 2;
if RadioButton3.Checked then
Ca := 3;
if RadioButton4.Checked then
Ca := 4;
if Ca = Answer then
inc(Scores)
else
inc(Wrong);
inc(QuestNum);
Label6.Caption := 'Номер вопроса: ' + IntToStr(QuestNum);
Label8.Caption := 'Правильных ответов: ' + IntToStr(Scores);
Label7.Caption := 'Неправильных ответов: ' + IntToStr(Wrong);
ShowQuestion;
Читаем Правильный ответ из рабочего ini файла программы:
Собственно определяем правильный ответ или нет
Страницы: 1, 2, 3, 4