Использование API BDE для представления данных
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, BDE, ExtCtrls;
type
TMainForm = class(TForm)
PriorBtn: TBitBtn;
Panel2: TPanel;
NextBtn: TBitBtn;
Label3: TLabel;
CountryEdit: TEdit;
Label1: TLabel;
CapitalEdit: TEdit;
procedure PriorBtnClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure NextBtnClick(Sender: TObject);
private
hDB: hDBIDB;
hCur: hDBICur;
CursProps: CurProps;
RecBuf: pByte;
FValue: array[0..255] of Char;
IsEmpty: Bool;
procedure OnBDEError;
public
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
procedure TMainForm.OnBDEError;
var ErrInfo: dbiErrInfo; //Структура, содержащая информацию об ошибках
AStr: string;
begin
DbiGetErrorInfo(True, ErrInfo); //Функция возвращает информацию об ошибке
case ErrInfo.iError of
9733: AStr := 'Для создания записи недостаточно параметров ';
10024: AStr := 'Ошибка доступа к данным';
10245: AStr := 'База данных занята другим пользователем';
10038: AStr := 'Значение поля задано неверно';
11871: AStr := 'Несоответствие типов';
11959: AStr := 'В выражении отсутствует оператор GROUP BY';
else
AStr := 'Ошибочная операция с данными';
end;
ShowMessage(AStr);
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
hDB := nil;
hCur := nil;
DbiInit(nil); // Инициализация системы BDE
DbiOpenDatabase // Открытие базы данных
(
'DBDEMOS', // Псевдоним базы данных
nil, // Тип базы данных
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
nil, // Пароль
0, // Число дополнительных параметров
nil, // Перечень полей для доп. параметров
nil, // Список доп. параметров
hDB // Дескриптор базы данных
);
DbiSetPrivateDir('c:\temp'); // Определение временного каталога
DbiOpenTable // Открытие таблицы
(
hDB, // Дескриптор базы данных
PChar('COUNTRY'), // Название таблицы
PChar(szParadox), // Тип таблицы (только для локальных БД)
nil, // Название индекса (необязательный)
nil, // IndexTagName - только для dBASE
0, // 0 - использовать первичный индекс
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
xltField, // Режим трансляции данных
False, // Признак одностороннего перемещения курсора
nil, // Дополнительные параметры
hCur // Дескриптор курсора таблицы
);
DbiGetCursorProps // Определение параметров курсора
(
hCur, // Дескриптор курсора таблицы
CursProps // Структура параметров курсора
);
GetMem(RecBuf, CursProps.iRecbufSize * SizeOf(Byte)); // Выделение памяти под буфер записи
DbiSetToBegin(hCur); // Установка курсора в начало набора данных
DbiGetNextRecord // Перемещение на первую запись
(
hCur, // Дескриптор курсора таблицы
dbiNoLock, // Режим ограничения доступа
RecBuf, // Буфер записи
nil // Параметры записи
);
DbiGetField // Получение значения поля
(
hCur, // Дескриптор курсора таблицы
1, // Номер поля в структуре таблицы
RecBuf, // Буфер записи
@FValue, // Переменная, в кторую передается значение
IsEmpty // Признак пустой ячейки
);
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
finally
FreeMem(RecBuf); // Освобождение памяти буфера записи
DbiCloseCursor(hCur); // Закрытие курсора
DbiCloseDatabase(hDB); // Закрытие базы данных
DbiExit; // Закрытие сеанса работы с BDE
end
end;
procedure TMainForm.PriorBtnClick(Sender: TObject);
begin
try
if DbiGetPriorRecord(hCur, dbiNoLock, RecBuf, nil) = DBIERR_BOF
then PriorBtn.Enabled := False
else
begin
if not NextBtn.Enabled then NextBtn.Enabled := True;
DbiGetField(hCur, 1, RecBuf, @FValue, IsEmpty);
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
except
OnBDEError;
end;
end;
procedure TMainForm.NextBtnClick(Sender: TObject);
begin
try
if DbiGetNextRecord(hCur, dbiNoLock, RecBuf, nil) = DBIERR_EOF
then NextBtn.Enabled := False
else
begin
if not PriorBtn.Enabled then PriorBtn.Enabled := True;
DbiGetField(hCur, 1, RecBuf, @FValue, IsEmpty);
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
except
OnBDEError;
end;
end;
end.
Скачать весь проект
|