Основы работы с БД

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Основы работы с БД

Сообщение Troublemaker » 27.04.2008 11:29:14

Приветствую!

Существует ли какой-нибудь пошаговый шпаргальник, где было бы показано как создать dataset, связать его с DS и DBGrid?

Непонятка у меня с отображением полей - никак не пойму, где же устанавливается связь между полями в базе и полями в гриде - везде отдельные описания fielddefs и не ясно, то ли при совпадении имен полей они связываются (поля в DS и столбцы в гриде) автоматически, то ли как-то иначе? Посмотрел пример addressbook и основанный на нем contacts, но не смог понять логики.

На дельфи никогда не писал, но опыт работы с СУБД есть - неплохо знаю Clarion. Там эти вопросы решаютсся проще - каждая строка в аналоге грида есть массив строк с различными атрибутами, где каждый элемент массива - отдельный столбец. А сами строки обычно хранятся в специальной структуре - "очередь", что-то вроде классического двунаправленного списка (^prev, data, ^next).

В идеале буду благодарен за "распальцовку" такого задания (дальше, думаю, справлюсь по аналогии):

1. в базе (TDBF) одна таблица, два поля (bool и string)
2. как правильно отобразить эту таблицу в dgbrid-e?

DS, tDBF имеются. Куда что нужно прописывать?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Attid » 27.04.2008 12:40:13

Troublemaker писал(а):можно ли в dbgrid отображать значения boolean-полей в виде чекбоксов - вкл/выкл?

готового решения нет, ручками можно.

Troublemaker писал(а):в базе (TDBF) одна таблица, два поля (bool и string)

дбф тебе зачем ? портируешь что-то или с нуля ? лучше firebird или SQLite.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Troublemaker » 27.04.2008 12:50:15

Attid писал(а):
Troublemaker писал(а):можно ли в dbgrid отображать значения boolean-полей в виде чекбоксов - вкл/выкл?

готового решения нет, ручками можно.

Можно чуть подробнее? В кларионе это решалось так: столбцу назначался атрибут icon, значение которого рассчитывалось в зависимости от значения поля. В случае с логическими полями в зависимости от t/f тупо выбиралась иконка "вкл" или "выкл". Но здесь я не вижу похожего.

Attid писал(а):
в базе (TDBF) одна таблица, два поля (bool и string)
дбф тебе зачем ? портируешь что-то или с нуля ? лучше firebird или SQLite.
Нужно нечто локально-автономное.

Постановка всей задачи примерно такова:

Нужна система дистанционной сдачи экзаменов и/или выполнения лабораторных работ. Это будет мой диплом.

Ситуация осложняется тем, что использовать для нее коммерческие продукты нельзя, и работать оно должно как в виндах, так и в никсах.
Вариантов инструментовки немного. Java я не знаю, а изучать ее - мне проще сразу повеситься. Другие C-подобные языки так же отпадают по той же причине - ну не привык я к языкам с извращенным синтаксисом. :)
Я могу эту систему нарисовать на кларионе и запускать, скажем, под WINE, но Clarion - это коммерческая и довольно дорогая система. Роялти, вроде, не требуются, но универ могут и вздрючить за использование нелицензионных средств разработки.

Поэтому я решил разработать ИДЕОЛОГИЮ - форматы обмена между сервером в универе и клиентом-студентом, и под эту идеологию сделать пример пары клиент-сервер. Причем пример - РАБОЧИЙ, который можно использовать. Думаю, ясно, что тащить сервер FB на машину студента - не лучший вариант. Насчет SQLite - не использовал, поэтому не хочу пока связываться.
Остаются старые добрые DBF, которые можно смотреть и конвертить чем угодно во что угодно.

Пока это выглядит так: студент получает жутко зашифрованный dbf, который на лету расшифровывается и копируется в MEMds. Отвечает на вопросы и формирует пакет для отправки обратно.
И если в целом я представляю, как оно может работать, то детали реализации вызывают у меня затруднение: знание Pascal не означает знания V/LCL :)

Делать постоянную связь через тырнет - неразумно, ибо не у всех есть выделенные каналы, значит время в онлайне должно быть минимальным. Поэтому варианты с работой через браузер (JS и иже с ним) или типа предоставления каждому студенту shell-a или RAdmina, как видел где-то, тоже отпадают - сам наступал на грабли, когда связь пропадала надолго, а через сутки после обрыва связи экзамен считался несданным.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение m_guest » 27.04.2008 14:08:34

Troublemaker писал(а):тащить сервер FB на машину студента - не лучший вариант

Используйте embedded-версию.
Лучше версий 1.5x, там меньше файлов в папку с приложением класть.
m_guest
постоялец
 
Сообщения: 193
Зарегистрирован: 14.08.2005 15:10:21

Сообщение Troublemaker » 27.04.2008 14:16:14

m_guest писал(а):
Troublemaker писал(а):тащить сервер FB на машину студента
Используйте embedded-версию.

Остроумно. Шутку оценил. Каков объем этой версии? Куда она embedded - прямо в Lazarus? Она будет внедрена в исполняемый файл моей задачи? А чем смотреть ее файлы данных без сервера, пусть и локального?

См. выше мои соображения насчет формата хранения. Впрочем, к дбфу я привязался больше по привычке, между клиентом и сервером может вообще бегать просто шифрованный кусок данных типа file of string[64], например. Внутри всё это будет закачиваться в memds и обрабатываться уже через него.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение m_guest » 27.04.2008 14:43:09

Troublemaker писал(а):на будет внедрена в исполняемый файл моей задачи

Это тоже можно сделать..
-------
m_guest
постоялец
 
Сообщения: 193
Зарегистрирован: 14.08.2005 15:10:21

Сообщение Attid » 27.04.2008 14:46:48

Troublemaker писал(а):В кларионе это решалось так: столбцу назначался атрибут icon, значение которого рассчитывалось в зависимости от значения поля. В случае с логическими полями в зависимости от t/f тупо выбиралась иконка "вкл" или "выкл".

может стоит взглянуть на МСЕ ? там примерно также.

Troublemaker писал(а):Остроумно. Шутку оценил. Каков объем этой версии? Куда она embedded - прямо в Lazarus? Она будет внедрена в исполняемый файл моей задачи? А чем смотреть ее файлы данных без сервера, пусть и локального?

это отдельный ДЛЛ размер если не путаю примерно 2 метра. её даете один раз вместе с приложением.

если пугает размер то SQLLite вроде 500 кб.

Troublemaker писал(а):А чем смотреть ее файлы данных без сервера, пусть и локального?

твоей программой или есть "Утилита администрирования и управления БД" на этом форуме.

но для этой задачи я бы не использовал БД, лучше файс собственного формата с шифрованными типозированными записями.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Troublemaker » 27.04.2008 14:57:58

Attid писал(а):
Troublemaker писал(а):столбцу назначался атрибут icon, ... В случае с логическими полями в зависимости от t/f тупо выбиралась иконка "вкл" или "выкл".
может стоит взглянуть на МСЕ ? там примерно также.
Что есть MCE?

Attid писал(а):но для этой задачи я бы не использовал БД, лучше файс собственного формата с шифрованными типозированными записями.
Да, я и сам всё больше склоняюсь к такому варианту: всосал файл с заданиями, выплюнул файл с ответами. Но неохота писать всю внутреннюю обработку файла - создание динамических очередей и т.п., поэтому и хочу внутри использовать memds
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Attid » 27.04.2008 15:29:57

Troublemaker писал(а):Что есть MCE?

http://freepascal.ru/forum/viewtopic.php?t=2111&start=0

поэтому и хочу внутри использовать memds

ну затени файл его прочитал в memds поработал записал обратно, загрузка то за пол часа пишется. шифрование еще полчаса.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение ev » 27.04.2008 15:50:45

шифрование еще полчаса

напишите кто-нить шифрование по госту за полчаса - буду очень благодарен ;)
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение Troublemaker » 27.04.2008 16:09:05

Attid писал(а):ну затени файл его прочитал в memds поработал записал обратно, загрузка то за пол часа пишется. шифрование еще полчаса.

Затени? Э-э, пардон, что имеется в виду? ЗатЯнуть или использовать какую-то технологию "memory-mapped file"? Или что-то третье?

Если есть желание и позволяет время, черновик поясниловки можно глянуть здесь, мне нужна (внутри программы) классическая РБД с четырьмя таблицами, связанными "1:М".

ev писал(а):напишите кто-нить шифрование по госту за полчаса - буду очень благодарен ;)
Хм... а почему именно по ГОСТу? (я знаю, о каком идет речь, и знаю, что не буду даже пытаться)
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение NXP » 27.04.2008 16:15:39

Troublemaker писал(а):Насчет SQLite - не использовал, поэтому не хочу пока связываться

Это зря, она не так страшна. Вот рабочий пример, не красивый, но полностью рабочий (кусочек моего старого дипломного по системам тестирования):
Код: Выделить всё
unit tstdriver;

{$mode objfpc}{$H+}
{$macro on}


{$define debug}

interface

uses
  SQLite3ds, Classes, SysUtils, LCLclasses, LCLtype, LCLproc, Forms;

type
  TVopros = packed record {*** для таблицы списка вопросов}
    Vop_Num:  integer;              {Код вопроса}
    Vop_Text: string;               {Текст вопроса}
    Vop_Type: integer;              {Тип вопроса}
    Vop_Image: string;              {HEX-картинка вопроса}
    Var_Count: integer;             {Кол-во вопросов 1-8}
    V: array [0..7] of string;      {Текст варианта 1-8}
    UseImg: array [0..7] of Boolean;{Признаки показа картинки}
    Image: array [0..7] of string;  {Сами картинки}
    Timer:  integer;                {Время на вопрос (сек)}
  end;
  pTVopros = ^TVopros;
 
  Rotates = 0..7;
 
  TResult = packed record {*** Ответы пользователя}
    Otv_Num:  integer;              {Код вопроса}
    Otv_Type: integer;              {Тип вопроса}
    Otv_Bool: boolean;              {Для ДА/НЕТ}
    Esse_Text: string;              {Текст ответа в Esse}
    Text_Otvet: array [0..7] of string;
    Bool_Otvet: array [0..7] of Boolean;
    Over_Time: integer; {если более 0 то просрочка в сек}
  end;
  pTResult = ^TResult;
 
  TOtvet = packed record {*** правильные ответы}
    Otv_Num:  integer;              {Код вопроса}
    Otv_Type: integer;              {Тип вопроса}
    Otv_Bool: boolean;              {Для ДА/НЕТ}
    Otv_Count: integer;             {Кол-во ответов}
    Esse_Text: string;              {Текст ответа в Esse}
    Text_Otvet: array [0..7] of string;
    Bool_Otvet: array [0..7] of Boolean;
  end;
  pTOtvet = ^TOtvet;
 
const
  Test_Table = 'test';      {сам тест}
  Result_Table = 'result';  {Ответы пользователя}
  Otvet_Table = 'otvet';    {правильные ответы}

  TC_1 = 'Vop_Num';
  TC_2 = 'Vop_Text';
  TC_3 = 'Vop_Type';
  TC_4 = 'Vop_Image';
  TC_5 = 'Var_Count';
  TC_6 = 'v1';
  TC_7 = 'v2';
  TC_8 = 'v3';
  TC_9 = 'v4';
  TC_10 = 'v5';
  TC_11 = 'v6';
  TC_12 = 'v7';
  TC_13 = 'v8';
  TC_14 = 'v1UseImg';
  TC_15 = 'v2UseImg';
  TC_16 = 'v3UseImg';
  TC_17 = 'v4UseImg';
  TC_18 = 'v5UseImg';
  TC_19 = 'v6UseImg';
  TC_20 = 'v7UseImg';
  TC_21 = 'v8UseImg';
  TC_22 = 'vImage1';
  TC_23 = 'vImage2';
  TC_24 = 'vImage3';
  TC_25 = 'vImage4';
  TC_26 = 'vImage5';
  TC_27 = 'vImage6';
  TC_28 = 'vImage7';
  TC_29 = 'vImage8';
  TC_30 = 'vTimer';

  TC_01 = 'Otv_Num';
  TC_02 = 'Otv_Type';
  TC_03 = 'Otv_Bool';
  TC_04 = 'Esse_Text';
  TC_05 = 'vt1';
  TC_06 = 'vt2';
  TC_07 = 'vt3';
  TC_08 = 'vt4';
  TC_09 = 'vt5';
  TC_010 = 'vt6';
  TC_011 = 'vt7';
  TC_012 = 'vt8';
  TC_013 = 'vb1';
  TC_014 = 'vb2';
  TC_015 = 'vb3';
  TC_016 = 'vb4';
  TC_017 = 'vb5';
  TC_018 = 'vb6';
  TC_019 = 'vb7';
  TC_020 = 'vb8';
  TC_021 = 'Over_Time';

  TC_A1 = 'Otv_Num';
  TC_A2 = 'Otv_Type';
  TC_A3 = 'Otv_Bool';
  TC_A4 = 'Esse_Text';
  TC_A5 = 'vt1';
  TC_A6 = 'vt2';
  TC_A7 = 'vt3';
  TC_A8 = 'vt4';
  TC_A9 = 'vt5';
  TC_A10 = 'vt6';
  TC_A11 = 'vt7';
  TC_A12 = 'vt8';
  TC_A13 = 'vb1';
  TC_A14 = 'vb2';
  TC_A15 = 'vb3';
  TC_A16 = 'vb4';
  TC_A17 = 'vb5';
  TC_A18 = 'vb6';
  TC_A19 = 'vb7';
  TC_A20 = 'vb8';




{Получение данных для создания вопроса}
function Get_Test(DB_file: pChar; Vopros: pTVopros): boolean;

{Запись данных вопроса, или обновление при совпадении id}
function Set_Test(DB_file: pChar; Vopros: pTVopros): boolean;

{Получение ответов пользователя}
function Get_Result(DB_file: pChar; Results: pTResult): boolean;

{Записать ответ пользователя}
function Set_Result(DB_file: pChar; Results: pTResult): boolean;

{Получение правильных ответов}
function Get_Otvet(DB_file: pChar; Otvet: pTOtvet): boolean;

{Записать правильный ответо}
function Set_Otvet(DB_file: pChar; Otvet: pTOtvet): boolean;

{Очистка данных}
procedure Clear_Test(Vopros: pTVopros);
procedure Clear_Results(Results: pTResult);
procedure Clear_Otvet(Otvet: pTOtvet);


{Преобразует текст в Hex-массив или массив в текст (если ToText = true)}
function Hex_Array(Input: string; ToText: boolean = false): string;

procedure init;

implementation  ///////////////////////////////////////////////////////////////////////////


{****************************************************************
        Получение данных для создания вопроса
*****************************************************************}
function Get_Test(DB_file: pChar; Vopros: pTVopros): boolean;
var
  CustomDB: TSqlite3Dataset;
  SQL_ExecText: string = '';
  count: integer = 0;
