Консультация № 168372
27.05.2009, 10:44
0.00 руб.
27.05.2009, 11:04
0 2 0
Добрый день, уважаемые эксперты! Вынужден опять обратиться к вам, проблема такая: программа работает нормально, никаких сбоев, но вот после ее закрытия (закрытия главной формы) появляется ошибка
Project Diplom.exe raised exception class EInvalidPointer with message 'Invalid pointer operation' Process stopped. Use Step or Run to continue.
Выручайте (Как видите по имени проекта задача важная и уже срочная )
И еще, раз уже тут: есть две таблички в Access, в одной список фамилий, в другой результат работы программы и тд(не суть важно) На экран выводится вторая таблица с еще одним созданным в Делфи полем, которое заполняется списком фамилий, взятых из первой таблицы. Как организовать фильтр по фамилии, желательно через ComboBox (ведь все фамилии есть в отдельной таблице)?

Обсуждение

давно
Мастер-Эксперт
425
4118
27.05.2009, 13:59
общий
Ключевым в этом предложении является 'Invalid pointer operation', т.е. при закрытии программы Вы производите неправильную операцию с указателем. Смотрите код, без кода конкретную подсказку по ошибке сделать невозможно.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
29.05.2009, 14:30
общий
Код:
unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls, ImgList, Menus,
ExtCtrls;

type
TForm1 = class(TForm)
XMLDocument1: TXMLDocument;
OpenDialog1: TOpenDialog;
MainMenu1: TMainMenu;
ImageList1: TImageList;
N1: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
Edit1: TEdit;
Timer1: TTimer;
Edit2: TEdit;
N2: TMenuItem;
N3: TMenuItem;
N7: TMenuItem;

