unit tcmain;
{ Демонстрация cbTableChange }
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables, ExtCtrls, DBCtrls, Grids, DBGrids, BDE, StdCtrls;
const
WM_UPDATETABLE = WM_USER + 1;
type
TForm1 = class(TForm) Table1: TTable; DataSource1: TDataSource; DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; Timer1: TTimer; Button1: TButton; procedure Table1AfterOpen(DataSet: TDataSet); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private FChgCnt: Integer; FCB: TBDECallback; function TableChangeCallBack(CBInfo: Pointer): CBRType; procedure UpdateTableData(var Msg: TMessage); message WM_UPDATETABLE; end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Это функция, вызываемая функцией обратного вызова.
function TForm1.TableChangeCallBack(CBInfo: Pointer): CBRType; begin
Inc(FChgCnt); Caption := IntToStr(FChgCnt); MessageBeep(0); // Здесь мы не можем вызвать Table1.Refresh, делаем это позже. PostMessage(Handle, WM_UPDATETABLE, 0, 0); end;
// Данная функция вызывается в ответ на PostMessage (см. выше).
procedure TForm1.UpdateTableData(var Msg: TMessage); begin
// Не пытайтесь вызвать обновление, если мы в "середине" редактирования. if (Table1.State = dsBrowse) then Table1.Refresh; end;
procedure TForm1.Table1AfterOpen(DataSet: TDataSet); begin
// Установка обратного вызова. FCB := TBDECallback.Create(Self, Table1.Handle, cbTableChanged, nil, 0, TableChangeCallBack); end;
procedure TForm1.FormCreate(Sender: TObject); begin
Table1.DatabaseName := ExtractFilePath(ParamStr(0)); Table1.Open; end;
procedure TForm1.Timer1Timer(Sender: TObject); var
SeqNo: Longint; begin
// События таймера просто осуществляют вызов DbiGetSeqNo для получения доступа к таблице. // В противном случае мы не хотим делать обратный вызов, пока что-то делаем // (типа прокрутки) для получения доступа к данным. DbiGetSeqNo вызывается в случае, // если таблица не активна. if Table1.State <> dsInActive then DbiGetSeqNo(Table1.Handle, SeqNo); end;
end.
|