Набор данных для отладкиDelphi , Базы данных , Таблицыunit DebugSet; interface uses DbTables, Classes, Controls, Db, SysUtils; type TDebugNotify = procedure(const DegubStr: string) of object; TDebugDataSet = class(TTable) private FDebugNotify: TDebugNotify; protected // TDataSet virtual abstract methods function AllocRecordBuffer: PChar; override; procedure FreeRecordBuffer(var Buffer: PChar); override; procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override; function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override; function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override; function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override; function GetRecordSize: Word; override; procedure InternalAddRecord(Buffer: Pointer; Append: Boolean); override; procedure InternalClose; override; procedure InternalDelete; override; procedure InternalFirst; override; procedure InternalGotoBookmark( Bookmark: Pointer); override; procedure InternalHandleException; override; procedure InternalInitFieldDefs; override; procedure InternalInitRecord(Buffer: PChar); override; procedure InternalLast; override; procedure InternalOpen; override; procedure InternalPost; override; procedure InternalSetToRecord(Buffer: PChar); override; function IsCursorOpen: Boolean; override; procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override; procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override; procedure SetFieldData(Field: TField; Buffer: Pointer); override; // TDataSet virtual methods (optional) procedure InternalRefresh; override; function GetRecordCount: Integer; override; procedure SetRecNo(Value: Integer); override; function GetRecNo: Integer; override; public property OnDebugNotify: TDebugNotify read FDebugNotify write FDebugNotify; end; implementation procedure TDebugDataSet.InternalOpen; begin if Assigned(FDebugNotify) then FDebugNotify('InternalOpen'); inherited; end; procedure TDebugDataSet.InternalInitFieldDefs; begin if Assigned(FDebugNotify) then FDebugNotify('InternalInitFieldDefs'); inherited; end; procedure TDebugDataSet.InternalClose; begin FDebugNotify('InternalClose'); inherited; end; function TDebugDataSet.IsCursorOpen: Boolean; begin Result := inherited IsCursorOpen; if Result then if Assigned(FDebugNotify) then FDebugNotify('IsCursorOpen: True') else if Assigned(FDebugNotify) then FDebugNotify('IsCursorOpen: False'); end; procedure TDebugDataSet.InternalGotoBookmark(Bookmark: Pointer); begin FDebugNotify('InternalGotoBookmark' + IntToStr(Integer(Bookmark))); inherited; end; procedure TDebugDataSet.InternalSetToRecord(Buffer: PChar); begin if Assigned(FDebugNotify) then FDebugNotify('InternalSetToRecord'); inherited; end; function TDebugDataSet.GetBookmarkFlag( Buffer: PChar): TBookmarkFlag; begin FDebugNotify('GetBookmarkFlag'); Result := inherited GetBookmarkFlag(Buffer); end; procedure TDebugDataSet.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); begin if Assigned(FDebugNotify) then FDebugNotify('SetBookmarkFlag'); inherited; end; procedure TDebugDataSet.GetBookmarkData( Buffer: PChar; Data: Pointer); begin if Assigned(FDebugNotify) then FDebugNotify('GetBookmarkData'); inherited; end; procedure TDebugDataSet.SetBookmarkData( Buffer: PChar; Data: Pointer); begin if Assigned(FDebugNotify) then FDebugNotify('SetBookmarkData'); inherited; end; function TDebugDataSet.GetRecordSize: Word; begin Result := inherited GetRecordSize; if Assigned(FDebugNotify) then FDebugNotify('GetRecordSize: ' + IntToStr(Result)); end; function TDebugDataSet.AllocRecordBuffer: PChar; begin if Assigned(FDebugNotify) then FDebugNotify('AllocRecordBuffer'); Result := inherited AllocRecordBuffer; end; procedure TDebugDataSet.InternalInitRecord(Buffer: PChar); begin if Assigned(FDebugNotify) then FDebugNotify('InternalInitRecord'); inherited; end; procedure TDebugDataSet.FreeRecordBuffer(var Buffer: PChar); begin if Assigned(FDebugNotify) then FDebugNotify('FreeRecordBuffer'); inherited; end; function TDebugDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; begin case GetMode of gmNext: if Assigned(FDebugNotify) then FDebugNotify('GetRecord: Next'); gmPrior: if Assigned(FDebugNotify) then FDebugNotify('GetRecord: Prior'); gmCurrent: if Assigned(FDebugNotify) then FDebugNotify('GetRecord: Current'); end; Result := inherited GetRecord(Buffer, GetMode, DoCheck); end; procedure TDebugDataSet.InternalFirst; begin if Assigned(FDebugNotify) then FDebugNotify('InternalFirst'); inherited; end; procedure TDebugDataSet.InternalLast; begin if Assigned(FDebugNotify) then FDebugNotify('InternalLast'); inherited; end; procedure TDebugDataSet.InternalPost; begin if State = dsEdit then if Assigned(FDebugNotify) then FDebugNotify('InternalPost ***** dsEdit') else if Assigned(FDebugNotify) then FDebugNotify('InternalPost ***** dsInsert'); inherited; end; procedure TDebugDataSet.InternalAddRecord( Buffer: Pointer; Append: Boolean); begin if Assigned(FDebugNotify) then FDebugNotify('InternalAddRecord ****'); inherited; end; procedure TDebugDataSet.InternalDelete; begin if Assigned(FDebugNotify) then FDebugNotify('InternalDelete'); inherited; end; function TDebugDataSet.GetFieldData( Field: TField; Buffer: Pointer): Boolean; begin Result := inherited GetFieldData(Field, Buffer); end; procedure TDebugDataSet.SetFieldData(Field: TField; Buffer: Pointer); begin if Assigned(FDebugNotify) then FDebugNotify('SetFieldData'); inherited; end; function TDebugDataSet.GetRecordCount: Longint; begin Result := inherited GetRecordCount; if Assigned(FDebugNotify) then FDebugNotify('GetRecordCount: ' + IntToStr(Result)); end; function TDebugDataSet.GetRecNo: Longint; begin Result := inherited GetRecNo; if Assigned(FDebugNotify) then FDebugNotify('GetRecNo: ' + IntToStr(Result)); end; procedure TDebugDataSet.SetRecNo(Value: Integer); begin if Assigned(FDebugNotify) then FDebugNotify('SetRecNo: ' + IntToStr(Value)); inherited; end; procedure TDebugDataSet.InternalRefresh; begin if Assigned(FDebugNotify) then FDebugNotify('InternalRefresh'); inherited; end; procedure TDebugDataSet.InternalHandleException; begin if Assigned(FDebugNotify) then FDebugNotify('InternalHandleException'); inherited; end; end. unit DebugDSForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DebugSet, Grids, DBGrids, DBCtrls, ExtCtrls, StdCtrls, Db, DBTables, Menus; type TForm1 = class(TForm) Table1: TTable; DataSource1: TDataSource; ListBox1: TListBox; Splitter1: TSplitter; Panel1: TPanel; DBNavigator1: TDBNavigator; DBGrid1: TDBGrid; Panel2: TPanel; BtnOpen: TButton; BtnClose: TButton; BtnClear: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure BtnClearClick(Sender: TObject); procedure BtnOpenClick(Sender: TObject); procedure BtnCloseClick(Sender: TObject); private TableClone: TDebugDataSet; public procedure LocalNotify(const DebugText: string); end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Table1.Close; TableClone := TDebugDataSet.Create(nil); TableClone.DatabaseName := Table1.DatabaseName; TableClone.TableName := Table1.TableName; TableClone.OnDebugNotify := LocalNotify; DataSource1.DataSet := TableClone; end; procedure TForm1.LocalNotify(const DebugText: string); var nItem: Integer; begin if Assigned(ListBox1) then begin // add the text to the string nItem := ListBox1.Items.Add(DebugText); // select the new item ListBox1.ItemIndex := nItem; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin TableClone.Close; TableClone.Free; end; procedure TForm1.BtnClearClick(Sender: TObject); begin ListBox1.Items.Clear; end; procedure TForm1.BtnOpenClick(Sender: TObject); begin TableClone.Active := True; end; procedure TForm1.BtnCloseClick(Sender: TObject); begin TableClone.Active := False; end; end. Это проект на языке Delphi, демонстрирующий использование компонента пользовательского набора данных Вот подробное описание кода: Unit DebugSet В этом модуле содержится определение класса Свойство Unit DebugDSForm В этом модуле содержится определение основной формы Форма имеет несколько кнопок:
Форма также имеет список уведомлений Процедура Процедура Основные функции:
В целом, этот проект демонстрирует, как создать компонент пользовательского набора данных с возможностями отладки и использовать его в приложении Delphi. 'Набор данных для отладки - пример реализации класса TDebugDataSet, который выводит информацию о работе с таблицей в ListBox' Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |