在自定义组件中检索存储在DFM上的属性的值错误

时间:2013-12-18 14:11:29

标签: delphi delphi-xe2 custom-component

Delphi XE2

我有followind自定义组件:

  TNaharWebDBEdit = class(TUniDBEdit)
  private
    FThemeColor : TNaharPalleteColor;
    FThemeController: TNaharThemeController;
    procedure   OnObserver(Sender: TObject; AParam, AValue: Variant);
    procedure   UpdateColor;
    procedure   SetColor(const Value: TNaharPalleteColor);
    function    GetThemeManager: TNaharThemeManager;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
  published
    property    ThemeColor: TNaharPalleteColor read FThemeColor write SetColor default npcWhite;
    property    ThemeManager: TNaharThemeManager read GetThemeManager;
  end;

SetColor代码是:

procedure TNaharWebDBEdit.SetColor(const Value: TNaharPalleteColor);
begin
  FThemeColor := Value;

  UpdateColor;
end;

其中UpdateColor只检索主题的当前指定颜色,并且设置在Self.Color上。

一切正常。 ThemeColor属性显示在属性视图中,我可以将其更改为其他值。然而,在我保存表单并再次打开后,它又恢复到原始值,甚至不是默认值。

我制作了12个这样的组件,以及所有类似的代码。仅在Panel(来自TuniPanel)上工作正常,该属性保留在设计期间分配的值并在运行时正确检索它。

某些值未保存或未恢复属性。怎么抓住那个?

编辑:

  TNaharPalleteColor = (npcMainColor, npcColorA, npcColorB, npcColorC, npcColorD, npcWhite, npcBlack, npcUnknown, npcNone);

我已将ThemeColor的值更改为npcWhite并保存。我在Notepad ++上打开了DFM,发现它没有被保存

我在属性上添加了STORED TRUE,它没有任何区别,仍然没有存储它。

但是,如果我关闭表单并再次打开它,它会将ThemeColor显示为npcMainColor(0),而不是默认值为npcWhite

编辑: 我已经打开了使用此组件的其他表单,并且可以看到之前该属性已被保存。打开并再次保存后,它将从DFM中删除。唯一仍然有效的是TuniPanel的后代,即TPanel。但它具有相同的代码,它都是复制和粘贴。

我已从课程中删除了这一行:

    FThemeController: TNaharThemeController;

现在组件正确保存DFM上的FThemeColor,按预期工作。为什么呢?

1 个答案:

答案 0 :(得分:7)

请参阅Default Property Values的文档。默认值不会保存到.dfm。 我猜你忘了将FThemeColor初始化为构造函数中的默认值。 (由于实例字段始终初始化为零值,因此仅在默认值为非零时才需要这样做。)