Delphi 组件的默认属性值

Delphi 组件的默认属性值,delphi,properties,components,delphi-7,Delphi,Properties,Components,Delphi 7,我想知道是否可以为组件定义默认属性值。 换句话说,我想在设计时为系统中的每个TDBGrid设置一个唯一的名称(可能是GUID),这可能吗?还有另一种方法可以控制在运行时和设计时工作的组件的唯一性。而且它必须在我关闭delphi后继续存在;e、 g组合框列表值 提前谢谢 编辑 以下是不起作用的代码: type TMDBGrid = class(TDBGrid) private FUniqueName: String; protected function Default

我想知道是否可以为组件定义默认属性值。 换句话说,我想在设计时为系统中的每个TDBGrid设置一个唯一的名称(可能是GUID),这可能吗?还有另一种方法可以控制在运行时和设计时工作的组件的唯一性。而且它必须在我关闭delphi后继续存在;e、 g组合框列表值

提前谢谢

编辑 以下是不起作用的代码:

type
  TMDBGrid = class(TDBGrid)
  private
    FUniqueName: String;
  protected
    function DefaultUniqueName: String;
    function GetUniqueName: String;
    procedure SetUniqueName(const AName: String);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property UniqueName: String read GetUniqueName write SetUniqueName;
  end;

procedure Register;

implementation

uses uComponentUtils;

procedure Register;
begin
  RegisterComponents('MLStandard', [TMDBGrid]);
end;

{ TMDBGrid }

constructor TMDBGrid.Create(AOwner: TComponent);
begin
  inherited;
  FUniqueName := DefaultUniqueName;
end;

function TMDBGrid.DefaultUniqueName: String;
begin
  Result := GenerateGUID(True);
end;

function TMDBGrid.GetUniqueName: String;
begin
  Result := '';
end;

procedure TMDBGrid.SetUniqueName(const AName: String);
begin
  FUniqueName := AName;
  if FUniqueName = '' then
    FUniqueName := DefaultUniqueName;
end;

function GenerateGUID(PlainText: Boolean = False): String;
var G: TGUID;
begin
  CreateGUID(G);
  Result:= GUIDToString(G);
  if PlainText then
    Result := MultiStringReplace(Result, ['{','}','[',']','-','.',' ','(',')'],
                                         ['','','','','','','','',''],
                                         [rfReplaceAll, rfIgnoreCase]);
end;
它不工作意味着当TDBGrid添加到任何表单时,UNIQUENAME为空。它应该有一个GUID。

您的GetUniqueName实现不会返回任何内容。它需要返回FUniqueName

或者您可以删除getter并将属性更改为:

property UniqueName: String read FUniqueName write SetUniqueName;
GetUniqueName的实现不会返回任何内容。它需要返回FUniqueName

或者您可以删除getter并将属性更改为:

property UniqueName: String read FUniqueName write SetUniqueName;


您可以将属性添加到组件中,并在创建时为其指定一个值,然后将该值持久化到.dfm文件中或从中持久化。@DavidHeffernan我的代码应该可以工作吗?很难看出这会如何失败。它将保存到.dfm文件中。显然,对于在运行时创建的控件,它无法完成任务。如果您创建同一表单的多个实例,它也无法工作。您将在具有相同ID的不同窗体上拥有控件。或者这是您想要的吗?无论如何,让我们澄清一下。你说不工作到底是什么意思?@DavidHeffernan nevermind,显然它无法完成在运行时创建的控件的工作@DavidHeffernan最后一个组件应该是这样工作的:每次将另一个组件添加到表单时,都会生成一个新的uniquename。您可以向组件添加一个属性,并在创建时给它一个值,然后将该值持久保存到.dfm文件中。@DavidHeffernan我的代码应该可以工作吗?很难看出这会失败。它将保存到.dfm文件中。显然,对于在运行时创建的控件,它无法完成任务。如果您创建同一表单的多个实例,它也无法工作。您将在具有相同ID的不同窗体上拥有控件。或者这是您想要的吗?无论如何,让我们澄清一下。你说不工作到底是什么意思?@DavidHeffernan nevermind,显然它无法完成在运行时创建的控件的工作@DavidHeffernan最后一个组件应该是这样工作的:每次向表单添加另一个组件时,都会生成一个新的uniquename。我只是不相信我这么做了!超级掌心!实际上,这里最大的教训是将代码缩减到最小复制量是多么重要。即使在你发布的少量代码中也有多余的代码。一旦你有了一个最小的复制,就很容易发现问题,因为要看的代码就更少了。当你问一个问题时,一个好的最小复制会让我们的生活更轻松,也意味着你会有一个更好更干净的问题。这个属性会在运行时被覆盖吗?我不应该添加if csDesigning in ComponentState然后添加no,因为它将从.dfm文件中读取。第一次在窗体上删除组件时,没有.dfm值可读取,因此您将获得默认值,这是您在构造函数中设置的值。除非该属性具有默认值并且已设置该值。例如属性MyProp:Integer read FMyProp write SetMyProp default 0;如果这个属性的默认值是0,那么它甚至不会保存在DFM中。我只是不相信我这么做了!超级掌心!实际上,这里最大的教训是将代码缩减到最小复制量是多么重要。即使在你发布的少量代码中也有多余的代码。一旦你有了一个最小的复制,就很容易发现问题,因为要看的代码就更少了。当你问一个问题时,一个好的最小复制会让我们的生活更轻松,也意味着你会有一个更好更干净的问题。这个属性会在运行时被覆盖吗?我不应该添加if csDesigning in ComponentState然后添加no,因为它将从.dfm文件中读取。第一次在窗体上删除组件时,没有.dfm值可读取,因此您将获得默认值,这是您在构造函数中设置的值。除非该属性具有默认值并且已设置该值。例如属性MyProp:Integer read FMyProp write SetMyProp default 0;如果此属性的默认值为0,则它甚至不会将其保存在DFM中。