.
implementation
.
.
constructorTMyDBPanel.Create(AOwner: TComponent);
begin
inheritedCreate(AOwner);
FDataLink := TFieldDataLink.Create;
FDataLink.OnDataChange := DataChange;
end;
• Перекройте метод деструктора компонента Destroy. При реализации Destroy, установите OnDataChange в nil (чтобы избежать GPF), и освободите FDatalink.
{ пример }
public
.
.
destructor Destroy; override;
.
.
implementation
.
.
destructor TDBPanel.Destroy;
begin
FDataLink.OnDataChange := nil;
FDataLink.Free;
inheritedDestroy;
end;
• Сохраните модуль и установите компонент (смотрите документацию Users Guide и Component Writers Guide для получения дополнительной информации по сохранению модулей и установке компонентов).
• Для тестирования функциональности компонента расположите на форме компоненты TTable, TDatasource, TDBNavigator и TDBPanel. Установите TTable DatabaseName и Tablename в 'DBDemos' и 'BioLife', а свойство Active в True. Установите свойство TDatasource Dataset в Table1. Установите TDBNavigator и свойство TDBPanel DataSource в Datasource1. Имя TDBpanel DataField должно быть установлено в 'Common_Name'. Запустите приложение и, используя навигатор и перемещаясь по записям, убедитесь в том, что TDBPanel обнаруживает изменение данных и отображает значение соответствующего поля.
Полный код компонента
unitMydbp;
interface
usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, DB, DBTables;
typeTDBPanel = class(TCustomPanel)
private
FDataLink: TFieldDataLink;
functionGetDataField: String;
functionGetDataSource: TDataSource;
procedureSetDataField( ConstValue: string);
procedureSetDataSource(Value: TDataSource);
procedureDataChange(Sender: TObject);
public
constructorCreate(AOwner: TComponent); override;
destructorDestroy; override;
published
propertyDataField: string read GetDataField write SetDataField;
propertyDataSource: TdataSource read GetDataSource write SetDataSource;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TDBPanel]);
end;
functionTDBPanel.GetDataField: String;
begin
Result := FDataLink.FieldName;
end;
functionTDBPanel.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedureTDBPanel.SetDataField( ConstValue: string);
begin
FDataLink.FieldName := Value;
end;
procedureTDBPanel.SetDataSource(Value: TDataSource);
begin
FDataLink.DataSource := Value;
end;
procedureTDBPanel.DataChange(Sender: TObject);
begin
ifFDataLink.Field = nil thenCaption := ''
elseCaption := FDataLink.Field.AsString;
end;
constructorTDBPanel.Create(AOwner: TComponent);
begin
inheritedCreate(AOwner);
FDataLink := TFieldDataLink.Create;
FDataLink.OnDataChange := DataChange;
end;
destructorTDBPanel.Destroy;
begin
FDataLink.Free;
FDataLink.OnDataChange := nil;
inheritedDestroy;
end;
end.
Динамическое создание компонент во время работы приложения
Использовать формы и компоненты Delphi очень просто. Если управлять этими объектами посредством Инспектора Объектов, то эту задачу можно отнести к числу тривиальных. Динамически создать объект также несложно. В этом документе мы обсудим некоторые вопросы, касающиеся динамического создания компонент во время работы приложения.
(вам следует помнить, что понятие "динамическое" весьма субъективно, поскольку Delphi все объекты создает динамически. Информация, предоставленная здесь — для программиста, который сам собирается создавать/менять свойства/разрушать объекты во время выполнения программы)
Все типы (формы или компоненты) могут создаваться динамически. Чтобы это сделать, необходимо объявить переменную нужного типа в секции VAR вашего кода. Это не создает экземпляр объекта, это создает указатель. Данный указатель расположен в сегменте данных (если переменная объявлена глобально) или в стеке (если переменная объявлена локально в процедуре или функции). Для того, чтобы создать экземпляр класса, вам необходимо вызвать конструктор. Это распределит память в глобальной компьютерной куче для экземпляра класса. При попытке получить доступ к компоненте прежде, чем мы распределим память, мы получим ошибку общей защиты.
Читать дальше