procedure N6Click(Sender: TObject);
procedure OpenClick(Sender: TObject);
function Tokenize(Str: WideString; Delimiter: string): TStringList;
procedure IdType (Vetv: IXMLNode; num: integer; var typeid,kusok:integer);
Procedure TrFa (vopr:IXMLNode);
procedure Match(vopr:IXMLNode);
procedure Multichoice(vopr:IXMLNode);
procedure Multichoice2(vopr:IXMLNode);
Procedure Sort;
procedure finish;
procedure NumTest(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N7Click(Sender: TObject);


private
{ Private declarations }

Procedure ButtonTrFaClick(Sender: TObject);
Procedure ButtonMatchClick(Sender: TObject);
Procedure ButtonMultichoiceClick(Sender: TObject);
Procedure ButtonMultichoice2Click(Sender: TObject);
Procedure ButtonExitOncLick(Sender: TObject);
Procedure PropuskTrFaClick(Sender: TObject);
Procedure PropuskMatchClick(Sender: TObject);
procedure PropuskMultichoiceClick(Sender: TObject);
procedure PropuskMultichoice2Click(Sender: TObject);
public
IDUser:Integer;
{ Public declarations }
end;


Const
// Параметры кнопки Далее
Cap='Далее';
He=33;
Le=520;
Top1=416;
Wi=73;
En=false;
top2=50;
var
Form1: TForm1;
bufer:integer;
RB: Array of TRadioButton;
cb: array of TCheckBox;
m:TMemo;
B:TButton;
prop:TButton;
quest:IXMLNode;
Bal:Integer;
mar: array of TMemo;
combox: array of TComboBox;
nad:TLabel;
GetDirNames : TStringList;
Kolichestvovoprosov:Integer;
otvety: array of Integer;
finito:Boolean;
nadTime:TLabel;
min, sec:Integer;
fin:integer;
quest2:IXMLNode;
NadItog: array of TLabel;
Nazvanie:WideString;
nadpis1,nadpis2:TLabel;
implementation

uses Open, DBModule, Unit2, Result, Vybor, Group, Vybor2;

{$R *.dfm}
// Функция разбивае строки на подстроки по заданному разделителю (номера вопросов)
function TForm1.Tokenize(Str: WideString; Delimiter: string): TStringList;
var
tmpStrList: TStringList;
tmpString, tmpVal: WideString;
DelimPos: LongInt;
begin
tmpStrList := TStringList.Create;
TmpString := Str;
DelimPos := 1;
while DelimPos > 0 do
begin
DelimPos := LastDelimiter(Delimiter, TmpString);
tmpVal := Copy(TmpString, DelimPos + 1, Length(TmpString));
if tmpVal <> '' then
tmpStrList.Add(UpperCase(tmpVal));
Delete(TmpString, DelimPos, Length(TmpString));
end;
Tokenize := tmpStrList;
end;



procedure TForm1.IdType (Vetv: IXMLNode; num: integer; var typeid,kusok:integer);
Var
i,j:Integer;
id:Integer;
tmp: IXMLNode;
begin
tmp:=vetv;
Id:=num;
j:=tmp.ChildNodes.Count-1;

For i:=0 to j do
begin
If tmp.ChildNodes[i].ChildNodes['ID'].Text =inttostr(id)then
begin
kusok:=i;
If tmp.ChildNodes.Nodes[i].ChildNodes['QTYPE'].Text ='truefalse' {верно-неврно} then typeid:=1;
If tmp.ChildNodes.Nodes[i].ChildNodes['QTYPE'].Text = 'match' { на соответствие } then typeid:=2;
If tmp.ChildNodes.Nodes[i].ChildNodes['QTYPE'].Text ='multichoice' { множественный выбор } then typeid:=3;

end;

end;
end;






Procedure TForm1.TrFa (vopr:IXMLNode);

Var

tmp2:IXMLNode;
begin
tmp2:=vopr;
// Создаем окно MEMO
m:=TMemo.Create(nil);
m.Top:=top2;
m.Height:=241;
m.Left:=24;
m.Width:=537;
m.WordWrap:=True;
m.Parent:=Form1;
m.Text:=tmp2.ChildNodes['QUESTIONTEXT'].Text;

// Создаем кнопки RadioButton

SetLength(rb,length(rb)+2);
RB[0]:=TRadioButton.Create(nil);
RB[1]:=TRadioButton.Create(nil);

Rb[0].Caption:='Верно';
Rb[0].Height:=17;
Rb[0].Left:=600;
Rb[0].Top:=104;
Rb[0].Width:=113;
Rb[1].Caption:='Неверно';
Rb[1].Height:=17;
Rb[1].Left:=600;
Rb[1].Top:=144;
Rb[1].Width:=113;
RB[0].Name:='RadBut1';
RB[1].Name:='RadBut2';
Rb[0].Parent:=Form1;
RB[1].Parent:=Form1;

TButton(B).OnClick:=ButtonTrFaClick;
TButton(prop).OnClick:=PropuskTrFaClick;

end;




Procedure TForm1.PropuskTrFaClick(Sender: TObject);
Begin
Edit1.Text:='eeee';
m.Free;
RB[0].Free;
RB[1].Free;
SetLength(rb,0);
If finito=true then finish else Sort;
End;


Procedure TForm1.ButtonTrFaClick(Sender: TObject);
var
verno, buf, i:Integer;
Id:WideString;
Begin
buf:=3;
verno:=9999;
// Запоминаем правельный ответ

Id:=quest.ChildNodes['TRUEFALSE'].ChildNodes['TRUEANSWER'].Text;

For i:=0 to 1 do
If quest.ChildNodes['ANSWERS'].ChildNodes[i].ChildNodes['ID'].Text= Id then
verno:=StrToInt(quest.ChildNodes['ANSWERS'].ChildNodes[i].ChildNodes['FRACTION'].Text);




If RB[0].Checked then buf :=1;
If RB[1].Checked then buf :=0;

If buf = 3 then ShowMessage('Выбирите ответ');


If buf <> 3 then
Begin
m.Free;
RB[0].Free;
RB[1].Free;
SetLength(rb,0);
fin:=fin+1;
If buf=verno then
Begin
Otvety[bufer]:=1;
End
else Otvety[bufer]:=2;
If fin = Kolichestvovoprosov then finish else sort;
End;
end;


procedure TForm1.Match(vopr:IXMLNode);
Var
kolvopr, i, j, dlina:Integer;
maxdlin : Integer;

Begin
// Узнаем кол-во вопросов
kolvopr:=vopr.ChildNodes['MATCHS'].ChildNodes.Count;



For i:=0 to kolvopr-1 do
begin
// Рисуем TMemo
SetLength(mar,length(mar)+1);
mar[i]:=TMemo.Create(nil);
mar[i].Height:=40;
mar[i].Left:=8;
mar[i].Top:=top2+60*i;
mar[i].Width:=345;
mar[i].Parent:=Form1;
// Пишем вопросы
mar[i].Text:=vopr.ChildNodes['MATCHS'].ChildNodes[i].ChildNodes['QUESTIONTEXT'].Text;
// Рисуем ComboBox
SetLength(combox,length(combox)+1);
combox[i]:=TComboBox.Create(nil);
combox[i].Height:=21;
combox[i].Left:=370;
combox[i].Top:=top2+8+60*i;
combox[i].Width:=363;
combox[i].Style:=csDropDownList;
combox[i].Parent:=Form1;
For j:=0 to kolvopr-1 do
Begin
// смотрим длину ответов
dlina:=length(vopr.ChildNodes['MATCHS'].ChildNodes[j].ChildNodes['ANSWERTEXT'].Text);
If maxdlin < dlina then maxdlin:=dlina;
// заносим ответы
combox[i].Items.Add(vopr.ChildNodes['MATCHS'].ChildNodes[j].ChildNodes['ANSWERTEXT'].Text);

End;
// выставляем длину окна списка
combox[i].Width:=10*maxdlin;
End;
If combox[kolvopr-1].Top > 366 then b.Top:=combox[kolvopr-1].Top+50;
If combox[kolvopr-1].Top > 366 then prop.Top:=combox[kolvopr-1].Top+50;
TButton(B).OnClick:=ButtonMatchClick;
TButton(prop).OnClick:=PropuskMatchClick;
If maxdlin < 30 then
For i:=0 to kolvopr-1 do
combox[i].Width:=150;

End;

Procedure TForm1.PropuskMatchClick(Sender: TObject);
Var
bufvopr,i:integer;
Begin
Edit1.Text:='rrrrrrr';
bufvopr:=quest.ChildNodes['MATCHS'].ChildNodes.Count;
for i:=0 to bufvopr-1 do
begin
combox[i].Free;
mar[i].Free;
end;
SetLength(combox,0);
SetLength(mar,0);
prop.Top:=Top1;
b.Top:=Top1;
If finito=true then finish else Sort;
End;




Procedure TForm1.ButtonMatchClick(Sender: TObject);
Var
i, bufotv,bufvopr,j,buf:integer;
Begin
bufvopr:=quest.ChildNodes['MATCHS'].ChildNodes.Count;
bufotv:=0;
buf:=0;
// Проверяем все ли позиции выбраны
For j:=0 to bufvopr-1 do
If combox[j].Items.Strings[combox[j].itemindex] <> '' then buf:= buf+1;
// Проверяем ответы
If buf=bufvopr then
begin
for i:=0 to bufvopr-1 do
Begin
If quest.ChildNodes['MATCHS'].ChildNodes[i].ChildNodes['ANSWERTEXT'].Text = combox[i].Items.Strings[combox[i].itemindex]
Then bufotv:=bufotv+1;
combox[i].Free;
mar[i].Free;

End;
SetLength(combox,0);
SetLength(mar,0);
b.Top:=Top1;
prop.Top:=Top1;
IF bufotv=bufvopr then
begin
Otvety[bufer]:=1
end
else Otvety[bufer]:=2;
fin:=fin+1;
If fin = Kolichestvovoprosov then finish else sort;
End
Else ShowMessage('Выберите ответ');

End;


procedure TForm1.Multichoice(vopr:IXMLNode);
Var
kolotv,i: Integer;
Begin

// Рисуем Memo
m:=TMemo.Create(nil);
m.Top:=top2;
m.Height:=97;
m.Left:=16;
m.Width:=705;
m.WordWrap:=True;
m.Parent:=Form1;
m.Text:=vopr.ChildNodes['QUESTIONTEXT'].Text;
// Узнаем кол-во ответов
kolotv:=vopr.ChildNodes['ANSWERS'].ChildNodes.Count;


// Рисуем Rad.But
For i:=0 to kolotv-1 do
Begin
SetLength(RB,length(RB)+1);
rb[i]:=TRadioButton.Create(nil);
rb[i].WordWrap:=True;
rb[i].Height:=33;
rb[i].Left:=408;
rb[i].Width:=225;
rb[i].Top:=top2+100+i*50;
rb[i].Parent:=Form1;
rb[i].Caption:=vopr.ChildNodes['ANSWERS'].ChildNodes[i].ChildNodes['ANSWER_TEXT'].Text;
If rb[i].Top > 366 then b.Top:=rb[i].Top+50;
If rb[i].Top > 366 then prop.Top:=rb[i].Top+50;
End;


// Делаем надпись
nad:=TLabel.Create(nil);
nad.Height:=24;
nad.Left:=160;
nad.Top:=120;
nad.Font.Size:=14;
nad.Width:=198;
nad.Caption:='Выберите один ответ';
nad.Parent:=Form1;


TButton(B).OnClick:=ButtonMultichoiceClick;
TButton(prop).OnClick:=PropuskMultichoiceClick;

end;



procedure TForm1.PropuskMultichoiceClick(Sender: TObject);
Var
kolotv,i:Integer;
Begin
Edit1.Text:='tttttt';
kolotv:=quest.ChildNodes['ANSWERS'].ChildNodes.Count;
For i:=0 to kolotv-1 do
rb[i].Free;
SetLength(RB,0);
b.Top:=Top1;
prop.Top:=Top1;
TMemo(m).Free;
nad.free;
If finito=true then finish else Sort;
end;




procedure TForm1.ButtonMultichoiceClick(Sender: TObject);
Var
kolotv,i, nomerotv,nomervern,buf: Integer;
begin
buf:=0;
kolotv:=quest.ChildNodes['ANSWERS'].ChildNodes.Count;
For i:=0 to kolotv-1 do
Begin
if rb[i].Checked then
begin
nomerotv:=i;
buf:=1;
end;
If quest.ChildNodes['ANSWERS'].ChildNodes[i].ChildNodes['FRACTION'].Text='1'
Then nomervern:=i;
End;

If buf <> 0 then
begin
For i:=0 to kolotv-1 do
begin
rb[i].Free;
end;
SetLength(RB,0);
b.Top:=Top1;
TMemo(m).Free;
nad.free;
If nomerotv=nomervern then
Begin
Bal:=Bal+1;
Otvety[bufer]:=1;
End
else Otvety[bufer]:=2;
fin:=fin+1;
If fin = Kolichestvovoprosov then finish else sort;
end
else ShowMessage('Выберите ответ');



end;
procedure TForm1.Multichoice2(vopr: IXMLNode);
Var
kolotv, i :integer;
begin
// Рисуем Memo
m:=TMemo.Create(nil);
m.Top:=top2;
m.Height:=97;
m.Left:=16;
m.Width:=705;
m.WordWrap:=True;
m.Parent:=Form1;
m.Text:=vopr.ChildNodes['QUESTIONTEXT'].Text;
// Узнаем кол-во ответов
kolotv:=vopr.ChildNodes['ANSWERS'].ChildNodes.Count;


// Рисуем Rad.But
For i:=0 to kolotv-1 do
Begin
SetLength(cb,length(cb)+1);
cb[i]:=TCheckBox.Create(nil);
cb[i].WordWrap:=True;
cb[i].Height:=33;
cb[i].Left:=408;
cb[i].Width:=225;
cb[i].Top:=top2+100+i*50;
cb[i].Parent:=Form1;
cb[i].Caption:=vopr.ChildNodes['ANSWERS'].ChildNodes[i].ChildNodes['ANSWER_TEXT'].Text;
If cb[i].Top > 366 then b.Top:=cb[i].Top+50;
If cb[i].Top > 366 then prop.Top:=cb[i].Top+50;
End;


// Делаем надпись
nad:=TLabel.Create(nil);
nad.Height:=24;
nad.Left:=100;
nad.Top:=120;
nad.Font.Size:=14;
nad.Width:=198;
nad.Caption:='Выберите хотя бы один ответ';
nad.Parent:=Form1;


TButton(B).OnClick:=ButtonMultichoice2Click;
TButton(prop).OnClick:=PropuskMultichoice2Click;
end;


procedure TForm1.PropuskMultichoice2Click(Sender: TObject);
Var
kolotv,i:Integer;
Begin
Edit1.Text:='tttttt222222';
kolotv:=quest.ChildNodes['ANSWERS'].ChildNodes.Count;
For i:=0 to kolotv-1 do
cb[i].Free;
SetLength(cB,0);
b.Top:=Top1;
prop.Top:=Top1;
TMemo(m).Free;
nad.free;
If finito=true then finish else Sort;
end;



procedure TForm1.ButtonMultichoice2Click(Sender: TObject);
Var
kolotv, buf, i, sovp:Integer;
verno: array[0..200] of Integer;
otv:array[0..200] of Integer;
begin

buf:=0;
sovp:=1;

// Узнаем кол-во ответов
kolotv:=quest.ChildNodes['ANSWERS'].ChildNodes.Count;
// Проверяем выбран ли ответ
For i:=0 to kolotv-1 do
Begin
If cb[i].Checked then
Begin
buf:=1;
otv[i]:=1;
End
else otv[i]:=0;
IF quest.ChildNodes['ANSWERS'].ChildNodes[i].ChildNodes['FRACTION'].Text <> '0'
then verno[i]:=1 else verno[i]:=0;
End;

If buf<>0 then
Begin
TMemo(m).Free;
nad.free;
For i:=0 to kolotv-1 do
Begin
if otv[i]<>verno[i] then sovp:=0;
cb[i].Free;
End;

If sovp=1 then
Begin
Bal:=Bal+1;
Otvety[bufer]:=1;
End
else Otvety[bufer]:=2;
fin:=fin+1;
If fin = Kolichestvovoprosov then finish else sort;

End
Else ShowMessage('Выберите ответ');

end;



procedure TForm1.N6Click(Sender: TObject);
begin
close;
end;

procedure TForm1.OpenClick(Sender: TObject);
var
QString:WideString;
i,j,z: integer;
Q:IXMLNode;
num:Integer;
otv:Boolean;

begin

if FormOpen.ShowModal=mrOk then
If FormVybor2.ShowModal=mrOk then
Begin
XMLDocument1.Active:=true;
XMLDocument1.LoadFromFile(FormOpen.EditObzor.Text);
N4.Enabled:=False;
Timer1.Enabled:=False;
finito:=false;

//Cоздаем кнопку Далее
b:=TButton.Create(nil);
b.Caption:=Cap;
b.Height:=He;
b.Left:=Le;
b.Top:=Top1;
b.Width:=Wi;
b.Parent:=Form1;
b.Name:='ButtonTrFa';
b.Enabled:=True;

// Кол-во тестов
j:=XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['MODULES'].ChildNodes.Count;
i:=0;
For z:=0 to j-1 do
If XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['MODULES'].ChildNodes[z].ChildNodes['MODTYPE'].Text= 'quiz'then
Begin
SetLength(RB,length(RB)+1);
rb[i]:=TRadioButton.Create(nil);
rb[i].WordWrap:=True;
rb[i].Height:=33;
rb[i].Left:=108;
rb[i].Width:=225;
rb[i].Top:=120+i*50;
rb[i].Parent:=Form1;
rb[i].Caption:=XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['MODULES'].ChildNodes[z].ChildNodes['NAME'].Text;
If rb[i].Top > 366 then b.Top:=rb[i].Top+50;
i:=i+1;
End;

b.OnClick:=NumTest;
b.Tag:=i;

End;
End;





Procedure TForm1.Sort;
Var
TypeId:Integer;
nomer, j,i,num :integer;
q:ixmlnode;
Begin

bufer:=bufer+1;
If bufer > Kolichestvovoprosov then bufer:=1;

If (Otvety[bufer] <> 2) and (Otvety[bufer] <> 1) then
Begin

Num:=StrToInt(GetDirNames[bufer]);


//Определяем тип вопроса: TypeId=
//1-верно-неверно
//2-на соответствие
//3-множ.выбор
IdType(quest2,Num,TypeId,nomer);
// IdType(quest2,8,TypeId,nomer);
quest:=quest2.ChildNodes[nomer];


// Если верно-неверно
If TypeId=1 then
Begin
TrFa(quest);
end;
// Если на соответствие
If TypeId=2 then Match(quest);
// Если множ выбор
If TypeId=3 then
Begin
If quest.ChildNodes['MULTICHOICE'].ChildNodes['SINGLE'].Text='1'
Then Multichoice(quest) else Multichoice2(quest);
End;
End
else
Begin
sort;
end;
end;





procedure TForm1.finish;
Var
nadpis1, nadpis2:TLabel;
i:integer;
Verno:integer;
TempString:WideString;
Begin
Timer1.Enabled:=false;
nadTime.free;
prop.Free;
Verno:=0;

nadpis1:=TLabel.Create(nil);
nadpis1.Caption:='Всего вопросов '+IntToStr(Kolichestvovoprosov);
nadpis1.Height:=13;
nadpis1.Left:=8;
nadpis1.Top:=24;
nadpis1.Font.Size:=14;
nadpis1.Parent:=Form1;
SetLength(NadItog,Kolichestvovoprosov);

For i:=1 to Kolichestvovoprosov do
Begin

NadItog[i]:=TLabel.Create(nil);
NadItog[i].Left:=8;
NadItog[i].Top:= 60+40*i;
NadItog[i].Parent:=Form1;

If otvety[i]=1 then
Begin
NadItog[i].Caption:='Вопрос № '+IntToStr(i) + ' - верно';
Verno:=Verno+1;
End
else NadItog[i].Caption:='Вопрос № '+IntToStr(i) + ' - неверно';
End;

If NadItog[Kolichestvovoprosov-1].Top > 366 then b.Top:=NadItog[Kolichestvovoprosov-1].Top+50;
TempString:=IntToStr(Verno)+' из '+ IntToStr(Kolichestvovoprosov);

nadpis2:=TLabel.Create(nil);
nadpis2.Caption:=TempString;
nadpis2.Height:=13;
nadpis2.Left:=8;
nadpis2.Top:=naditog[Kolichestvovoprosov].Top+30;
nadpis2.Font.Size:=14;
nadpis2.Parent:=Form1;

DataBaseModule.ADOTableResult.Insert;
DataBaseModule.ADOTableResultDSDesigneranie.Value:=nazvanie;
DataBaseModule.ADOTableResultDSDesigner2.Value:=TempString;
DataBaseModule.ADOTableResultDSDesigner3.Value:=now;
DataBaseModule.ADOTableResultLinkKey.Value:=IDUser;
FormVybor.ShowModal;
Edit2.Text:=IntToStr(IDUser);
b.Caption:='Выход';
b.OnClick:=ButtonExitOncLick;


End;








procedure TForm1.ButtonExitOncLick(Sender: TObject);
Var i:integer;
begin
For i:=1 to Kolichestvovoprosov do
NadItog[i].Free;
DataBaseModule.ADOConnection1.Connected:=false;
b.Free;
nadpis1.Free;
nadpis2.Free;
Close;
end;




procedure TForm1.NumTest(Sender: TObject);
Var
QString:String;
j,z,i,a:integer;
NumT, temp, temp2:integer;

begin
temp2:=0;
For a:=0 to b.Tag-1 do
If rb[a].Checked then temp2:=1;
If temp2=1 then
Begin
z:=XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['MODULES'].ChildNodes.Count;

NumT:=0;
For a:=0 to z-1 do
If XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['MODULES'].ChildNodes[a].ChildNodes['MODTYPE'].Text= 'quiz'then
Begin
If rb[i].Checked then NumT:=a;
rb[i].Free;
i:=i+1;

End;
SetLength(RB,0);



QString:=XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['MODULES'].ChildNodes[numt].ChildNodes['QUESTIONS'].Text;
Nazvanie:=XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['MODULES'].ChildNodes[numt].ChildNodes['NAME'].Text;
// Находим номера вопросов
GetDirNames := Tokenize(QString, ',');



Form1.AutoScroll:=True;
Kolichestvovoprosov:=GetDirNames.Count-1;
bufer:=0;
fin:=0;
Edit1.Text:=IntToStr(Kolichestvovoprosov);


//min:= StrToInt(XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['MODULES'].ChildNodes[numt].ChildNodes['TIMELIMIT'].Text);
min:=1;

If min <> 0 then
Begin
Timer1.Enabled:=True;
End;
sec:=1;
nadTime:=TLabel.Create(nil);
nadTime.Left:=10;
nadTime.Top:=5;
nadTime.Font.Size:=14;
nadTime.Parent:=Form1;
nadTime.Enabled:=False;




// Обнуляем счетчик!!!
Bal:=0;

SetLength(RB,0);


prop:=TButton.Create(nil);
prop.Caption:=Cap;
prop.Height:=He;
prop.Left:=420;
prop.Top:=Top1;
prop.Width:=Wi;
prop.Parent:=Form1;
prop.Enabled:=True;
prop.Caption:='Пропустить';
b.Caption:='Ответить';



SetLength(Otvety,Kolichestvovoprosov);
for temp:=1 to Kolichestvovoprosov do
otvety[temp]:=3;
//загружаем нужный фрагмент в переменную и работаем с ней
//так же как с объектом XMLDocument1
quest2:=XMLDocument1.DocumentElement.ChildNodes['COURSE'].ChildNodes['QUESTION_CATEGORIES'].ChildNodes['QUESTION_CATEGORY'].ChildNodes['QUESTIONS'];


sort;

end
else ShowMessage('Выберите тест');

end;





procedure TForm1.Timer1Timer(Sender: TObject);

begin
sec:=sec-1;
if nadTime.Enabled=false then nadTime.Enabled:=true;
if (min = 0) and (sec = 0) then
Begin
finito:=true;
prop.Click;
//Timer1.Enabled:=false;
exit;
End;

if (sec = 0) and (min > 0) then
begin
sec := 60;
min := min - 1;
end;
nadTime.Caption:='осталось '+IntToStr(min)+' : '+IntToStr(sec);
end;

procedure TForm1.N3Click(Sender: TObject);
begin
FormSpisok.ShowModal;
end;

procedure TForm1.N7Click(Sender: TObject);
begin
FormResult.ShowModal;
end;


end.
Форма ответа