TCMAIN.PAS:
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);privateFChgCnt: 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) thenTable1.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 thenDbiGetSeqNo(Table1.Handle, SeqNo);end; end. |
TCMAIN.TXT:
object Form1: TForm1 Left = 270Top = 230Width = 361Height = 251Caption = 'Form1'PixelsPerInch = 96OnCreate = FormCreateTextHeight = 13object DBGrid1: TDBGridLeft = 0Top = 83Width = 353Height = 141Align = alBottomDataSource = DataSource1TabOrder = 0endobject DBNavigator1: TDBNavigatorLeft = 96Top = 4Width = 240Height = 25DataSource = DataSource1TabOrder = 1endobject Button1: TButtonLeft = 132Top = 36Width = 75Height = 25Caption = 'Button1'TabOrder = 2OnClick = Timer1Timerendobject Table1: TTableAfterOpen = Table1AfterOpenDatabaseName = 'DBDEMOS'TableName = 'VENDORS.DB'Left = 16Top = 8endobject DataSource1: TDataSourceDataSet = Table1Left = 52Top = 8endobject Timer1: TTimerOnTimer = Timer1TimerLeft = 80Top = 28endend |
- Mark Edington [000985]