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

Edu*_*ias 1 delphi custom-component delphi-xe2

德尔福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;
Run Code Online (Sandbox Code Playgroud)

SetColor代码是:

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

  UpdateColor;
end;
Run Code Online (Sandbox Code Playgroud)

UpdateColor只是为目标指定的主题颜色和设置在Self.Color上.

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

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

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

编辑:

  TNaharPalleteColor = (npcMainColor, npcColorA, npcColorB, npcColorC, npcColorD, npcWhite, npcBlack, npcUnknown, npcNone);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

    FThemeController: TNaharThemeController;
Run Code Online (Sandbox Code Playgroud)

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

Ond*_*lle 7

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