gpt4 book ai didi

class - 德尔福 2009 : Component Object property default value

转载 作者:行者123 更新时间:2023-12-03 18:21:12 24 4
gpt4 key购买 nike

如何设置组件对象属性值的默认值?

组件类代码:

unit CustomClass;

interface

uses
Classes;

type
TCustomClass = class;

TConfiguration = class;

TCustomClass = class (TComponent)
private
FConfiguration: TConfiguration;
procedure SetConfiguration(const Value: TConfiguration);
published
property Configuration: TConfiguration read FConfiguration write SetConfiguration;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

TConfiguration = class (TPersistent)
private
FDelay: Integer;
FSize: Integer;
procedure SetDelay(const Value: Integer);
procedure SetSize(const Value: Integer);
published
property Delay: Integer read FDelay write SetDelay;
property Size: Integer read FSize write SetSize;
public
procedure Assign(Source: TPersistent); override;
end;

implementation

{ TCustomClass }

constructor TCustomClass.Create(AOwner: TComponent);
begin
inherited;
Configuration.FileName:= 'FileName';
Configuration.Size := 10;
end;

destructor TCustomClass.Destroy;
begin
Configuration.Free;
inherited;
end;

procedure TCustomClass.SetConfiguration(const Value: TConfiguration);
begin
FConfiguration.Assign(Value);
end;

{ TConfiguration }

procedure TConfiguration.Assign(Source: TPersistent);
begin
inherited;
Delay := (Source as TConfiguration).Delay;
Size := (Source as TConfiguration).Size;
end;

procedure TConfiguration.SetDelay(const Value: Integer);
begin
FDelay := Value;
end;

procedure TConfiguration.SetSize(const Value: Integer);
begin
FSize := Value;
end;

end.

在我的 IDE 中,它将显示为对象属性被修改(粗体蓝色)。

我想在 TConfiguration 类属性上创建默认函数和存储函数,如下所示:

配置

interface

private
function FileNameStored: Boolean;
published
property FileName: string read FFileName write SetFileName stored FileNameStored;
property Size: Integer read FSize write SetSize default 10;

implementation

function TConfiguration.FileNameStored: Boolean;
begin
Result := FileName <> 'FileName';
end;

它将 TConfiguration 的属性着色为普通蓝色,但不是 TCustomClass 的 Configuration 属性,它不在那里,我想设置它的默认值,它在 TCustomClass 上,因为 TConfiguration 可能在其他组件中使用。

然后,我又想到:

TCustomClass

interface

private
function ConfigurationStored: Boolean;
published
property Configuration: TConfiguration read FConfiguration write SetConfiguration stored ConfigurationStored;

implementation

function TCustomClass.ConfigurationStored: Boolean;
begin
Result := Configuration.FileName <> 'FileName' and
Configuration.Size <> 10;
end;

但是,这只会将 TCustomClass Configuration 属性颜色设置为普通蓝色,而不是它的属性。

回答

正如@RemyLebeau 指出的(在第一个也是最重要的答案中),代码中存在错误。在那个组件和那种情况下,我决定不为属性设置任何默认值。

最佳答案

您的代码中有几个错误。

  1. 您的 TCustomClass 构造函数未创建 TConfiguration 对象。您需要添加:

    constructor TCustomClass.Create(AOwner: TComponent);
    begin
    inherited;
    FConfiguration := TConfiguration.Create; // <-- add this
    FConfiguration.FileName := 'FileName';
    FConfiguration.Size := 10;
    end;

    话虽如此,FileNameSize 属性的赋值应该移至 TConfiguration 构造函数而不是 TCustomClass 构造函数。

  2. String 属性不能用用户定义的默认值定义,默认值始终为空字符串。因此,当您的组件创建时,您的 FileName 属性将始终显示为已修改,因为您的构造函数正在为其分配非默认值。您的 stored 方法是处理该问题的正确解决方案。或者,根本不分配默认的 FileName,将其留空。如果用户未指定显式 FileName,则您的代码可以根据需要采用默认值。

    另一方面,Integer 属性可以用用户定义的默认值来定义。但是,您的 Size 属性并没有这样做。它应该是(特别是如果您将默认值的分配移动到 TConfiguration 构造函数中):

    property Size: Integer read FSize write SetSize default 10;
  3. 您的 TConfiguration.Assign() 方法实现不正确。通过在复制值之前调用继承的 Assign() 方法,如果调用者分配一个 TConfiguration 对象,您的代码将始终在运行时引发 EConvertError 异常给另一个。原因是因为基类 TPersistent.Assign() 实现只是调用了 Source.AssignTo(Self),而 TConfiguration 并没有覆盖 AssignTo() 方法,所以 TPersistent.AssignTo() 被调用,它只是调用 Dest.AssignError(Self),从而引发异常。因此,如果 Source 实际上是一个 TConfiguration 对象,请不要调用继承的 Assign() 方法:

    procedure TConfiguration.Assign(Source: TPersistent);
    begin
    if Source is TConfiguration then
    begin
    FDelay := TConfiguration(Source).Delay;
    FSize := TConfiguration(Source).Size;
    end else
    inherited;
    end;

关于class - 德尔福 2009 : Component Object property default value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34230173/

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