gpt4 book ai didi

delphi - 如何在对象检查器中对组件的属性进行分组?

转载 作者:行者123 更新时间:2023-12-03 14:50:28 26 4
gpt4 key购买 nike

我希望我的非可视组件的已发布属性位于不在对象检查器顶层的类别下。

看下面的例子:

enter image description here

type
TMyComponent = class(TComponent)
protected
function GetSomeValue: string;
function GetSomeValueExt: string;
published
property SomeValue: string read GetSomeValue;
property SomeValueExt: string read GetSomeValueExt;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('My Component', [TMyComponent]);
end;

function TMyComponent.GetSomeValue: string;
begin
Result := 'test';
end;

function TMyComponent.GetSomeValueExt: string;
begin
Result := 'extended..';
end;

如何让我的组件在对象检查器中使用 SomeValue 和 SomeValueExt 在名为 MyProperties 之类的类别下注册?

插图:

enter image description here

我的组件可能有很多已发布的属性,我宁愿它们位于对象检查器自己的级别子类别下,以使其远离常见属性(例如名称和标签)。

谢谢:)

最佳答案

创建一个具有这些属性的类,然后为您的组件提供该类类型的单个属性。属性类应该是 TPercient 后代:

type
TComponentProperties = class(TPersistent)
private
function GetSomeValue: string;
function GetSomeValueExt: string;
published
property SomeValue: string read GetSomeValue;
property SomeValueExt: string read GetSomeValueExt;
end;

TMyComponent = class(TComponent)
private
FProperties: TComponentProperties;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Properties: TComponentProperties read FProperties;
end;

组件拥有其属性对象,因此需要创建和销毁它:

constructor TMyComponent.Create;
begin
inherited;
FProperties := TComponentProperties.Create;
end;

destructor TMyComponent.Destroy;
begin
FProperties.Free;
inherited;
end;

使用该代码,组件的属性现在应该列在“属性”项下。但它不是一个类别。类别完全是另一回事。类别不会重新排列组件;它们只是改变属性在对象检查器中的显示方式。请注意,在我的代码中,TMyComponent 不再具有任何 SomeValue 属性。相反,它只有一个属性,Properties,而那个对象还有其他属性。考虑一下这是否真的是您希望组件的使用者访问它的方式。

<小时/>

如果Properties属性不是只读的,那么它需要有一个属性 setter ;您不能让它直接写入FProperties。像这样写:

procedure TMyComponent.SetProperties(const Value: TProperties);
begin
FProperties.Assign(Value);
end;

这还要求您重写Assign 方法来执行正确的操作:

procedure TComponentProperties.Assign(Other: TPersistent);
begin
if Other is TComponentProperties then begin
SomeValue := TComponentProperties(Other).SomeValue;
SomeValueEx := TComponentProperties(Other).SomeValueEx;
end else
inherited;
end;

我们还假设属性对象的属性也不是只读的。当属性对象的属性发生变化时,所属对象可能想知道它,因此它应该有一个组件分配值的事件。当属性发生变化时,就会触发该事件。

关于delphi - 如何在对象检查器中对组件的属性进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9434423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com