【问题标题】:Wrong value retrieved for property stored on DFM in a custom component为自定义组件中存储在 DFM 上的属性检索到错误值
【发布时间】:2014-01-06 18:23:51
【问题描述】:

德尔福 XE2

我有以下自定义组件:

  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 个这样的组件,以及所有类似的代码。只有在面板上(来自 TuniPanel)才能正常工作,该属性保持设计期间分配的值并在运行时正确检索它。

不知何故,该值未保存或属性未恢复。怎么抓?

编辑:

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

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

我已经在属性上添加了 STORED TRUE 并且它没有任何区别,仍然没有将它存储在那里。

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

编辑: 我已经打开了其他使用该组件的表单,并且可以看到之前该属性已被保存。当打开并再次保存时,它会从 DFM 中删除。唯一仍在工作的是 TuniPanel 的后代,即 TPanel。但是代码完全一样,都是复制粘贴。

我已经从课堂上删除了这一行:

    FThemeController: TNaharThemeController;

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

【问题讨论】:

  • TNaharPalleteColor类型是如何定义的?
  • “不知何故该值未保存或属性未恢复” - 没有“或”。您应该确定那里究竟发生了什么。这将使潜在错误区域减少一半。因此,在您保存表单后 - 在记事本中或在 Total Commander、Unreal Commander 等的某些文本查看器中打开 DFM 文件。在某些不会运行实际组件代码的被动文本查看器中。并查看是否保存了正确的颜色。
  • TUniPanel 是来自那个神秘的 TUniGUI 库吗?我不知道我们是否可以假设 UniGUI 是如何工作的。 t 在封闭源中是不寻常的
  • @Tlama 我已经更新了问题,现在我有了你可以看到的 TNaharPalleteColor。
  • @Arioch'The 谢谢纠正我。当您指出我并更新了问题时,我已经进行了测试。是的,它来自那个神秘的 uniGUI 库。 UniPanel 是 TWinControl 的后代。像该库中的所有其他组件一样。这个库一切正常,但是我决定实现我自己的组件版本,以防万一库支持消失而我需要自己去。

标签: delphi delphi-xe2 custom-component


【解决方案1】:

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

【讨论】:

  • 感谢您指出,我已经更改了我的构造函数,以使用与我在属性的 Default 选项上相同的值来初始化 FThemeColor。这解决了问题的一部分。主要问题仍然存在,即没有将属性存储在 DFM 上。
  • 它解决了问题的哪一部分?据我所知,您的问题仅说明了一个问题:默认值 ncpWhite 未存储到 .dfm。这是设计使然:默认值永远不会存储在 .dfm 中。由构造函数初始化为该值(如果它不为零)。顺便说一句,你需要重建包。
  • 没有存储任何内容。当我打开 dfm 时,值不存在(FThemecolor)。但是它适用于面板后代,并且它们使用相同的代码。我看不出哪里不一样。打开另一个表单,我可以看到以前甚至问题中的代码都有效,但是在保存 DFM 后,主题颜色被删除。您的回答纠正了一件错误的事情:我期望属性中的默认值初始化了变量,但我错了。我在构造函数上纠正了这一点。但是仍然没有保存在 DFM 上
  • “仍然没有保存在 DFM 上” - 如果程序不工作,最好调试它。如果组件的流存储失败,最好逐行跟踪它,看看它在哪里偏离了轨道。
猜你喜欢
  • 2021-01-17
  • 2016-07-03
  • 2011-04-24
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
相关资源
最近更新 更多