gpt4 book ai didi

delphi - 无法声明字符串属性默认值

转载 作者:行者123 更新时间:2023-12-03 15:19:58 25 4
gpt4 key购买 nike

我正在编写一个由许多属性组成的组件,这些属性将出现在 Delphi IDE 对象检查器(已发布属性)中...

type
TMyComponent = class(TComponent)
private
FMyProperty: String;
published
property MyProperty: String read FMyProperty write SetMyProperty default 'Something';
end;

但是,它不允许我将默认值应用于字符串属性...

[DCC Error] MyUnit.pas(278): E2146 Default values must be of ordinal, pointer or small set type

所有其他属性默认值都可以正常工作(整数、枚举等)。

我的目标是 A) 如果字符串属性是默认值,则不将其保存到 DFM,B) 如果不是默认值,则在对象检查器中将值显示为粗体,并且如果是常规的。该组件显示了超过 130 个属性,其中大约 50 个是字符串属性,其中一些具有相当大的默认值。

为什么不允许我声明具有默认值的字符串属性?这是 Delphi 的缺点,还是有技术原因导致字符串不能默认?

编辑

如果您确实想知道我在做什么,我将封装 Inno Setup 并将功能包装到具有扩展属性/集合编辑器的组件中。本主题仅涉及 Setup 部分,该部分实际上包含 100 多个属性。这些属性中只有大约 20 个预计实际用于简单实现,因此我不希望所有其余的字符串属性使 DFM 的大小膨胀(如果它们设置为默认值)。根据组件的设置方式,它将生成一个 Inno Setup 脚本文件。

最佳答案

只有数字属性可以在属性声明中指定默认值。但是,您可以使用 stored 说明符来代替,例如:

type
TMyComponent = class(TComponent)
private
FMyProperty: String;
function MyPropertyIsStored: Boolean;
procedure SetMyProperty(const Value: String);
public
constructor Create(AOwner: TComponent); override;
published
property MyProperty: String read FMyProperty write SetMyProperty stored MyPropertyIsStored;
end;

constructor TMyComponent.Create(AOwner: TComponent);
begin
Inherited;
FMyProperty := 'my default value';
end;

function TMyComponent.MyPropertyIsStored: Boolean;
begin
Result := FMyProperty <> 'my default value';
end;

procedure TMyComponent.SetMyProperty(const Value: String);
begin
if FMyProperty <> Value then
begin
FMyProperty := Value;
// update component as needed...
end;
end;

关于delphi - 无法声明字符串属性默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21962913/

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