Создание свойства-объекта в компоненте
Каждый компонент может содержать в себе свойство-объект. В качестве свойства-объекта может выступать любой компонент или объект 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" указывает на то, что стандартный конструктор для компонента-предка будет перекрыт.
Строка inheritedDestroy;в реализации деструктора означает, что будут выполнены стандартные методы деструктора компонента-предка.
Дата добавления: 2015-09-07; просмотров: 839;