Лекции ясп
Горбунов В.М.
Среда визуальной разработки delphi Информационная система «Учебник-тест»
1 лекция
Компьютерный тест
Протоколы переноса данных
для текстового формата хранения заданий
1. Простой протокол заданий
Текст задания
Вариант1
Вариант2
Вариант3 ~
Вариант4
(пустая строка открывает и закрывает задание)
2. Нумерационный протокол заданий
{Открывающий тег}
<
{Строки задания}
Deske[N,1]:='Текст задания';
Deske[N,2]:='Продолжение текста задания ';
Deske[N,3]:='Продолжение текста задания ';
Deske[N,4]:='Продолжение текста задания ';
Deske[N,5]:='Продолжение текста задания ';
{Варианты}
Deske[N,6]:='1 вариант ответа';
Deske[N,7]:='Продолжение';
Deske[N,8]:='2 вариант ответа ';
Deske[N,9]:='Продолжение';
Deske[N,10]:='3 вариант ответа';
Deske[N,11]:='Продолжение';
Deske[N,12]:='4 вариант ответа';
Deske[N,13]:='Продолжение';
Deske[N,14]:='5 вариант ответа';
Deske[N,15]:='Продолжение';
Deske[N,16]:='6 вариант ответа';
Deske[N,17]:='Продолжение';
Deske[N,18]:='7 вариант ответа';
Deske[N,19]:='Продолжение';
Deske[N,20]:='8 вариант ответа';
Deske[N,21]:='Продолжение';
Deske[N,22]:='Указание к выбору вариантов или примечание '; 14
Deske[N,23]:='Номер ключа #1-8'; Пример: #15
// По умолчанию текстовый ответ (регистр не учит.).
// Дополнительный тип задания: & - соответствие. < - сортировка.
{Служебные для текущего задания}
Deske[N,24]:='Вес правильного ответа';
Deske[N,25]:='Номер фактора'; // *
Deske[N,26]:='Комментарий к неправильному ответу';
Deske[N,27]:='Имя файла';
// Путь к рисунку: Mesto:=GetCurrentDir;
Ris:= Mesto+ '\'; (+ ‘Picture\’+ Deske[N,27]);
Deske[N,28]:='Параметры теста'; {Обучение, нет перемешивания, нет автоподстройки}
// 000 111
// Обучение
{Служебные для всего теста}
Deske[N,29]:='Параметры диагностики';
Deske[N,30]:='Имя файла диагностики';
//*'Путь к файлу диагностики'
Deske[N,31]:='Тема теста';
Deske[N,32]:='Авторизация';
>
// Закрывающий тег
// Протокол ответов* сохраняется в файле
Структура:
Общая начальная часть
Фамилия
Название теста
Дата тестирования
Время тестирования: Старт
Строки заданий
1 строка задания
Строки правильных ответов с номерами
Текст (номер) ответа испытуемого
Общая завершающая часть
Число заданий
Число правильно выполненных заданий
Время тестирования: Финиш
Фамилия
Структурный протокол
(не используется в проектах)
Пример хранения заданий в текстовом файле
<
31 И Н Ф О Р М А Т И К А
1 Задание
2 Сколько различных сочетаний нулей и единиц для кодовой таблицы символов
3 и команд можно получить с помощью одного байта (8 бит)?
4
5
6 8 сочетаний.
7
8 1024 сочетания.
9
10 2 сочетания [0;1].
11
12 256 сочетаний.
13
14
15 #4
>
<
31 И Н Ф О Р М А Т И К А
1 Какая частота обновления экрана монитора на электронно-лучевой трубке считается оптимальной?
2
3
4
5
6 50-60 Гц.
7
8 5-7 Гц.
9
10 85-100 Гц.
11
12 336 МГц
13
14
15 #3
>
Шифрование данных
Объектный файл
инструментальной системы тестирования
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;
type
{Объявляем тип массива}
TArray=array[0..100,0..32] of string;
Объявление переменных
public
{ Public declarations }
{Объявляем массив}
Deske: TArray;
{Файловая переменная}
Fap: TextFile;
{Строка передачи}
Stroka: String[250];
{Ключи ответов}
SelKey1: String;
SelKey2: String;
SelKey3: String;
…………
SelKey8: String;
TotaKey: String;
AutoKey: String;
// Индексы массива
InderX: integer;
InderY: integer;
// Управление переносом файл-массив
Signal,Stroka2,Lin: string;
Koder,Dlin,Uprav: integer;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Титульный лист окна тестирования
procedure TForm1.FormActivate(Sender: TObject);
// OnActivate Form 1
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('Инструментальная система тестирования');
Memo2.Lines.Clear;
Memo2.Lines.Add('Перемешивание заданий и ответов');
Memo2.Lines.Add(' ');
Memo2.Lines.Add('Стандартизация баллов');
Memo2.Lines.Add(' ');
Memo2.Lines.Add('Контроль и обучение');
Memo2.Lines.Add(' ');
Memo2.Lines.Add('Комментарий к неправильному ответу');
Memo2.Lines.Add(' ');
Memo2.Lines.Add('Адаптация заданий');
Memo2.Lines.Add(' ');
CheckBox1.SetFocus;
end;
Загрузка тестовых заданий из файла
procedure TForm1.Read1Click(Sender: TObject);
// Read Menu
begin
Koder:=0;
Dlin:=0;
Uprav:=1;
InderY:=0;
//OpenDialog1
If OpenDialog1.Execute then
begin
{Устанавливаем связь с файлом для переноса в массив}
AssignFile(Fap,OpenDialog1.FileName);
{Режим чтения из файла}
Reset(Fap);
//1
If Pos('.txt',OpenDialog1.FileName)>0 then
Begin
InderY:=0;
Signal:='Тег';
//1 слой - поиск открывающего тега
//2
While not Eof(Fap) do begin
{Присваиваем элементам массива строки из файла}
Readln (Fap,Stroka);
// ShowMessage('Открыл 1 слой'+chr(13)+Stroka);
If Stroka='<' then
Begin
Signal:='<';
InderY:=InderY+1;
End;
//2 слой - Перенос в текущую строку массива
While Signal='<' do begin
Readln (Fap,Stroka);
//ShowMessage('Открыл 2 слой '+chr(13)+Stroka);
If Stroka='>' then Signal:='Тег закрыт';
Dlin:=Length(Stroka);
Stroka2:=Copy(Stroka,1,3);
{Преобразуем в управляющее число}
Val(Stroka2,Uprav,Koder);
{Вырезаем текстовую часть}
Stroka2:=Copy(Stroka,4,Dlin-3);
// ShowMessage('Управляющее число '+IntToStr(Uprav));
// ShowMessage(IntToStr(InderY)+'='+Stroka2);
Case Uprav of
1: Deske[InderY,1]:=Stroka2;
2: Deske[InderY,2]:=Stroka2;
3: Deske[InderY,3]:=Stroka2;
4: Deske[InderY,4]:=Stroka2;
5: Deske[InderY,5]:=Stroka2;
6: Deske[InderY,6]:=Stroka2;
7: Deske[InderY,7]:=Stroka2;
8: Deske[InderY,8]:=Stroka2;
9: Deske[InderY,9]:=Stroka2;
10: Deske[InderY,10]:=Stroka2;
11: Deske[InderY,11]:=Stroka2;
12: Deske[InderY,12]:=Stroka2;
13: Deske[InderY,13]:=Stroka2;
14: Deske[InderY,14]:=Stroka2;
15: Deske[InderY,15]:=Stroka2;
16: Deske[InderY,16]:=Stroka2;
17: Deske[InderY,17]:=Stroka2;
18: Deske[InderY,18]:=Stroka2;
19: Deske[InderY,19]:=Stroka2;
20: Deske[InderY,20]:=Stroka2;
21: Deske[InderY,21]:=Stroka2;
22: Deske[InderY,22]:=Stroka2;
23: Deske[InderY,23]:=Stroka2;
24: Deske[InderY,24]:=Stroka2;
25: Deske[InderY,25]:=Stroka2;
26: Deske[InderY,26]:=Stroka2;
27: Deske[InderY,27]:=Stroka2;
28: Deske[InderY,28]:=Stroka2;
29: Deske[InderY,29]:=Stroka2;
30: Deske[InderY,30]:=Stroka2;
31: Deske[InderY,31]:=Stroka2;
32: Deske[InderY,32]:=Stroka2;
end;
end;
end;
end
else
Begin
ShowMessage(' Открывать можно'+chr(13)+'только текстовый файл!');
end;
{Закрываем файл}
CloseFile (Fap);
end;
InderY:=1;
// Read Menu
end;
Переключение заданий
procedure TForm1.Button4Click(Sender: TObject);
// NEXT Button
Var
NextX: integer;
begin
// ShowMessage('Номер задания (строки) '+IntToStr(InderY));
// ShowMessage('Индикатор NEXT '+Deske[InderY,6]);
//ShowMessage(IntToStr(InderY)+' '+IntToStr(NextX)+' '+Deske[InderY,NextX]);
// Если есть 1 вариант ответа
If Length(Deske[InderY,6])>0 then
Begin
//Подготовка
Edit1.Text:='';
Memo1.Lines.Clear;
Memo2.Lines.Clear;
NextX:=1;
CheckBox1.Checked:=False;
CheckBox2.Checked:=False;
CheckBox3.Checked:=False;
CheckBox4.Checked:=False;
CheckBox5.Checked:=False;
//Если есть Тема
If Length(Deske[InderY,31])>0 then Edit1.Text:=Deske[InderY,31];
// While Signal='<' do begin
{Текст задания}
For NextX:=1 to 5 do begin
{Lin:=Deske[IndekX,IndekY];}
Memo1.Lines.Add(Deske[InderY,NextX]);
end;
{Текст вариантов ответов}
For NextX:=6 to 21 do begin
{Lin:=Deske[IndekX,IndekY];}
If Length(Deske[InderY,NextX])>0 then Memo2.Lines.Add(Deske[InderY,NextX]);
end;
{Текст указаний}
Memo2.Lines.Add(' ');
Memo2.Lines.Add(Deske[InderY,22]);
//Запомним ключ
AutoKey:=Deske[InderY,23];
Memo2.Lines.Add('Отладочный показ ключей '+Deske[InderY,23]);
CheckBox1.SetFocus;
{Счетчик}
InderY:=InderY+1;
End
else
begin
ShowMessage('Заданий нет!')
end;
end;
Переключение заданий с перемешиванием
procedure TForm1.Button4Click(Sender: TObject);
// NEXT Button NEXT BUTTON NEXT BUTTON NEXT BUTTON
Var
NextX,Balsu,KeyVar: integer;
MAX1D,MAX2D: real;
begin
// 0 If Nagal // and (Vhod>0)
If Nagal>0 then begin
// Не нажал для следующего
Nagal:=0;
// 1 Если первая проверка Не проверялось Perv=0 и Не выполнялось Soob='Не проверялось!'
If Perv=0 then
Begin
Perv:=1;
TotaKey:=SelKey1+SelKey2+SelKey3+SelKey4+SelKey5;
// 2 Если есть предыдущий ответ
If (Length(TotaKey)>0) and (Length(AutoKey)>0) then
Begin
// ShowMessage('Ответ('+TotaKey+') Ключ('+AutoKey+')');
// Удаление пробелов из ключа
While AutoKey[1]=' ' do delete(AutoKey,1,1);
While AutoKey[Length(AutoKey)]=' ' do
delete(AutoKey,Length(AutoKey),1);
// 3 Первая проверка
If TotaKey=AutoKey then
Begin
Bals:=Bals+1;
Soob:='Зачтено!';
Memo3.Lines.Add('+'+IntToStr(IndezY-1)+'.'+' '+'K: '+' '+AutoKey+' '+'Y: '+' '+TotaKey+' '+'Ball'+' '+IntToStr(Bals));
end
else
Begin
Soob:='Незачтено!';
Memo3.Lines.Add('-'+IntToStr(IndezY-1)+'.'+' '+'K:'+' '+AutoKey+' '+'Y:'+' '+TotaKey+' '+'Ball:'+' '+IntToStr(Bals));
// 3
End;
//2
End;
// 1
End;
// Раздача заданий InderY из Roz(IndezY,1) - счетчик заданий
// получение номера строки массива
InderY:=Roz[IndezY,1];
// Возможность проверять следующее задание
Perv:=0;
// 1* Если есть 1 вариант ответа
If Length(Deske[InderY,6])>0 then
// If InderY<6 then
Begin
//Осуществлен вход в тест
Vhod:=1;
// Номер задания
Label2.Caption:=IntToStr(IndezY)+'.';
//Подготовка
Memo1.Lines.Clear;
Memo2.Lines.Clear;
// Memo3.Lines.Clear; Не очищается, а наследуется.
CheckBox1.Checked:=False;
CheckBox2.Checked:=False;
CheckBox3.Checked:=False;
CheckBox4.Checked:=False;
CheckBox5.Checked:=False;
//Если есть Тема, не очищается, а наследуется.
If Length(Deske[InderY,31])>0 then Edit1.Text:=Deske[InderY,31];
// Вызов рисунка или ЛОГО
If Length(Deske[InderY,27])>0 then
Image1.Picture.LoadFromFile(Mesto+Deske[InderY,27]) else
Image1.Picture.LoadFromFile(Mesto+'_LOGO.bmp');;
2 10 06
{Текст задания}
For NextX:=1 to 5 do begin
Memo1.Lines.Add(Deske[InderY,NextX]);
end;
//Запомним ключ для следующего задания
AutoKey:=Deske[InderY,23];
// По умолчанию ключ правильного ответа: 1-8.
// Дополнительный тип задания: & - соответствие. < - сортировка.
For NextX:=1 to 5 do begin
Rov[NextX,0]:=0;
end; // For
If Length(AutoKey)>0 then begin
// Memo3.Lines.Add(AutoKey);
For NextX:=1 to Length(AutoKey) do begin
// Запомним ключ в таблице
Koder:=StrToInt( AutoKey[NextX] );
Rov[Koder,0]:=Koder;
// Memo3.Lines.Add('N='+IntToStr(NextX) +' key '+IntToStr(Rov[Koder,0]));
end; // For
End;// If
// U1:= TimeToStr(DateTime);
randomize;
MAX1D:=Random(1000)/1000;
// MAX1D:=Random(5);
// Раздача номеров вариантов IndevY:=Rov[IndevY,1];
For NextX:=1 to 5 do begin
// Формирование случайных чисел
MAX2D:=(11*MAX1D+pi)-int((11*MAX1D+pi));
MAX1D:=MAX2D;
// Memo3.Lines.Add('R='+FloatToStr(MAX1D));
Rov[NextX,2]:=trunc(MAX1D*100000000);
// Закрепление порядкового номера
Rov[NextX,1]:=NextX;
// Memo3.Lines.Add('R='+IntToStr(Rov[NextX,2])+' N='+IntToStr(NextX));
end;
// Сортировка вариантов ответов
// Формирование случайных чисел Rov[NextX,2]:=Random(100);
// Закрепление порядкового номера Rov[NextX,1]:=NextX;
Balsu:=0;
While Balsu=0 do begin
Uprav:=0;
For NextX:=2 to 5 do begin
// Memo3.Lines.Add( IntToStr(NextX)+'if='+ IntToStr( Rov[NextX,2] ) +'>' + IntToStr( Rov[NextX-1,2] ) );
If Rov[NextX,2]>Rov[NextX-1,2] then
begin
// Случай обмена, хотя бы 1
Uprav:=Rov[NextX-1,0];
Rov[NextX-1,0]:=Rov[NextX,0];
Rov[NextX,0]:=Uprav;
Uprav:=Rov[NextX-1,1];
Rov[NextX-1,1]:=Rov[NextX,1];
Rov[NextX,1]:=Uprav;
Uprav:=Rov[NextX-1,2];
//Memo3.Lines.Add('Uprav=Rov[NextX-1,2] '+IntToStr(Uprav));
Rov[NextX-1,2]:=Rov[NextX,2];
//Memo3.Lines.Add('Rov[NextX-1,2]:=Rov[NextX,2] '+IntToStr(Rov[NextX-1,2]));
Rov[NextX,2]:=Uprav;
//Memo3.Lines.Add('Rov[NextX,2]:=Uprav '+IntToStr(Rov[NextX,2]));
Uprav:=1;
end; //If
// Memo3.Lines.Add( IntToStr(NextX)+') '+ IntToStr( Rov[NextX,1] )+' * '+ IntToStr( Rov[NextX,2] ) );
End; //For
// ShowMessage('Если Uprav=0 не было обмена, то выход. Uprav='+IntToStr(Uprav));
If Uprav=0 then Balsu:=1;
// Balsu:=0;
// Memo3.Lines.Add('Если Balsu=1 то Выход. Balsu='+IntToStr(Balsu));
End; // While
// End Сортировка Roz
// Сборка нового ключа
AutoKey:='';
For NextX:=1 to 5 do begin
IF Rov[NextX,0]>0 then AutoKey:=AutoKey+IntToStr(NextX);
// Memo3.Lines.Add('N='+IntToStr(NextX) +' key '+IntToStr(Rov[Koder,0]));
end; // For
// Memo3.Lines.Add('New Key = '+ AutoKey );
// View
// For NextX:=1 to 5 do begin
// Memo3.Lines.Add('Key= '+IntToStr(Rov[NextX,0])+'S='+IntToStr(Rov[NextX,1])+' '+IntToStr(Rov[NextX,2]));
// Memo3.Lines.Add('Key= '+IntToStr(Rov[NextX,0])+' S='+IntToStr(Rov[NextX,1]) );
// end;
// Memo3.Lines.Add(' ');
{Текст вариантов ответов}
For NextX:=1 to 5 do begin
// получение номера строки массива
KeyVar:=Rov[NextX,1];
// Memo3.Lines.Add(IntToStr(NextX)+'получил '+IntToStr(KeyVar)+' K='+FloatToStr(Rov[NextX,0]));
// В Rov перегон правильного варианта
// End;
{Текст вариантов ответов}
Case KeyVar of
1:
begin
If Length(Deske[InderY,6])>0 then Memo2.Lines.Add(Deske[InderY,6]) else Memo2.Lines.Add(' ');
If Length(Deske[InderY,7])>0 then Memo2.Lines.Add(Deske[InderY,7]) else Memo2.Lines.Add(' ');
End;
2:
Begin
If Length(Deske[InderY,8])>0 then Memo2.Lines.Add(Deske[InderY,8]) else Memo2.Lines.Add(' ');
If Length(Deske[InderY,9])>0 then Memo2.Lines.Add(Deske[InderY,9]) else Memo2.Lines.Add(' ');
End;
3:
Begin
If Length(Deske[InderY,10])>0 then Memo2.Lines.Add(Deske[InderY,10]) else Memo2.Lines.Add(' ');
If Length(Deske[InderY,11])>0 then Memo2.Lines.Add(Deske[InderY,11]) else Memo2.Lines.Add(' ');
End;
4:
Begin
If Length(Deske[InderY,12])>0 then Memo2.Lines.Add(Deske[InderY,12]) else Memo2.Lines.Add(' ');
If Length(Deske[InderY,13])>0 then Memo2.Lines.Add(Deske[InderY,13]) else Memo2.Lines.Add(' ');
End;
5:
Begin
If Length(Deske[InderY,14])>0 then Memo2.Lines.Add(Deske[InderY,14]) else Memo2.Lines.Add(' ');
If Length(Deske[InderY,15])>0 then Memo2.Lines.Add(Deske[InderY,15]) else Memo2.Lines.Add(' ');
End;
End; // Case
end;
{Текст вариантов ответов}
// For NextX:=6 to 21 do begin
{Lin:=Deske[IndekX,IndekY];}
// If Length(Deske[InderY,NextX])>0 then Memo2.Lines.Add(Deske[InderY,NextX]);
// end;
{Текст указаний}
Memo2.Lines.Add(' ');
Memo2.Lines.Add(Deske[InderY,22]);
//Запомним ключ для следующего задания
// AutoKey:=Deske[InderY,23];
// Memo2.Lines.Add('Отладочный показ ключей '+Deske[InderY,23]);
CheckBox1.SetFocus;
{Счетчик заданий}
// InderY:=InderY+1;
IndezY:=IndezY+1;
End
// Не пустое задание
else
begin
// Тест завершен Ваш результат
IndezY:=IndezY-1;
If IndezY<1 then IndezY:=1;
// Memo3.Lines.Add(IntToStr(InderY)+' var '+Deske[InderY,6]);
Image1.Picture.LoadFromFile(Mesto+'_LOGO.bmp');
Procent:=Int(Bals/IndezY*10000)/100;
Memo3.Lines.Add(' ');
Memo3.Lines.Add('Всего заданий '+IntToStr(IndezY));
Memo3.Lines.Add('Выполнено '+IntToStr(Bals));
Memo3.Lines.Add('Процент '+FloatToStr(Procent));
//ShowMessage('Всего заданий '+IntToStr(IndezY) +chr(13)+'Выполнено '+IntToStr(Bals)+chr(13)+'Процент '+FloatToStr(Procent));
Stops:=1;
Perv:=0;
Nagal:=0;
Vhod:=0;
TotaKey:='';
AutoKey:='';
end;
End
else
Begin
//Осуществлен вход в тест Vhod:=1;
If Vhod>0 then begin
Nagal:=0;
ShowMessage('Не тормози!'+ chr(13)+'Выбери ответ.');
end
else
begin
ShowMessage('Не открыли тест:'+ chr(13)+'Test, Read.');
end;
// 0 End If Nagal
end;
end;
Процедуры обработки нажатия CheckBox
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
//If CheckBox1.Checked=True then SelKey1:='1' else SelKey1:='';
If SelKey1='1' then SelKey1:='' else SelKey1:='1';
// ShowMessage(SelKey1);
end;
Проверка заданий
procedure TForm1.Button3Click(Sender: TObject);
//Проверка Ver
begin
TotaKey:=SelKey1+SelKey2+SelKey3+SelKey4+SelKey5;
ShowMessage('Ответ('+TotaKey+') Ключ('+AutoKey+')');
// Удаление пробелов из ключа
While AutoKey[1]=' ' do delete(AutoKey,1,1);
While AutoKey[Length(AutoKey)]=' ' do delete(AutoKey,Length(AutoKey),1);
If TotaKey=AutoKey then
ShowMessage('Зачтено')
else
ShowMessage('Незачтено');
end;
Работа с текстовыми файлами
(типизированные и нетипизированные)
procedure TForm1.Button1Click(Sender: TObject);
//Button START
Var
NextY: integer;
//0 begin
begin
// Read Menu
Koder:=0;
Dlin:=0;
Uprav:=1;
InderY:=0;
// Oткрываем файл для записи данных
FiNam:='Result.txt';
AssignFile(Fip,FiNam);
{Режим перезаписи в файл Rewrite(Fip);}
{Режим добавлять}
Append (Fip);
//Signal='Начнем'
Signal:='nt.txt';
// 1 Проверка наличия сигнального файла
// While FileExists(Signal) do begin
Repeat
//Memo1.Lines.Add('Сигнальный файл в наличии');
// 2 Ищем файл-журналы станций для чтения
For NextY:=1 to 16 do begin
// Формирование имени файла для этого поиска
FilNam:='W'+IntToStr(NextY)+'.TXT';
//Memo1.Lines.Add('Проверочное имя '+FilNam);
//3 Проверка существования файла
If FileExists(FilNam) then
Begin
Memo1.Lines.Add('Нашли и открыли журнал '+FilNam);
{Окрываем файлом для переноса в массив}
AssignFile(Fap,FilNam);
{Режим чтения из файла}
Reset(Fap);
//4
While not Eof(Fap) do begin
{Присваиваем элементам массива строки из файла}
Readln (Fap,Stroka);
// InderY:=InderY+1;
Dlin:=Length(Stroka);
If Dlin>250 then Stroka2:=Copy(Stroka,1,250)
else Stroka2:=Stroka;
// Показываем
Memo1.Lines.Add(Stroka2);
// Записываем в файл Result
Writeln (Fip,Stroka2);
//4 While not Eof
end;
Memo1.Lines.Add('Закрыли журнал'+FilNam);
// Закрываем читаемый файл
CloseFile(Fap);
Memo1.Lines.Add('Уничтожаем журнал');
// Уничтожаем читаемый файл
DeleteFile(FilNam);
Memo1.Lines.Add('End If FileExists');
// 3 If FileExists существует файл для чтения
end;
// 2 FOR 1..16 ищем файл для чтения
end;
// 1 End While Signal:='Начнем';
// end;
Until FileExists(Signal)
{Закрываем записываемый файл}
CloseFile (Fip);
Memo1.Lines.Add('End Begin START');
//End Begin START
end;