Создание свойства-объекта в компоненте

Каждый компонент может содержать в себе свойство-объект. В качестве свойства-объекта может выступать любой компонент или объект Delphi. Кроме того, свойствами-объектами нового компонента могут быть новые компоненты или объекты, которые вы создали самостоятельно. Важным условием является тот факт, что свойства-объекты должны быть потомками класса TPersistent. Это необходимо для того, чтобы свойства объекта-свойства отображались в окне инспектора объектов.

Для начала создадим произвольный новый объект, являющийся прямым потомком класса TPersistent:

type

TMyObject = class (TPersistent}

private

FPropertyl: Real;

FProperty2: Char;

protected

{ Protected declarations }

public

procedure Assign (Source: TPersistent);

published

property Propertyl: Real read FPropertyl write FPropertyl;

property Property2: Char read FProperty2 write FProperty2;

end;

В качестве предка нового класса может выступать не только класс TPersistent, но любой его потомок. В вышеприведенном листинге создается новый класс TMyObject, в котором присутствует два простых свойства – Propertyl и Property2. Кроме того, в новый объект включена процедура Assign. Данная процедура необходима для обеспечения правильного доступа к свойству нашего будущего компонента TMyButton. Ниже приведен листинг, в котором в компонент TMyButton добавляется новое свойство-объект.

type

TMyButton = class (TButton)

private

FMyObject: TMyObject;

procedure SetMyObject (Value: TMyObject);

protected

{ Protected declarations }

public

constructor Create (AOwner: TComponent); override;

destructor Destroy; override;

published

property MyObject: TMyObject read FMyObject write SetMyObject;

end;

Также в секцию public нового компонента добавили конструктор и деструктор объекта.

Теперь осталось дописать конструктор и деструктор для компонента TMyButton, в которых необходимо соответственно создать и уничтожить, кроме компонента TMyButton, еще и объект TMyObject. А также нужно написать код метода SetMyObject, который будет помещать новое значение в свойства объекта TMyObject. Ну и, конечно, написать код метода Assign для объекта TMyObject. Далее приведена полная версия кода.

type

TMyObject = class (TPersistent)

private

FPropertyl: Real;

FProperty2: Char;

protected

{ Protected declarations }

public

procedure Assign (Source: TPersistent);

published

property Propertyl: Real read FPropertyl write FPropertyl;

property Property2: Char read FProperty2 write FProperty2;

end;

type

TMyButton = class (TButton)

private

FMyObject: TMyObject;

procedure SetMyObject (Value: TMyObject);

protected

{ Protected declarations }

public

constructor Create (AOwner: TComponent); override;

destructor Destroy; override;

published

property MyObject: TMyObject read FMyObject write SetMyObject;

end;

procedure Register;

implementation

procedure TMyButton.SetMyObject (Value: TMyObject);

begin

if Assigned (Value) then FMyObject.Assign (Value);

end;

constructor TMyButton.Create (AOwner; TComponent);

begin

inherited Create (AOwner);

FMyObject:=TMyObject.Create;

end;

destructor TMybutton.Destroy;

begin

FMyObject.Free;

inherited Destroy;

end;

procedure TMyObject.Assign (Source: TPersistent);

begin

if Source is TMyObject then

begin

FPropertyl:=TMyObject (Source).Property1;

FProperty2:=TMyObject (Source).Property2;

inherited Assign (Source);

end;

end;

Обратите внимание на реализацию метода TMyObject.Assign. Здесь сначала выполняется проверка на то, что передается правильный экземпляр объекта TMyObject. Если он правильный, то значения свойств (Source) Переносятся в поляFPropertyl и FProperty2 объекта TMyObject. Результатом исполнения вышеприведенного кода будет новый компонент TMyButton, содержащий в себе свойство-объект TMyObject. В окне инспектора объектов это будет выглядеть, как представлено на рисунке 4.

Рис. 4. Свойство-объект MyObject в новом компоненте TMyButton.

Примечание. При объявлении конструктора использовалась следующая строка:

constructor Create (AOwner: TComponent); override;

Слово "override" указывает на то, что стандартный конструктор для компонента-предка будет перекрыт.

Строка inherited Destroy; в реализации деструктора означает, что будут выполнены стандартные методы деструктора компонента-предка.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: