Тема: Создание компонентов для работы с базами данных, позволяющих работать с самими данными
Обзор
Данный документ описывает минимально необходимые шаги, необходимые для создания компонента для работы с базами данных, который может отображать данные отдельного поля. Примером такого компонента может служить панель со свойствами DataSource и DataField, похожая на компонент TDBText. Для получения дополнительных примеров обратитесь к Руководству по написанию компонентов "Making a Control Data-Aware".
Как пользоваться данным документом
Для наилучшего понимания данного документа, вы должны быть знакомы с механизмом функционирования элементов управления для работы с базами данных и основополагающими принципами создания компонент, такими, как
Основные шаги по созданию компоненты, осуществляющей навигацию по данным
Создание TDBPANEL
Выберите соответствующий пункт меню для создания нового компонента (он меняется от версии к версии Delphi), определите TDBPanel как имя класса, и TCustomPanel в качестве наследуемого типа. Определите любую страницу Палитры компонентов.
{ пример } private FDataLink: TFieldDataLink; |
Примечание: Наш новый компонент будет иметь свойства DataField и DataSource, FDataLink также будет иметь собственные свойства DataField и Datasource.
{ пример } published property DataField: string read GetDataField write SetDataField; property DataSource: TDataSource read GetDataSource write SetDataSource; |
{ пример }
private
FDataLink: TFieldDataLink;
function GetDataField: String;
function GetDataSource: TDataSource;
procedure SetDataField(Const Value: string);
procedure SetDataSource(Value: TDataSource);
.
.
implementation
.
.
function TDBPanel.GetDataField: String;
begin
Result := FDataLink.FieldName;
end;
function TDBPanel.GetDataSource: TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBPanel.SetDataField(Const Value: string); begin FDataLink.FieldName := Value; end; procedure TDBPanel.SetDataSource(Value: TDataSource); begin FDataLink.DataSource := Value; end; |
{ пример }
private
.
.
procedure DataChange(Sender: TObject);
implementation . . procedure TDBPanel.DataChange(Sender: TObject); begin if FDataLink.Field = nil then Caption := ''; else Caption := FDataLink.Field.AsString; end; |
{ пример } public constructor Create(AOwner: TComponent); override; . . implementation . . constructor TMyDBPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); FDataLink := TFieldDataLink.Create; FDataLink.OnDataChange := DataChange; end; |
{ пример } public . . destructor Destroy; override; . . implementation . . destructor TDBPanel.Destroy; begin FDataLink.OnDataChange := nil; FDataLink.Free; inherited Destroy; end; |
Полный код компонента
unit Mydbp; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, DB, DBTables; type TDBPanel = class(TCustomPanel) private FDataLink: TFieldDataLink; function GetDataField: String; function GetDataSource: TDataSource; procedure SetDataField(Const Value: string); procedure SetDataSource(Value: TDataSource); procedure DataChange(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property DataField: string read GetDataField write SetDataField; property DataSource: TdataSource read GetDataSource write SetDataSource; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TDBPanel]); end; function TDBPanel.GetDataField: String; begin Result := FDataLink.FieldName; end; function TDBPanel.GetDataSource: TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBPanel.SetDataField(Const Value: string); begin FDataLink.FieldName := Value; end; procedure TDBPanel.SetDataSource(Value: TDataSource); begin FDataLink.DataSource := Value; end; procedure TDBPanel.DataChange(Sender: TObject); begin if FDataLink.Field = nil then Caption := '' else Caption := FDataLink.Field.AsString; end; constructor TDBPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); FDataLink := TFieldDataLink.Create; FDataLink.OnDataChange := DataChange; end; destructor TDBPanel.Destroy; begin FDataLink.Free; FDataLink.OnDataChange := nil; inherited Destroy; end; end. |
[001083]