begin
  {$ifdef debug} writeln('function Get_Test'); {$endif}
  Result:= false;
  if (DB_file = nil) or (Vopros = nil) then exit;
  if (DB_file = '') or (not FileExists(DB_file)) then exit;
  CustomDB:= TSqlite3Dataset.Create(nil);
  CustomDB.FileName:= DB_file;
  if not CustomDB.TableExists(Test_Table) then begin
    CustomDB.Free;
    exit;
  end;
  SQL_ExecText:= 'SELECT * FROM [' + Test_Table +
    '] WHERE [' + TC_1 + ']=' + IntToStr(Vopros^.Vop_Num);
  {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
  CustomDB.SQL:= SQL_ExecText;
  CustomDB.Open;

  while (not CustomDB.EOF) do begin
    CustomDB.Next;
    inc(count);
  end;

  if count = 1 then begin
    Vopros^.Vop_Text:=  Hex_Array(CustomDB.Fields.Fields[1].AsString, True);
    Vopros^.Vop_Type:=  CustomDB.Fields.Fields[2].AsInteger;
    Vopros^.Vop_Image:= Hex_Array(CustomDB.Fields.Fields[3].AsString, True);
    Vopros^.Var_Count:= CustomDB.Fields.Fields[4].AsInteger;
    Vopros^.v[0]:=      Hex_Array(CustomDB.Fields.Fields[5].AsString, True);
    Vopros^.v[1]:=      Hex_Array(CustomDB.Fields.Fields[6].AsString, True);
    Vopros^.v[2]:=      Hex_Array(CustomDB.Fields.Fields[7].AsString, True);
    Vopros^.v[3]:=      Hex_Array(CustomDB.Fields.Fields[8].AsString, True);
    Vopros^.v[4]:=      Hex_Array(CustomDB.Fields.Fields[9].AsString, True);
    Vopros^.v[5]:=      Hex_Array(CustomDB.Fields.Fields[10].AsString, True);
    Vopros^.v[6]:=      Hex_Array(CustomDB.Fields.Fields[11].AsString, True);
    Vopros^.v[7]:=      Hex_Array(CustomDB.Fields.Fields[12].AsString, True);
    Vopros^.UseImg[0]:= CustomDB.Fields.Fields[13].AsBoolean;
    Vopros^.UseImg[1]:= CustomDB.Fields.Fields[14].AsBoolean;
    Vopros^.UseImg[2]:= CustomDB.Fields.Fields[15].AsBoolean;
    Vopros^.UseImg[3]:= CustomDB.Fields.Fields[16].AsBoolean;
    Vopros^.UseImg[4]:= CustomDB.Fields.Fields[17].AsBoolean;
    Vopros^.UseImg[5]:= CustomDB.Fields.Fields[18].AsBoolean;
    Vopros^.UseImg[6]:= CustomDB.Fields.Fields[19].AsBoolean;
    Vopros^.UseImg[7]:= CustomDB.Fields.Fields[20].AsBoolean;
    Vopros^.Image[0]:=  Hex_Array(CustomDB.Fields.Fields[21].AsString, True);
    Vopros^.Image[1]:=  Hex_Array(CustomDB.Fields.Fields[22].AsString, True);
    Vopros^.Image[2]:=  Hex_Array(CustomDB.Fields.Fields[23].AsString, True);
    Vopros^.Image[3]:=  Hex_Array(CustomDB.Fields.Fields[24].AsString, True);
    Vopros^.Image[4]:=  Hex_Array(CustomDB.Fields.Fields[25].AsString, True);
    Vopros^.Image[5]:=  Hex_Array(CustomDB.Fields.Fields[26].AsString, True);
    Vopros^.Image[6]:=  Hex_Array(CustomDB.Fields.Fields[27].AsString, True);
    Vopros^.Image[7]:=  Hex_Array(CustomDB.Fields.Fields[28].AsString, True);
    Vopros^.Timer:=     CustomDB.Fields.Fields[29].AsInteger;;
    Result:= True;
  end;
  CustomDB.ClearFields;
  CustomDB.Close;
  CustomDB.Free;
end;



{****************************************************************
    Запись данных вопроса, или обновление при совпадении id
*****************************************************************}
function Set_Test(DB_file: pChar; Vopros: pTVopros): boolean;
var
  CustomDB: TSqlite3Dataset;
  Insert: boolean = true;
  SQL_ExecText: string = '';
  tCreate: boolean = false;
begin
  {$ifdef debug} writeln('function Set_Test'); {$endif}
  Result:= false;
  if (DB_file = nil) or (Vopros = nil) then exit;
  if (DB_file = '') then exit;
  CustomDB:= TSqlite3Dataset.Create(nil);
  {$ifdef debug} writeln('DB FILE = ', DB_File); {$endif}
  CustomDB.FileName:= DB_file;
  if FileExists(DB_file) then begin
    {Файл базы данных существует, проверяем наличие таблицы}
    if CustomDB.TableExists(Test_Table) then begin
      {Таблица найдена, проверяем наличие теста с этим кодом}
      {$ifdef debug} writeln('Table exists, Check TABLe ...'); {$endif}
      SQL_ExecText:= 'SELECT * FROM [' + Test_Table + '] WHERE [' + TC_1 + ']=' + IntToStr(Vopros^.Vop_Num);
      {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
      CustomDB.SQL:= SQL_ExecText;
      CustomDB.Open;
      {Если запись есть, то конца сразу не должно быть}
      Insert:= (CustomDB.EOF = true);
      {$ifdef debug} writeln('insert=', BoolToStr(Insert, True)); {$endif}
      CustomDB.Close;
    end else tCreate:= true;
  end else tCreate:= true;
  if tCreate then begin
      {Таблицы нет, создаем, Insert само собой...}
      Insert:= true;
      {$ifdef debug} writeln('CREATE TABLE...'); {$endif}
      SQL_ExecText:= 'CREATE TABLE [' + Test_Table + '] ([' +
        TC_1 + '] INTEGER PRIMARY KEY, ['+
        TC_2 + '] TEXT, [' +
        TC_3 + '] INTEGER, [' +
        TC_4 + '] TEXT, [' +
        TC_5 + '] INTEGER, [' +
        TC_6 + '] TEXT, [' +
        TC_7 + '] TEXT, [' +
        TC_8 + '] TEXT, [' +
        TC_9 + '] TEXT, [' +
        TC_10 + '] TEXT, [' +
        TC_11 + '] TEXT, [' +
        TC_12 + '] TEXT, [' +
        TC_13 + '] TEXT, [' +
        TC_14 + '] BOOLEAN, [' +
        TC_15 + '] BOOLEAN, [' +
        TC_16 + '] BOOLEAN, [' +
        TC_17 + '] BOOLEAN, [' +
        TC_18 + '] BOOLEAN, [' +
        TC_19 + '] BOOLEAN, [' +
        TC_20 + '] BOOLEAN, [' +
        TC_21 + '] BOOLEAN, [' +
        TC_22 + '] TEXT, [' +
        TC_23 + '] TEXT, [' +
        TC_24 + '] TEXT, [' +
        TC_25 + '] TEXT, [' +
        TC_26 + '] TEXT, [' +
        TC_27 + '] TEXT, [' +
        TC_28 + '] TEXT, [' +
        TC_29 + '] TEXT, [' +
        TC_30 + '] INTEGER)';
        {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
        CustomDB.ExecSQL(SQL_ExecText);
    end;


  if Insert then begin
    {$ifdef debug} writeln('Exec insert...'); {$endif}
    SQL_ExecText:= 'INSERT INTO [' + Test_Table + '] VALUES (' +
    IntToStr(Vopros^.Vop_Num) + ', ''' +
    Hex_Array(Vopros^.Vop_Text, false) + ''', ' +
    IntToStr(Vopros^.Vop_Type) + ', ''' +
    Hex_Array(Vopros^.Vop_Image, false) + ''', ' +
    IntToStr(Vopros^.Var_Count) + ', ''' +
    Hex_Array(Vopros^.v[0], false) + ''', ''' +
    Hex_Array(Vopros^.v[1], false) + ''', ''' +
    Hex_Array(Vopros^.v[2], false) + ''', ''' +
    Hex_Array(Vopros^.v[3], false) + ''', ''' +
    Hex_Array(Vopros^.v[4], false) + ''', ''' +
    Hex_Array(Vopros^.v[5], false) + ''', ''' +
    Hex_Array(Vopros^.v[6], false) + ''', ''' +
    Hex_Array(Vopros^.v[7], false) + ''', ' +
    BoolToStr(Vopros^.UseImg[0]) + ', ' +
    BoolToStr(Vopros^.UseImg[1]) + ', ' +
    BoolToStr(Vopros^.UseImg[2]) + ', ' +
    BoolToStr(Vopros^.UseImg[3]) + ', ' +
    BoolToStr(Vopros^.UseImg[4]) + ', ' +
    BoolToStr(Vopros^.UseImg[5]) + ', ' +
    BoolToStr(Vopros^.UseImg[6]) + ', ' +
    BoolToStr(Vopros^.UseImg[7]) + ', ''' +
    Hex_Array(Vopros^.Image[0], false) + ''', ''' +
    Hex_Array(Vopros^.Image[1], false) + ''', ''' +
    Hex_Array(Vopros^.Image[2], false) + ''', ''' +
    Hex_Array(Vopros^.Image[3], false) + ''', ''' +
    Hex_Array(Vopros^.Image[4], false) + ''', ''' +
    Hex_Array(Vopros^.Image[5], false) + ''', ''' +
    Hex_Array(Vopros^.Image[6], false) + ''', ''' +
    Hex_Array(Vopros^.Image[7], false) + ''', ''' +
    IntToStr(Vopros^.Timer) + ''')';
    {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
    CustomDB.ExecSQL(SQL_ExecText);
  end else begin
    {$ifdef debug} writeln('No insert, Exec UPDATE...'); {$endif}
    SQL_ExecText:= 'UPDATE [' + Test_Table + '] SET [' +
      TC_2+ ']='''  + Hex_Array(Vopros^.Vop_Text, false) + ''', [' +
      TC_3+ ']='    + IntToStr(Vopros^.Vop_Type) + ', [' +
      TC_4+ ']='''  + Hex_Array(Vopros^.Vop_Image, false) + ''', [' +
      TC_5+ ']='    + IntToStr(Vopros^.Var_Count) + ', [' +
      TC_6+ ']='''  + Hex_Array(Vopros^.v[0], false) + ''', [' +
      TC_7+ ']='''  + Hex_Array(Vopros^.v[1], false) + ''', [' +
      TC_8+ ']='''  + Hex_Array(Vopros^.v[2], false) + ''', [' +
      TC_9+ ']='''  + Hex_Array(Vopros^.v[3], false) + ''', [' +
      TC_10+ ']=''' + Hex_Array(Vopros^.v[4], false) + ''', [' +
      TC_11+ ']=''' + Hex_Array(Vopros^.v[5], false) + ''', [' +
      TC_12+ ']=''' + Hex_Array(Vopros^.v[6], false) + ''', [' +
      TC_13+ ']=''' + Hex_Array(Vopros^.v[7], false) + ''', [' +
      TC_14+ ']='   + BoolToStr(Vopros^.UseImg[0]) + ', [' +
      TC_15+ ']='   + BoolToStr(Vopros^.UseImg[1]) + ', [' +
      TC_16+ ']='   + BoolToStr(Vopros^.UseImg[2]) + ', [' +
      TC_17+ ']='   + BoolToStr(Vopros^.UseImg[3]) + ', [' +
      TC_18+ ']='   + BoolToStr(Vopros^.UseImg[4]) + ', [' +
      TC_19+ ']='   + BoolToStr(Vopros^.UseImg[5]) + ', [' +
      TC_20+ ']='   + BoolToStr(Vopros^.UseImg[6]) + ', [' +
      TC_21+ ']='   + BoolToStr(Vopros^.UseImg[7]) + ', [' +
      TC_22+ ']=''' + Hex_Array(Vopros^.Image[0], false) + ''', [' +
      TC_23+ ']=''' + Hex_Array(Vopros^.Image[1], false) + ''', [' +
      TC_24+ ']=''' + Hex_Array(Vopros^.Image[2], false) + ''', [' +
      TC_25+ ']=''' + Hex_Array(Vopros^.Image[3], false) + ''', [' +
      TC_26+ ']=''' + Hex_Array(Vopros^.Image[4], false) + ''', [' +
      TC_27+ ']=''' + Hex_Array(Vopros^.Image[5], false) + ''', [' +
      TC_28+ ']=''' + Hex_Array(Vopros^.Image[6], false) + ''', [' +
      TC_29+ ']=''' + Hex_Array(Vopros^.Image[7], false) + ''', [' +
      TC_30+ ']='   + IntToStr(Vopros^.Timer) + ' WHERE [' + TC_1+ ']=' +
      IntToStr(Vopros^.Vop_Num);
    {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
    CustomDB.ExecSQL(SQL_ExecText);
  end;
  CustomDB.Free;
  Result:= True;
end;


{*****************************************************************
                Получение ответов пользователя
******************************************************************}
function Get_Result(DB_file: pChar; Results: pTResult): boolean;
var
  CustomDB: TSqlite3Dataset;
  SQL_ExecText: string = '';
  count: integer = 0;
begin
  {$ifdef debug} writeln('function Get_Result'); {$endif}
  Result:= false;
  if (DB_file = nil) or (Results = nil) then exit;
  if (DB_file = '') or (not FileExists(DB_file)) then exit;
  CustomDB:= TSqlite3Dataset.Create(nil);
  CustomDB.FileName:= DB_file;
  if not CustomDB.TableExists(Result_Table) then begin
    CustomDB.Free;
    exit;
  end;
  SQL_ExecText:= 'SELECT * FROM [' + Result_Table +
    '] WHERE [' + TC_01 + ']=' + IntToStr(Results^.Otv_Num);
  {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
  CustomDB.SQL:= SQL_ExecText;
  CustomDB.Open;
  while (not CustomDB.EOF) do begin
    CustomDB.Next;
    inc(count);
  end;
  if count = 1 then begin
    Results^.Otv_Type:=       CustomDB.Fields.Fields[1].AsInteger;
    Results^.Otv_Bool:=       CustomDB.Fields.Fields[2].AsBoolean;
    Results^.Esse_Text:=      Hex_Array(CustomDB.Fields.Fields[3].AsString, True);
    Results^.Text_Otvet[0]:=  Hex_Array(CustomDB.Fields.Fields[4].AsString, True);
    Results^.Text_Otvet[1]:=  Hex_Array(CustomDB.Fields.Fields[5].AsString, True);
    Results^.Text_Otvet[2]:=  Hex_Array(CustomDB.Fields.Fields[6].AsString, True);
    Results^.Text_Otvet[3]:=  Hex_Array(CustomDB.Fields.Fields[7].AsString, True);
    Results^.Text_Otvet[4]:=  Hex_Array(CustomDB.Fields.Fields[8].AsString, True);
    Results^.Text_Otvet[5]:=  Hex_Array(CustomDB.Fields.Fields[9].AsString, True);
    Results^.Text_Otvet[6]:=  Hex_Array(CustomDB.Fields.Fields[10].AsString, True);
    Results^.Text_Otvet[7]:=  Hex_Array(CustomDB.Fields.Fields[11].AsString, True);
    Results^.Bool_Otvet[0]:=  CustomDB.Fields.Fields[12].AsBoolean;
    Results^.Bool_Otvet[1]:=  CustomDB.Fields.Fields[13].AsBoolean;
    Results^.Bool_Otvet[2]:=  CustomDB.Fields.Fields[14].AsBoolean;
    Results^.Bool_Otvet[3]:=  CustomDB.Fields.Fields[15].AsBoolean;
    Results^.Bool_Otvet[4]:=  CustomDB.Fields.Fields[16].AsBoolean;
    Results^.Bool_Otvet[5]:=  CustomDB.Fields.Fields[17].AsBoolean;
    Results^.Bool_Otvet[6]:=  CustomDB.Fields.Fields[18].AsBoolean;
    Results^.Bool_Otvet[7]:=  CustomDB.Fields.Fields[19].AsBoolean;
    Results^.Over_Time:=      CustomDB.Fields.Fields[20].AsInteger;
    Result:= True;
  end;
  CustomDB.ClearFields;
  CustomDB.Close;
  CustomDB.Free;
end;


{**************************************************************
              Записать ответ пользователя
***************************************************************}
function Set_Result(DB_file: pChar; Results: pTResult): boolean;
var
  CustomDB: TSqlite3Dataset;
  Insert: boolean = true;
  SQL_ExecText: string = '';
  tCreate: boolean = false;
begin
  {$ifdef debug} writeln('function Set_Result'); {$endif}
  Result:= false;
  if (DB_file = nil) or (Results = nil) then exit;
  if (DB_file = '') then exit;
  CustomDB:= TSqlite3Dataset.Create(nil);
  {$ifdef debug} writeln('DB FILE = ', DB_File); {$endif}
  CustomDB.FileName:= DB_file;
  if FileExists(DB_file) then begin
    {Файл базы данных существует, проверяем наличие таблицы}
    if CustomDB.TableExists(Result_Table) then begin
      {Таблица найдена, проверяем наличие теста с этим кодом}
      {$ifdef debug} writeln('Table exists, Check TABLe ...'); {$endif}
      SQL_ExecText:= 'SELECT * FROM [' + Result_Table + '] WHERE [' + TC_01 + ']=' + IntToStr(Results^.Otv_Num);
      {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
      CustomDB.SQL:= SQL_ExecText;
      CustomDB.Open;
      {Если запись есть, то конца сразу не должно быть}
      Insert:= (CustomDB.EOF = true);
      {$ifdef debug} writeln('insert=', BoolToStr(Insert, True)); {$endif}
      CustomDB.Close;
    end else tCreate:= true;
  end else tCreate:= true;
  if tCreate then begin
      {Таблицы нет, создаем, Insert само собой...}
      Insert:= true;
      {$ifdef debug} writeln('CREATE TABLE...'); {$endif}
      SQL_ExecText:= 'CREATE TABLE [' + Result_Table + '] ([' +
        TC_01 + '] INTEGER PRIMARY KEY, ['+
        TC_02 + '] INTEGER, [' +
        TC_03 + '] BOOLEAN, [' +
        TC_04 + '] TEXT, [' +
        TC_05 + '] TEXT, [' +
        TC_06 + '] TEXT, [' +
        TC_07 + '] TEXT, [' +
        TC_08 + '] TEXT, [' +
        TC_09 + '] TEXT, [' +
        TC_010 + '] TEXT, [' +
        TC_011 + '] TEXT, [' +
        TC_012 + '] TEXT, [' +
        TC_013 + '] BOOLEAN, [' +
        TC_014 + '] BOOLEAN, [' +
        TC_015 + '] BOOLEAN, [' +
        TC_016 + '] BOOLEAN, [' +
        TC_017 + '] BOOLEAN, [' +
        TC_018 + '] BOOLEAN, [' +
        TC_019 + '] BOOLEAN, [' +
        TC_020 + '] BOOLEAN, [' +
        TC_021 + '] INTEGER)';
        {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
        CustomDB.ExecSQL(SQL_ExecText);
    end;


  if Insert then begin
    {$ifdef debug} writeln('Exec insert...'); {$endif}


    SQL_ExecText:= 'INSERT INTO [' + Result_Table + '] VALUES (' +
    IntToStr(Results^.Otv_Num) + ', ' +
    IntToStr(Results^.Otv_Type) + ', ' +
    BoolToStr(Results^.Otv_Bool) + ', ''' +
    Hex_Array(Results^.Esse_Text, false) + ''', ''' +
    Hex_Array(Results^.Text_Otvet[0], false) + ''', ''' +
    Hex_Array(Results^.Text_Otvet[1], false) + ''', ''' +
    Hex_Array(Results^.Text_Otvet[2], false) + ''', ''' +
    Hex_Array(Results^.Text_Otvet[3], false) + ''', ''' +
    Hex_Array(Results^.Text_Otvet[4], false) + ''', ''' +
    Hex_Array(Results^.Text_Otvet[5], false) + ''', ''' +
    Hex_Array(Results^.Text_Otvet[6], false) + ''', ''' +
    Hex_Array(Results^.Text_Otvet[7], false) + ''', ' +
    BoolToStr(Results^.Bool_Otvet[0]) + ', ' +
    BoolToStr(Results^.Bool_Otvet[1]) + ', ' +
    BoolToStr(Results^.Bool_Otvet[2]) + ', ' +
    BoolToStr(Results^.Bool_Otvet[3]) + ', ' +
    BoolToStr(Results^.Bool_Otvet[4]) + ', ' +
    BoolToStr(Results^.Bool_Otvet[5]) + ', ' +
    BoolToStr(Results^.Bool_Otvet[6]) + ', ' +
    BoolToStr(Results^.Bool_Otvet[7]) + ', ' +
    IntToStr(Results^.Over_Time) + ')';

    {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
    CustomDB.ExecSQL(SQL_ExecText);
  end else begin
    {$ifdef debug} writeln('No insert, Exec UPDATE...'); {$endif}
    SQL_ExecText:= 'UPDATE [' + Result_Table + '] SET [' +

      TC_02+  ']='   + IntToStr(Results^.Otv_Type) + ', [' +
      TC_03+  ']='   + BoolToStr(Results^.Otv_Bool) + ', [' +
      TC_04+  ']=''' + Hex_Array(Results^.Esse_Text, false) + ''', [' +
      TC_05+  ']=''' + Hex_Array(Results^.Text_Otvet[0], false) + ''', [' +
      TC_06+  ']=''' + Hex_Array(Results^.Text_Otvet[1], false) + ''', [' +
      TC_07+  ']=''' + Hex_Array(Results^.Text_Otvet[2], false) + ''', [' +
      TC_08+  ']=''' + Hex_Array(Results^.Text_Otvet[3], false) + ''', [' +
      TC_09+  ']=''' + Hex_Array(Results^.Text_Otvet[4], false) + ''', [' +
      TC_010+ ']=''' + Hex_Array(Results^.Text_Otvet[5], false) + ''', [' +
      TC_011+ ']=''' + Hex_Array(Results^.Text_Otvet[6], false) + ''', [' +
      TC_012+ ']=''' + Hex_Array(Results^.Text_Otvet[7], false) + ''', [' +
      TC_013+ ']='   + BoolToStr(Results^.Bool_Otvet[0]) + ', [' +
      TC_014+ ']='   + BoolToStr(Results^.Bool_Otvet[1]) + ', [' +
      TC_015+ ']='   + BoolToStr(Results^.Bool_Otvet[2]) + ', [' +
      TC_016+ ']='   + BoolToStr(Results^.Bool_Otvet[3]) + ', [' +
      TC_017+ ']='   + BoolToStr(Results^.Bool_Otvet[4]) + ', [' +
      TC_018+ ']='   + BoolToStr(Results^.Bool_Otvet[5]) + ', [' +
      TC_019+ ']='   + BoolToStr(Results^.Bool_Otvet[6]) + ', [' +
      TC_020+ ']='   + BoolToStr(Results^.Bool_Otvet[7]) + ', [' +
      TC_021+ ']='   + IntToStr(Results^.Over_Time) + ' WHERE [' + TC_01+ ']=' +
      IntToStr(Results^.Otv_Num);
    {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
    CustomDB.ExecSQL(SQL_ExecText);
  end;
  CustomDB.Free;
  Result:= True;
end;




{****************************************************************************
                Получение правильных ответов
*****************************************************************************}
function Get_Otvet(DB_file: pChar; Otvet: pTOtvet): boolean;
var
  CustomDB: TSqlite3Dataset;
  SQL_ExecText: string = '';
  count: integer = 0;
begin
  {$ifdef debug} writeln('function Get_Otvet'); {$endif}
  Result:= false;
  if (DB_file = nil) or (Otvet = nil) then exit;
  if (DB_file = '') or (not FileExists(DB_file)) then exit;
  CustomDB:= TSqlite3Dataset.Create(nil);
  CustomDB.FileName:= DB_file;
  if not CustomDB.TableExists(Otvet_Table) then begin
    CustomDB.Free;
    exit;
  end;
  SQL_ExecText:= 'SELECT * FROM [' + Otvet_Table +
    '] WHERE [' + TC_01 + ']=' + IntToStr(Otvet^.Otv_Num);
  {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
  CustomDB.SQL:= SQL_ExecText;
  CustomDB.Open;
  while (not CustomDB.EOF) do begin
    CustomDB.Next;
    inc(count);
  end;
  if count = 1 then begin
    Otvet^.Otv_Type:=       CustomDB.Fields.Fields[1].AsInteger;
    Otvet^.Otv_Bool:=       CustomDB.Fields.Fields[2].AsBoolean;
    Otvet^.Esse_Text:=      Hex_Array(CustomDB.Fields.Fields[3].AsString, True);
    Otvet^.Text_Otvet[0]:=  Hex_Array(CustomDB.Fields.Fields[4].AsString, True);
    Otvet^.Text_Otvet[1]:=  Hex_Array(CustomDB.Fields.Fields[5].AsString, True);
    Otvet^.Text_Otvet[2]:=  Hex_Array(CustomDB.Fields.Fields[6].AsString, True);
    Otvet^.Text_Otvet[3]:=  Hex_Array(CustomDB.Fields.Fields[7].AsString, True);
    Otvet^.Text_Otvet[4]:=  Hex_Array(CustomDB.Fields.Fields[8].AsString, True);
    Otvet^.Text_Otvet[5]:=  Hex_Array(CustomDB.Fields.Fields[9].AsString, True);
    Otvet^.Text_Otvet[6]:=  Hex_Array(CustomDB.Fields.Fields[10].AsString, True);
    Otvet^.Text_Otvet[7]:=  Hex_Array(CustomDB.Fields.Fields[11].AsString, True);
    Otvet^.Bool_Otvet[0]:=  CustomDB.Fields.Fields[12].AsBoolean;
    Otvet^.Bool_Otvet[1]:=  CustomDB.Fields.Fields[13].AsBoolean;
    Otvet^.Bool_Otvet[2]:=  CustomDB.Fields.Fields[14].AsBoolean;
    Otvet^.Bool_Otvet[3]:=  CustomDB.Fields.Fields[15].AsBoolean;
    Otvet^.Bool_Otvet[4]:=  CustomDB.Fields.Fields[16].AsBoolean;
    Otvet^.Bool_Otvet[5]:=  CustomDB.Fields.Fields[17].AsBoolean;
    Otvet^.Bool_Otvet[6]:=  CustomDB.Fields.Fields[18].AsBoolean;
    Otvet^.Bool_Otvet[7]:=  CustomDB.Fields.Fields[19].AsBoolean;
    Result:= True;
  end;
  CustomDB.ClearFields;
  CustomDB.Close;
  CustomDB.Free;
end;

{****************************************************************************
                Записать правильный ответо
*****************************************************************************}
function Set_Otvet(DB_file: pChar; Otvet: pTOtvet): boolean;
var
  CustomDB: TSqlite3Dataset;
  Insert: boolean = true;
  SQL_ExecText: string = '';
  tCreate: boolean = false;
begin
  {$ifdef debug} writeln('function Set_Otvet'); {$endif}
  Result:= false;
  if (DB_file = nil) or (Otvet = nil) then exit;
  if (DB_file = '') then exit;
  CustomDB:= TSqlite3Dataset.Create(nil);
  {$ifdef debug} writeln('DB FILE = ', DB_File); {$endif}
  CustomDB.FileName:= DB_file;
  if FileExists(DB_file) then begin
    {Файл базы данных существует, проверяем наличие таблицы}
    if CustomDB.TableExists(Otvet_Table) then begin
      {Таблица найдена, проверяем наличие теста с этим кодом}
      {$ifdef debug} writeln('Table exists, Check TABLe ...'); {$endif}
      SQL_ExecText:= 'SELECT * FROM [' + Otvet_Table + '] WHERE [' + TC_01 + ']=' + IntToStr(Otvet^.Otv_Num);
      {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
      CustomDB.SQL:= SQL_ExecText;
      CustomDB.Open;
      {Если запись есть, то конца сразу не должно быть}
      Insert:= (CustomDB.EOF = true);
      {$ifdef debug} writeln('insert=', BoolToStr(Insert, True)); {$endif}
      CustomDB.Close;
    end else tCreate:= true;
  end else tCreate:= true;
  if tCreate then begin
      {Таблицы нет, создаем, Insert само собой...}
      Insert:= true;
      {$ifdef debug} writeln('CREATE TABLE...'); {$endif}
      SQL_ExecText:= 'CREATE TABLE [' + Otvet_Table + '] ([' +
        TC_01 + '] INTEGER PRIMARY KEY, ['+
        TC_02 + '] INTEGER, [' +
        TC_03 + '] BOOLEAN, [' +
        TC_04 + '] TEXT, [' +
        TC_05 + '] TEXT, [' +
        TC_06 + '] TEXT, [' +
        TC_07 + '] TEXT, [' +
        TC_08 + '] TEXT, [' +
        TC_09 + '] TEXT, [' +
        TC_010 + '] TEXT, [' +
        TC_011 + '] TEXT, [' +
        TC_012 + '] TEXT, [' +
        TC_013 + '] BOOLEAN, [' +
        TC_014 + '] BOOLEAN, [' +
        TC_015 + '] BOOLEAN, [' +
        TC_016 + '] BOOLEAN, [' +
        TC_017 + '] BOOLEAN, [' +
        TC_018 + '] BOOLEAN, [' +
        TC_019 + '] BOOLEAN, [' +
        TC_020 + '] BOOLEAN)';
        {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
        CustomDB.ExecSQL(SQL_ExecText);
    end;


  if Insert then begin
    {$ifdef debug} writeln('Exec insert...'); {$endif}


    SQL_ExecText:= 'INSERT INTO [' + Otvet_Table + '] VALUES (' +
    IntToStr(Otvet^.Otv_Num) + ', ' +
    IntToStr(Otvet^.Otv_Type) + ', ' +
    BoolToStr(Otvet^.Otv_Bool) + ', ''' +
    Hex_Array(Otvet^.Esse_Text, false) + ''', ''' +
    Hex_Array(Otvet^.Text_Otvet[0], false) + ''', ''' +
    Hex_Array(Otvet^.Text_Otvet[1], false) + ''', ''' +
    Hex_Array(Otvet^.Text_Otvet[2], false) + ''', ''' +
    Hex_Array(Otvet^.Text_Otvet[3], false) + ''', ''' +
    Hex_Array(Otvet^.Text_Otvet[4], false) + ''', ''' +
    Hex_Array(Otvet^.Text_Otvet[5], false) + ''', ''' +
    Hex_Array(Otvet^.Text_Otvet[6], false) + ''', ''' +
    Hex_Array(Otvet^.Text_Otvet[7], false) + ''', ' +
    BoolToStr(Otvet^.Bool_Otvet[0]) + ', ' +
    BoolToStr(Otvet^.Bool_Otvet[1]) + ', ' +
    BoolToStr(Otvet^.Bool_Otvet[2]) + ', ' +
    BoolToStr(Otvet^.Bool_Otvet[3]) + ', ' +
    BoolToStr(Otvet^.Bool_Otvet[4]) + ', ' +
    BoolToStr(Otvet^.Bool_Otvet[5]) + ', ' +
    BoolToStr(Otvet^.Bool_Otvet[6]) + ', ' +
    BoolToStr(Otvet^.Bool_Otvet[7]) + ')';

    {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
    CustomDB.ExecSQL(SQL_ExecText);
  end else begin
    {$ifdef debug} writeln('No insert, Exec UPDATE...'); {$endif}
    SQL_ExecText:= 'UPDATE [' + Otvet_Table + '] SET [' +

      TC_02+  ']='   + IntToStr(Otvet^.Otv_Type) + ', [' +
      TC_03+  ']='   + BoolToStr(Otvet^.Otv_Bool) + ', [' +
      TC_04+  ']=''' + Hex_Array(Otvet^.Esse_Text, false) + ''', [' +
      TC_05+  ']=''' + Hex_Array(Otvet^.Text_Otvet[0], false) + ''', [' +
      TC_06+  ']=''' + Hex_Array(Otvet^.Text_Otvet[1], false) + ''', [' +
      TC_07+  ']=''' + Hex_Array(Otvet^.Text_Otvet[2], false) + ''', [' +
      TC_08+  ']=''' + Hex_Array(Otvet^.Text_Otvet[3], false) + ''', [' +
      TC_09+  ']=''' + Hex_Array(Otvet^.Text_Otvet[4], false) + ''', [' +
      TC_010+ ']=''' + Hex_Array(Otvet^.Text_Otvet[5], false) + ''', [' +
      TC_011+ ']=''' + Hex_Array(Otvet^.Text_Otvet[6], false) + ''', [' +
      TC_012+ ']=''' + Hex_Array(Otvet^.Text_Otvet[7], false) + ''', [' +
      TC_013+ ']='   + BoolToStr(Otvet^.Bool_Otvet[0]) + ', [' +
      TC_014+ ']='   + BoolToStr(Otvet^.Bool_Otvet[1]) + ', [' +
      TC_015+ ']='   + BoolToStr(Otvet^.Bool_Otvet[2]) + ', [' +
      TC_016+ ']='   + BoolToStr(Otvet^.Bool_Otvet[3]) + ', [' +
      TC_017+ ']='   + BoolToStr(Otvet^.Bool_Otvet[4]) + ', [' +
      TC_018+ ']='   + BoolToStr(Otvet^.Bool_Otvet[5]) + ', [' +
      TC_019+ ']='   + BoolToStr(Otvet^.Bool_Otvet[6]) + ', [' +
      TC_020+ ']='   + BoolToStr(Otvet^.Bool_Otvet[7]) + ' WHERE [' + TC_01+ ']=' +
      IntToStr(Otvet^.Otv_Num);
    {$ifdef debug} writeln('SQL_ExecText=', SQL_ExecText); {$endif}
    CustomDB.ExecSQL(SQL_ExecText);
  end;
  CustomDB.Free;
  Result:= True;
end;

{Очистка данных}
procedure Clear_Test(Vopros: pTVopros);
var a: byte;
begin
  if Vopros = nil then exit;
  Vopros^.Vop_Num:=   0;
  Vopros^.Vop_Text:=  '';
  Vopros^.Vop_Type:=  0;
  Vopros^.Vop_Image:= '';
  Vopros^.Var_Count:= 0;
  for a:= 0 to 7 do Vopros^.V[a]:= '';
  for a:= 0 to 7 do Vopros^.UseImg[a]:= false;
  for a:= 0 to 7 do Vopros^.Image[a]:=  '';
  Vopros^.Timer:=     0;
end;

procedure Clear_Results(Results: pTResult);
var a: byte;
begin
  if Results = nil then exit;
  Results^.Otv_Num:= 0;              {Код вопроса}
  Results^.Otv_Type:= 0;              {Тип вопроса}
  Results^.Otv_Bool:= false;              {Для ДА/НЕТ}
  Results^.Esse_Text:= '';              {Текст ответа в Esse}
  for a:= 0 to 7 do Results^.Text_Otvet[a]:= '';
  for a:= 0 to 7 do Results^.Bool_Otvet[a]:= false;
  Results^.Over_Time:= 0;
end;

procedure Clear_Otvet(Otvet: pTOtvet);
var a: byte;
begin
  if Otvet = nil then exit;
  Otvet^.Otv_Num:= 0;              {Код вопроса}
  Otvet^.Otv_Type:= 0;              {Тип вопроса}
  Otvet^.Otv_Bool:= false;              {Для ДА/НЕТ}
  Otvet^.Esse_Text:= '';              {Текст ответа в Esse}
  for a:= 0 to 7 do Otvet^.Text_Otvet[a]:= '';
  for a:= 0 to 7 do Otvet^.Bool_Otvet[a]:= false;
end;


procedure Init;
var
  Vopros: pTVopros;
  Results: pTResult;
  Otvet:   pTOTvet;

begin
  new(Vopros);
  new(Results);
  new(Otvet);

  Clear_Test(Vopros);
  Clear_Results(Results);
  Clear_Otvet(Otvet);

 
  Vopros^.Vop_Num:= 777;
  Vopros^.Vop_Text:='***';
  Vopros^.Vop_Type:=  0;
  Vopros^.Vop_Image:='***';
  Vopros^.Var_Count:= 0;
  Vopros^.v[0]:='***1';
  Vopros^.v[1]:='***2';
  Vopros^.v[2]:='***3';
  Vopros^.v[3]:='***4';
  Vopros^.v[4]:='***5';
  Vopros^.v[5]:='***6';
  Vopros^.v[6]:='***7';
  Vopros^.v[7]:='***8';
  Vopros^.UseImg[0]:= false;
  Vopros^.UseImg[1]:=  false;
  Vopros^.UseImg[2]:=  false;
  Vopros^.UseImg[3]:=  false;
  Vopros^.UseImg[4]:=  false;
  Vopros^.UseImg[5]:= false;
  Vopros^.UseImg[6]:=  false;
  Vopros^.UseImg[7]:= false;
  Vopros^.Image[0]:='***1';
  Vopros^.Image[1]:='***2';
  Vopros^.Image[2]:='***3';
  Vopros^.Image[3]:='***4';
  Vopros^.Image[4]:='***5';
  Vopros^.Image[5]:='***6';
  Vopros^.Image[6]:='***7';
  Vopros^.Image[7]:='***8';

  Results^.Otv_Num:= 777;              {Код вопроса}
  Results^.Otv_Type:=      9;              {Тип вопроса}
  Results^.Otv_Bool:= false;              {Для ДА/НЕТ}
  Results^.Esse_Text:= 'ESSE esse эссе';              {Текст ответа в Esse}
  Results^.Text_Otvet[0]:= '0';
  Results^.Text_Otvet[1]:= '1';
  Results^.Text_Otvet[2]:= '2';
  Results^.Text_Otvet[3]:= '3';
  Results^.Text_Otvet[4]:= '4';
  Results^.Text_Otvet[5]:= '5';
  Results^.Text_Otvet[6]:= '6';
  Results^.Text_Otvet[7]:= '7';
  Results^.Bool_Otvet[0]:= false;
  Results^.Bool_Otvet[1]:= false;
  Results^.Bool_Otvet[2]:= false;
  Results^.Bool_Otvet[3]:= false;
  Results^.Bool_Otvet[4]:= false;
  Results^.Bool_Otvet[5]:= false;
  Results^.Bool_Otvet[6]:= false;
  Results^.Bool_Otvet[7]:= false;
  Results^.Over_Time:= 0;
 
  Otvet^.Otv_Num:= 777;              {Код вопроса}
  Otvet^.Otv_Type:=      9;              {Тип вопроса}
  Otvet^.Otv_Bool:= false;              {Для ДА/НЕТ}
  Otvet^.Esse_Text:= 'ESSE esse эссе';              {Текст ответа в Esse}
  Otvet^.Text_Otvet[0]:= '0';
  Otvet^.Text_Otvet[1]:= '1';
  Otvet^.Text_Otvet[2]:= '2';
  Otvet^.Text_Otvet[3]:= '3';
  Otvet^.Text_Otvet[4]:= '4';
  Otvet^.Text_Otvet[5]:= '5';
  Otvet^.Text_Otvet[6]:= '6';
  Otvet^.Text_Otvet[7]:= '7';
  Otvet^.Bool_Otvet[0]:= false;
  Otvet^.Bool_Otvet[1]:= false;
  Otvet^.Bool_Otvet[2]:= false;
  Otvet^.Bool_Otvet[3]:= false;
  Otvet^.Bool_Otvet[4]:= false;
  Otvet^.Bool_Otvet[5]:= false;
  Otvet^.Bool_Otvet[6]:= false;
  Otvet^.Bool_Otvet[7]:= false;
 
  Set_Test('m1.db', Vopros);
  Set_Result('m1.db', Results);
  Set_Otvet('m1.db', Otvet);
 
  Clear_Test(Vopros);
  Clear_Results(Results);
  Clear_Otvet(Otvet);

  Vopros^.Vop_Num:= 777;
  Results^.Otv_Num:= 777;
  Otvet^.Otv_Num:= 777;
 
  Get_Test('m1.db', Vopros);
  Get_Result('m1.db', Results);
  Get_Otvet('m1.db', Otvet);


    Writeln(Vopros^.Vop_Num, ' ',
    Vopros^.Vop_Text, ' ',
    Vopros^.Vop_Type, ' ',
    Vopros^.Vop_Image, ' ',
    Vopros^.Var_Count, ' ',
    Vopros^.v[0], ' ',
    Vopros^.v[1], ' ',
    Vopros^.v[2], ' ',
    Vopros^.v[3], ' ',
    Vopros^.v[4], ' ',
    Vopros^.v[5], ' ',
    Vopros^.v[6], ' ',
    Vopros^.v[7], ' ',
    Vopros^.UseImg[0], ' ',
    Vopros^.UseImg[1], ' ',
    Vopros^.UseImg[2], ' ',
    Vopros^.UseImg[3], ' ',
    Vopros^.UseImg[4], ' ',
    Vopros^.UseImg[5], ' ',
    Vopros^.UseImg[6], ' ',
    Vopros^.UseImg[7], ' ',
    Vopros^.Image[0], ' ',
    Vopros^.Image[1], ' ',
    Vopros^.Image[2], ' ',
    Vopros^.Image[3], ' ',
    Vopros^.Image[4], ' ',
    Vopros^.Image[5], ' ',
    Vopros^.Image[6], ' ',
    Vopros^.Image[7], ' ',
    Vopros^.Timer);

    Writeln(
    Results^.Otv_Num, ' ',
    Results^.Otv_Type, ' ',
    Results^.Otv_Bool,  ' ',
    Results^.Esse_Text, ' ',
    Results^.Text_Otvet[0], ' ',
    Results^.Text_Otvet[1], ' ',
    Results^.Text_Otvet[2], ' ',
    Results^.Text_Otvet[3], ' ',
    Results^.Text_Otvet[4], ' ',
    Results^.Text_Otvet[5], ' ',
    Results^.Text_Otvet[6], ' ',
    Results^.Text_Otvet[7], ' ',
    Results^.Bool_Otvet[0], ' ',
    Results^.Bool_Otvet[1], ' ',
    Results^.Bool_Otvet[2], ' ',
    Results^.Bool_Otvet[3], ' ',
    Results^.Bool_Otvet[4], ' ',
    Results^.Bool_Otvet[5], ' ',
    Results^.Bool_Otvet[6], ' ',
    Results^.Bool_Otvet[7], ' ',
    Results^.Over_Time );

    Writeln(Otvet^.Otv_Num,  ' ',
    Otvet^.Otv_Type, ' ',
    Otvet^.Otv_Bool, ' ',
    Otvet^.Esse_Text, ' ',
    Otvet^.Text_Otvet[0], ' ',
    Otvet^.Text_Otvet[1], ' ',
    Otvet^.Text_Otvet[2], ' ',
    Otvet^.Text_Otvet[3], ' ',
    Otvet^.Text_Otvet[4], ' ',
    Otvet^.Text_Otvet[5], ' ',
    Otvet^.Text_Otvet[6], ' ',
    Otvet^.Text_Otvet[7], ' ',
    Otvet^.Bool_Otvet[0], ' ',
    Otvet^.Bool_Otvet[1], ' ',
    Otvet^.Bool_Otvet[2], ' ',
    Otvet^.Bool_Otvet[3], ' ',
    Otvet^.Bool_Otvet[4], ' ',
    Otvet^.Bool_Otvet[5], ' ',
    Otvet^.Bool_Otvet[6], ' ',
    Otvet^.Bool_Otvet[7]);
 

  FreeMem(Vopros);
  FreeMem(Otvet);
  FreeMem(Results);
end;


{***************************************************************************
  Преобразует текст в Hex-массив или массив в текст (если ToText = true)
****************************************************************************}
function Hex_Array(Input: string; ToText: boolean = false): string;
var
  Len:    integer;
  OutStr: string;
  Mem:    integer;
begin
  //{$ifdef debug} writeln('function Hex_Array Input=' + Input); {$endif}
  Result:= '';
  Len:= Length(Input);
  if ToText then Mem:= Len div 2 else Mem:= Len * 2;
  SetLength(OutStr, Mem);
  if ToText then
    HexToBin(pChar(Input), pChar(OutStr), Len)
  else
    BinToHex(pChar(Input), pChar(OutStr), Len);
  Result:= OutStr;
  //{$ifdef debug} writeln('function Hex_Array OutStr=' + OutStr); {$endif}
  {Len:= Length(Input);
  SetLength(OutStr, Mem);
  OutStr:= Input;
  Result:= OutStr;}
 
end;

end.


Сама sqlite3.dll весит 355 КБ (363 609 байт)
Администратора для базы можно взять здесь http://download.orbmu2k.de/files/sqliteadmin.zip
Аватара пользователя
NXP
постоялец
 
Сообщения: 187
Зарегистрирован: 02.01.2008 16:11:56
Откуда: Воронеж

Сообщение ev » 27.04.2008 16:24:17

Хм... а почему именно по ГОСТу? (я знаю, о каком идет речь, и знаю, что не буду даже пытаться)

мыж в россии живем
зачем нам забугорные стандарты? ;)
на самом деле не очень сложный алгоритм...
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение Troublemaker » 27.04.2008 16:37:08

NXP писал(а):
Troublemaker писал(а):Насчет SQLite - не использовал, поэтому не хочу пока связываться

Это зря, она не так страшна. Вот рабочий пример, не красивый, но полностью рабочий
Причем главная некрасивость - в неуниверсальности. И в отсутствии осмысленных комментариев в тексте.

Я понимаю, что критиковать чужое всегда легче, но лично я не понял назначения поля "тип вопроса".

Господа, мы, однако, отклонились от основного вопроса: так как же связывать поля, описанные в DS с полями, прописанными в DBGrid? Можно по шагам?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение Vadim » 27.04.2008 17:48:11

Troublemaker
Если речь будет идти об обмене текстовыми файлами, то можно использовать пакет SDF (Lazarus/Components/Sdf). В нем есть два компонента для работы с текстовыми файлами как с источниками данных, типа как с DBF.
Порядок работы стандартный. На форме:
- SdfDataset (для примера), как контейнер содержащий текстовый файл с данными.
- DataSource (в нём указывается TSdfDataset, который выше), для связи между текстовым файлом(контейнером) и DBGrid.
- DBGrid (в нём указывается DataSource, который выше) для отображения данных из файла.
C TDBF точно так же.
Или я неправильно понял суть задачи?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru