Основы работы с БД
Модератор: Модераторы
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Основы работы с БД
Приветствую!
Существует ли какой-нибудь пошаговый шпаргальник, где было бы показано как создать dataset, связать его с DS и DBGrid?
Непонятка у меня с отображением полей - никак не пойму, где же устанавливается связь между полями в базе и полями в гриде - везде отдельные описания fielddefs и не ясно, то ли при совпадении имен полей они связываются (поля в DS и столбцы в гриде) автоматически, то ли как-то иначе? Посмотрел пример addressbook и основанный на нем contacts, но не смог понять логики.
На дельфи никогда не писал, но опыт работы с СУБД есть - неплохо знаю Clarion. Там эти вопросы решаютсся проще - каждая строка в аналоге грида есть массив строк с различными атрибутами, где каждый элемент массива - отдельный столбец. А сами строки обычно хранятся в специальной структуре - "очередь", что-то вроде классического двунаправленного списка (^prev, data, ^next).
В идеале буду благодарен за "распальцовку" такого задания (дальше, думаю, справлюсь по аналогии):
1. в базе (TDBF) одна таблица, два поля (bool и string)
2. как правильно отобразить эту таблицу в dgbrid-e?
DS, tDBF имеются. Куда что нужно прописывать?
Существует ли какой-нибудь пошаговый шпаргальник, где было бы показано как создать 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 писал(а):Troublemaker писал(а):можно ли в dbgrid отображать значения boolean-полей в виде чекбоксов - вкл/выкл?
готового решения нет, ручками можно.
Можно чуть подробнее? В кларионе это решалось так: столбцу назначался атрибут icon, значение которого рассчитывалось в зависимости от значения поля. В случае с логическими полями в зависимости от t/f тупо выбиралась иконка "вкл" или "выкл". Но здесь я не вижу похожего.
Нужно нечто локально-автономное.Attid писал(а):дбф тебе зачем ? портируешь что-то или с нуля ? лучше firebird или SQLite.в базе (TDBF) одна таблица, два поля (bool и string)
Постановка всей задачи примерно такова:
Нужна система дистанционной сдачи экзаменов и/или выполнения лабораторных работ. Это будет мой диплом.
Ситуация осложняется тем, что использовать для нее коммерческие продукты нельзя, и работать оно должно как в виндах, так и в никсах.
Вариантов инструментовки немного. 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 писал(а):Используйте embedded-версию.Troublemaker писал(а):тащить сервер FB на машину студента
Остроумно. Шутку оценил. Каков объем этой версии? Куда она embedded - прямо в Lazarus? Она будет внедрена в исполняемый файл моей задачи? А чем смотреть ее файлы данных без сервера, пусть и локального?
См. выше мои соображения насчет формата хранения. Впрочем, к дбфу я привязался больше по привычке, между клиентом и сервером может вообще бегать просто шифрованный кусок данных типа file of string[64], например. Внутри всё это будет закачиваться в memds и обрабатываться уже через него.
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Troublemaker писал(а):В кларионе это решалось так: столбцу назначался атрибут icon, значение которого рассчитывалось в зависимости от значения поля. В случае с логическими полями в зависимости от t/f тупо выбиралась иконка "вкл" или "выкл".
может стоит взглянуть на МСЕ ? там примерно также.
Troublemaker писал(а):Остроумно. Шутку оценил. Каков объем этой версии? Куда она embedded - прямо в Lazarus? Она будет внедрена в исполняемый файл моей задачи? А чем смотреть ее файлы данных без сервера, пусть и локального?
это отдельный ДЛЛ размер если не путаю примерно 2 метра. её даете один раз вместе с приложением.
если пугает размер то SQLLite вроде 500 кб.
Troublemaker писал(а):А чем смотреть ее файлы данных без сервера, пусть и локального?
твоей программой или есть "Утилита администрирования и управления БД" на этом форуме.
но для этой задачи я бы не использовал БД, лучше файс собственного формата с шифрованными типозированными записями.
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Что есть MCE?Attid писал(а):может стоит взглянуть на МСЕ ? там примерно также.Troublemaker писал(а):столбцу назначался атрибут icon, ... В случае с логическими полями в зависимости от t/f тупо выбиралась иконка "вкл" или "выкл".
Да, я и сам всё больше склоняюсь к такому варианту: всосал файл с заданиями, выплюнул файл с ответами. Но неохота писать всю внутреннюю обработку файла - создание динамических очередей и т.п., поэтому и хочу внутри использовать memdsAttid писал(а):но для этой задачи я бы не использовал БД, лучше файс собственного формата с шифрованными типозированными записями.
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Troublemaker писал(а):Что есть MCE?
http://freepascal.ru/forum/viewtopic.php?t=2111&start=0
поэтому и хочу внутри использовать memds
ну затени файл его прочитал в memds поработал записал обратно, загрузка то за пол часа пишется. шифрование еще полчаса.
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Attid писал(а):ну затени файл его прочитал в memds поработал записал обратно, загрузка то за пол часа пишется. шифрование еще полчаса.
Затени? Э-э, пардон, что имеется в виду? ЗатЯнуть или использовать какую-то технологию "memory-mapped file"? Или что-то третье?
Если есть желание и позволяет время, черновик поясниловки можно глянуть здесь, мне нужна (внутри программы) классическая РБД с четырьмя таблицами, связанными "1:М".
Хм... а почему именно по ГОСТу? (я знаю, о каком идет речь, и знаю, что не буду даже пытаться)ev писал(а):напишите кто-нить шифрование по госту за полчаса - буду очень благодарен
- NXP
- постоялец
- Сообщения: 187
- Зарегистрирован: 02.01.2008 15:11:56
- Откуда: Воронеж
- Контактная информация:
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
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Причем главная некрасивость - в неуниверсальности. И в отсутствии осмысленных комментариев в тексте.NXP писал(а):Troublemaker писал(а):Насчет SQLite - не использовал, поэтому не хочу пока связываться
Это зря, она не так страшна. Вот рабочий пример, не красивый, но полностью рабочий
Я понимаю, что критиковать чужое всегда легче, но лично я не понял назначения поля "тип вопроса".
Господа, мы, однако, отклонились от основного вопроса: так как же связывать поля, описанные в DS с полями, прописанными в DBGrid? Можно по шагам?
Troublemaker
Если речь будет идти об обмене текстовыми файлами, то можно использовать пакет SDF (Lazarus/Components/Sdf). В нем есть два компонента для работы с текстовыми файлами как с источниками данных, типа как с DBF.
Порядок работы стандартный. На форме:
- SdfDataset (для примера), как контейнер содержащий текстовый файл с данными.
- DataSource (в нём указывается TSdfDataset, который выше), для связи между текстовым файлом(контейнером) и DBGrid.
- DBGrid (в нём указывается DataSource, который выше) для отображения данных из файла.
C TDBF точно так же.
Или я неправильно понял суть задачи?
Если речь будет идти об обмене текстовыми файлами, то можно использовать пакет SDF (Lazarus/Components/Sdf). В нем есть два компонента для работы с текстовыми файлами как с источниками данных, типа как с DBF.
Порядок работы стандартный. На форме:
- SdfDataset (для примера), как контейнер содержащий текстовый файл с данными.
- DataSource (в нём указывается TSdfDataset, который выше), для связи между текстовым файлом(контейнером) и DBGrid.
- DBGrid (в нём указывается DataSource, который выше) для отображения данных из файла.
C TDBF точно так же.
Или я неправильно понял суть задачи?
