Интерфейс прикладного программирования ВDЕ
При открытии главной формы (метод-обработчик 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;