Delphi World - Использование API BDE для представления данных
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Использование 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.

Скачать весь проект

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования