Главная форма проекта BDEEmptyTable
Рисунок 16.4. Главная форма проекта BDEEmptyTable
Полная очистка таблиц базы данных осуществляется функцией DbiErr.ptyTable из API BDE. Именно она используется в демонстрационном приложении для радикального уменьшения размера таблиц.
Примечание
Примечание
Функция DbiEmptyTable используется в методе EmptyTable компонентов доступа к данным (см. гл. 17).
В листинге 16.1 приведен исходный код этого приложения. Помимо указанной функции, в нем используются функции создания списка параметров доступных баз данных и таблиц текущей базы данных.
Листинг 16.1. Модуль главной формы приложения BDEEmptyTable
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, BDE, ExtCtrls, DBCtrls, Grids, DBGrids, Db, DBTables, Buttons;
type
TMainForm = class(TForm)
AliasesList: TComboBox;
TablesList: TComboBox;
EmptyBtn: TBitBtn;
Labell: TLabel;
Label2: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure AliasesListChange(Sender: TObject);
procedure EmptyBtnClick(Sender: TObject); private
hDB: hDBIDB;
hCursor: hDBICur;
DBDesc: DBDesc;
TblDesc : TBLBaseDesc;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
procedure TMainForm.FormShow(Sender: TObject);
var Rslt: DBIResult;
begin
AliasesList.Items.Clear;
TablesList.Items.Clear; hDB := Nil;
try
DbiInit(Nil); // Инициалы BDE
BDE DbiOpenDatabaseList(hCursor) ;
repeat
Rslt:= DbiGetNextRecord(hCursor, dbiNOLOCK, @DBDesc, nil) ;
if (Rslt 0 DBIERR_EOF) then
AliasesList.Items.Add(StrPas(DBDesc.szName));
until (rslt <> DBIERR_NONE); DbiCloseCursor(hCursor) ;
except
on E:EDBEngineError do ShowMessage ('OiiMSKa MHMunajiM3auMM BDE');
end;
end;
procedure TMainForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
try
finally
if hDB <> Nil then DbiCloseDatabase(hDB);// Закрытие базы данных
DbiExit; // Закрытие сеанса работы с ВОЕ
end
end;
procedure TMainForm.AliasesListChange(Sender: TObject);
begin
try
if hDB <> Nil
then DbiCloseDatabase(hDB);// Закрытие базы данных
DbiOpenDatabase // Открытие базы данных
(
PChar(AliasesList.Text), // Псевдоним базы данных
Nil, // Тип базы данных
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
Nil, // Пароль
0, // Число дополнительных параметров
Nil, // Перечень полей для доп. параметров Nil,
// Список доп. параметров hDB
// Дескриптор базы данных
);
DbiSetPrivateDir('с:\temp');// Определение временного каталога
DbiOpenTableList(hDb, False, False, '*.DB', hCursor);
TablesList.Items.Clear;
TablesList.Clear;
while DbiGetNextRecord(hCursor, dbiNOLOCK, @TblDesc, nil) = dbiErr_None
do TablesList.Items.Add(TblDesc.szName);
DbiCloseCursor(hCursor);
except
on E:EDBEngineError do ShowMessage('Ошибка открытия базы данных');
end;
end;
procedure TMainForm.EmptyBtnClick(Sender: TObject);
begin
try
DbiEmptyTable(hDB, Nil, PChar(TablesList.Text), '');
except
on E:EDBEngineError do ShowMessage('Неверно задана таблица'};
end;
end;
end.
При открытии главной формы (метод-обработчик FormShow) функция Dbiinit осуществляет инициализацию BDE. Затем функция DbiOpenDatabaseList создает в памяти временную таблицу, в которую записываются характеристики каждой зарегистрированной базы данных. Для этого применяется структура DBDesc. Курсор hcursor обеспечивает доступ к записям о базах данных.
После этого функция DbiGetNextRecord позволяет осуществить последовательное считывание имен псевдонимов баз данных (для этого в параметре передается указатель на структуру DBDesс) и их запись в список компонента AliasesList типа TComboBox.
При выборе из этого списка конкретного псевдонима работает метод-обработчик AliasesListchange. В нем открывается соответствующая база данных (функция DbiOpenDatabase), доступ к которой в дальнейшем осуществляется через дескриптор hDB.
Функция DbiopenTableList создает временную таблицу в памяти, в которую помещаются данные о таблицах выбранной базы данных в соответствии с форматом структуры TBLBaseDesс. Функция DbiGetNextRecord позволяет передать эту информацию в список компонента TablesList типа TCombоВох.
При щелчке на кнопке EmptyBtn в методе-обработчике EmptyBtndick работает функция DbiEmptyTabie, которая очищает выбранную ранее в компоненте TablesList таблицу.
Теперь рассмотрим пример простейшего приложения, которое может отображать два поля из таблицы COUNTRY. DВ в демонстрационной базе данных DBDEMOS. Эта база данных поставляется в комплекте Delphi. В примере использованы только функции API BDE.
Проект называется DirectBDE и имеет только одну форму, в которой отображаются сведения из таблицы COUNTRY. DB о государствах и их столицах (Рисунок 16.5). Кнопки в нижней части формы позволяют перемещаться по набору данных.
Листинг 16.2. Модуль главной формы приложения DirectBDE
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, BDE, ExtCtrls;
type
TMainForm = class(TForm)
PriorBtn: TBitBtn;
Panel2: ТPanel;:
NextBtn: TBitBtn;
Label3: ТLabel;
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: dbiErrlnfo; // Структура, содержащая информацию об ошибках
AStr: String;
begin
DbiGetErrorlnfo(True, Errlnfo);// Функция возвращает информацию об ошибке c
ase Errlnfo.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;
Dbilnit(Nil); // Инициализация системы
BDE DbiOpenDatabase // Открытие базы данных
(
'DBDEMOS', // Псевдоним базы данных
Nil, // Тип базы данных
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
Nil, // Пароль
0, // Число дополнительных параметров
Nil, // Перечень полей для доп. параметров
Nil, // Список доп. параметров
hDB // Дескриптор базы данных
);
DbiSetPrivateDir('с:\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; // Закрытие сеанса работы с ВОЕ
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, SFValue, 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;
DbiGetFieldfhCur, 1, RecBuf, @FValue, IsEmpty);
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
except
OnBDEError;
end;
end;
end.