Здравствуйте, LuciferArh, Вы писали:
LA>Здравствуйте, <Аноним>, Вы писали:
А>>В сети написано только про полный импорт, а надо импорт построчно. То есть: А>>имеется в наличии 5 TMemo, в Тестовом задании (которое требуется импортировать) порядка 200 вопросов и соответственно 800 ответов, то есть около 1000 строк. Требуется чтоб в строку вопросов импортировался сам вопрос, а в остальные 4 TMemo ответы.
LA>Можно либо сделать сруктурированный файл с оговоренными разделителями. И уже по ним парсить и заносить в БД. Это несложно, сложнее готовить такие файлы. Или можно написать XSD, а потом сконвертить файл в XML. И уже потом его импортировать.
// Создание нового теста
procedure TForm1.PrNewTest(Sender: TObject);
begin
// Очистка временного объекта
Memo_Temp.Lines.Clear; Btn_Last.Enabled:=False; Btn_Next.Enabled:=True; Nom_Question:=1; Label1.Caption:='Вопрос №1 :'; PrCleanItems(Sender);
end;
// Ввод данных вопроса в промежуточный объект
procedure TForm1.PrSaveMemo(Sender: TObject);
begin
if Memo_Temp.Lines.Count=(2+6*(Nom_Question-1))then
begin
// Создание новых строчек в промежуточном объекте
Memo_Temp.Lines.Add(encrypt(Edt_Question.Text,30000)); Memo_Temp.Lines.Add(encrypt(Edt_V1.Text,30000));
Memo_Temp.Lines.Add(encrypt(Edt_V2.Text,30000)); Memo_Temp.Lines.Add(encrypt(Edt_V3.Text,30000)); Memo_Temp.Lines.Add(encrypt(Edt_V4.Text,30000)); Memo_Temp.Lines.Add(encrypt(IntToStr(RG_CorrectQ.ItemIndex+1),30000));
end
else
begin
// Изменение уже существующих данных
Memo_Temp.Lines[2+6*(Nom_Question-1)]:=encrypt((Edt_Question.Text),30000); Memo_Temp.Lines[3+6*(Nom_Question-1)]:=encrypt((Edt_V1.Text),30000); Memo_Temp.Lines[4+6*(Nom_Question-1)]:=encrypt((Edt_V2.Text),30000);
Memo_Temp.Lines[5+6*(Nom_Question-1)]:=encrypt((Edt_V3.Text),30000); Memo_Temp.Lines[6+6*(Nom_Question-1)]:=encrypt((Edt_V4.Text),30000);
Memo_Temp.Lines[7+6*(Nom_Question-1)]:=encrypt(IntToStr(RG_CorrectQ.ItemIndex+1),30000);
end;
end;
procedure TForm1.Btn_NextClick(Sender: TObject);
begin
PrSaveMemo(Sender);
if Memo_Temp.Lines.Count>(8+6*(Nom_Question-1)) then
PrLastItems(0,Sender) else PrCleanItems(Sender);
inc(Nom_Question);
Label1.Caption:='Вопрос №'+IntToStr(Nom_Question)+' :';
if Nom_Question=StrToInt(Spoint(Form2.Edt_Kol.Text)) then
Btn_Next.Enabled:=False;
Btn_Last.Enabled:=True;
end;
procedure TForm1.PrLastItems(i:byte;Sender: TObject);
begin
Edt_Question.Text:=decrypt(Memo_Temp.Lines[2+6*(Nom_Question-i)],30000); Edt_V1.Text:=decrypt(Memo_Temp.Lines[3+6*(Nom_Question-i)],30000);
Edt_V2.Text:=decrypt(Memo_Temp.Lines[4+6*(Nom_Question-i)],30000); Edt_V3.Text:=decrypt(Memo_Temp.Lines[5+6*(Nom_Question-i)],30000);
Edt_V4.Text:=decrypt(Memo_Temp.Lines[6+6*(Nom_Question-i)],30000);RG_CorrectQ.ItemIndex:=StrToInt(decrypt(Memo_Temp.Lines[7+6*(Nom_Question-i)],30000))-1;
end;
procedure TForm1.Btn_LastClick(Sender: TObject);
begin
PrSaveMemo(Sender); PrLastItems(2,Sender); dec(Nom_Question); Label1.Caption:='Вопрос №'+IntToStr(Nom_Question)+' :';
if Nom_Question=1 then
Btn_Last.Enabled:=False;
Btn_Next.Enabled:=True;
end;
procedure TForm1.MI_NewTestClick(Sender: TObject);
begin
MI_NewTest.Enabled:=false; MIOpen.Enabled:=False; Form2.ShowModal;
end;
procedure TForm1.MISaveClick(Sender: TObject);
var
TempFileName: string;
begin
PrSaveMemo(Sender); SaveDialog1.InitialDir:=ExtractFilePath(Application.ExeName);
if SaveDialog1.Execute then
begin
if pos('.test',SaveDialog1.FileName)>0 then TempFileName:=SaveDialog1.FileName
else
TempFileName:=SaveDialog1.FileName+'.test'; Memo_Temp.Lines.SaveToFile(TempFileName);
end
else Memo_Temp.Lines.Clear;
end;
procedure TForm1.MICloseClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.MIOpenClick(Sender: TObject);
var
i,j: byte; Temp_String, Password_String: string; EndFor: boolean;
begin
if Memo_Temp.Lines.Count>4 then MICloseAllClick(Sender)
else
begin
PrNewTest(Sender); OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName);
if OpenDialog1.Execute then
begin
Memo_Temp.Lines.LoadFromFile(OpenDialog1.FileName);
// --- Работа с паролем ---
Temp_String:=decrypt(Memo_Temp.Lines[1], 30000); for i:=1 to length(Temp_String) do
begin
if ((Temp_String[i]=' ')and not EndFor) then for j:=i+1 to length(Temp_String) do
if ((Temp_String[j]=' ')and not EndFor) then
begin
if i+1=j then Password_String:=''
else
Password_String:=copy(Temp_String,i+1,j-i-1); EndFor:=true;
end;
end;
if Password_String<>'' then begin PasswordDlg.Password.Text:=''; PasswordDlg.ShowModal; end;
if not (PasswordDlg.Password.Text=Password_String) then
begin
Memo_Temp.Lines.Clear; abort;
end;
MISave.Enabled:=True; MICloseAll.Enabled:=True; GBox1.Visible:=True; Lbl_NameTest.Caption:=Memo_Temp.Lines[0];
Form2.Edt_Kol.Text:=copy(decrypt(Memo_Temp.Lines[1],30000),1,pos(' ',decrypt(Memo_Temp.Lines[1],30000))-1);
i:=pos(':',Temp_String);
while Temp_String[i]<>' ' do
begin
dec(i);
end;
В программе также задействовано кодирование вводной информации и его сохранение в другом формате.
Edt_V1,Edt_V2,Edt_V3,Edt_V4,Edt_Question — в эти поля импортировать данные из Word application
в Edt_Question — вопрос, а V1,V2,V3,V4 — ответы.
Без подгонки самих данных под программу. То есть использовать какой-нибудь разделитель — @ или # — для обозначения новой строки или конца самой строки.