Delphi - 创建子组件 属性
Delphi - Create Component Sub Property
我正在使用 Delphi 开发组件。我被困在某事上,需要你的帮助。在我的组件中创建 属性 值时,我需要一个子 属性。
总之,我希望在ide上是这样的。我为此编写了以下示例代码。我在为测试目的而编写的代码中遇到了一个我无法理解的问题。我的代码;
type
TCheckValue = class(TPersistent)
private
FValue1: Boolean;
FValue2: Boolean;
FOnChange: TNotifyEvent;
procedure Changed;
procedure SetValue1(Value: Boolean);
procedure SetValue2(Value: Boolean);
public
procedure Assign(Source : TPersistent); override;
property OnChange : TNotifyEvent read FOnChange write FOnChange;
published
property Value1: Boolean read FValue1 write SetValue1 default true;
property Value2: Boolean read FValue2 write SetValue2 default true;
end;
组件:
type
THBComp = class(TComponent)
constructor create;
destructor destroy; override;
private
FCheckValue: TCheckValue;
procedure setCheckValue(Value: TCheckValue);
published
property CheckValue: TCheckValue read FCheckValue write setCheckValue;
end;
TCheckValue 程序代码:
procedure TCheckValue.Changed;
begin
if Assigned(FOnChange) then
begin
FOnChange(Self);
end;
end;
procedure TCheckValue.SetValue1(Value: Boolean);
begin
if FValue1 <> Value then
begin
FValue1 := Value;
Changed;
end;
end;
procedure TCheckValue.SetValue2(Value: Boolean);
begin
if FValue2 <> Value then
begin
FValue2 := Value;
Changed;
end;
end;
procedure TCheckValue.Assign(Source : TPersistent);
begin
if Source is TCheckValue then
begin
FValue1 := TCheckValue(Source).FValue1;
FValue2 := TCheckValue(Source).FValue2;
Changed;
end else
inherited;
end;
我用这些代码得到的结果如下:
所以 Value1 和 Value2 没有显示在 IDE side 上。我对此的定义不完整吗?是否有关于此主题的文档?我觉得我的研究词有问题或者文档有问题
IDE版本:10.4.2
对不起我的英语不好。
非常感谢。
TCheckValue
已正确实施。问题是你的 THBComp
构造函数不是 override
的 TComponent
构造函数,所以当 THBComp
对象被放置在在设计时形成,或从 DFM 流入。您需要实现该构造函数,例如
type
THBComp = class(TComponent)
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
private
FCheckValue: TCheckValue;
procedure setCheckValue(Value: TCheckValue);
published
property CheckValue: TCheckValue read FCheckValue write setCheckValue;
end;
...
constructor THBComp.Create(AOwner: TComponent);
begin
inherited;
FCheckValue := TCheckValue.Create;
end;
destructor THBComp.Destroy;
begin
FCheckValue.Free;
inherited;
end;
procedure THBComp.setCheckValue(Value: TCheckValue);
begin
FCheckValue.Assign(Value);
end;
我正在使用 Delphi 开发组件。我被困在某事上,需要你的帮助。在我的组件中创建 属性 值时,我需要一个子 属性。
总之,我希望在ide上是这样的。我为此编写了以下示例代码。我在为测试目的而编写的代码中遇到了一个我无法理解的问题。我的代码;
type
TCheckValue = class(TPersistent)
private
FValue1: Boolean;
FValue2: Boolean;
FOnChange: TNotifyEvent;
procedure Changed;
procedure SetValue1(Value: Boolean);
procedure SetValue2(Value: Boolean);
public
procedure Assign(Source : TPersistent); override;
property OnChange : TNotifyEvent read FOnChange write FOnChange;
published
property Value1: Boolean read FValue1 write SetValue1 default true;
property Value2: Boolean read FValue2 write SetValue2 default true;
end;
组件:
type
THBComp = class(TComponent)
constructor create;
destructor destroy; override;
private
FCheckValue: TCheckValue;
procedure setCheckValue(Value: TCheckValue);
published
property CheckValue: TCheckValue read FCheckValue write setCheckValue;
end;
TCheckValue 程序代码:
procedure TCheckValue.Changed;
begin
if Assigned(FOnChange) then
begin
FOnChange(Self);
end;
end;
procedure TCheckValue.SetValue1(Value: Boolean);
begin
if FValue1 <> Value then
begin
FValue1 := Value;
Changed;
end;
end;
procedure TCheckValue.SetValue2(Value: Boolean);
begin
if FValue2 <> Value then
begin
FValue2 := Value;
Changed;
end;
end;
procedure TCheckValue.Assign(Source : TPersistent);
begin
if Source is TCheckValue then
begin
FValue1 := TCheckValue(Source).FValue1;
FValue2 := TCheckValue(Source).FValue2;
Changed;
end else
inherited;
end;
我用这些代码得到的结果如下:
所以 Value1 和 Value2 没有显示在 IDE side 上。我对此的定义不完整吗?是否有关于此主题的文档?我觉得我的研究词有问题或者文档有问题
IDE版本:10.4.2
对不起我的英语不好。 非常感谢。
TCheckValue
已正确实施。问题是你的 THBComp
构造函数不是 override
的 TComponent
构造函数,所以当 THBComp
对象被放置在在设计时形成,或从 DFM 流入。您需要实现该构造函数,例如
type
THBComp = class(TComponent)
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
private
FCheckValue: TCheckValue;
procedure setCheckValue(Value: TCheckValue);
published
property CheckValue: TCheckValue read FCheckValue write setCheckValue;
end;
...
constructor THBComp.Create(AOwner: TComponent);
begin
inherited;
FCheckValue := TCheckValue.Create;
end;
destructor THBComp.Destroy;
begin
FCheckValue.Free;
inherited;
end;
procedure THBComp.setCheckValue(Value: TCheckValue);
begin
FCheckValue.Assign(Value);
end;