如何有条件地将属性保存到 DFM?

Posted

技术标签:

【中文标题】如何有条件地将属性保存到 DFM?【英文标题】:How to conditionally make a property save to the DFM or not? 【发布时间】:2013-12-31 16:20:52 【问题描述】:

我有一对组件,其中一个组件通过设置属性“附加”到另一个组件。比如……

type
  TMain = class(TComponent)
  ...
  published
    property Default: Integer read FDefault write SetDefault;
  end;

  TSub = class(TComponent)
  ...
  published
    property Value: Integer read GetValue write SetValue;
    property Main: TMain read FMain write SetMain;
  end;

所以在TSub 的对象检查器中,用户会选择与之关联的TMain

在子组件中,我有一个属性Value,它有一个getter 和一个setter。如果子组件的值设置为0,则getter 会从它所附加的TMain 中获取Default 属性...

function TSub.GetValue: Integer;
begin
  if FValue = 0 then begin
    if Assigned(FMain) then begin
      Result:= FMain.Default;
    end else begin
      Result:= 0;
    end;
  end else begin
    Result:= FValue;
  end;
end;

这使得对象检查器(以及其自身的属性)从主检查器返回默认值,而不是设置的 0 值。

我想做的是确保当 TSub 组件的属性保存到 DFM 时,如果它是 0,它不会保存此属性(因此使用 main 中的默认值)。目前,在保存 DFM 后,来自 main 的默认值的任何值都将保存在 sub 的值中,这不是我想要的。

自然地,属性将被标记为default 0;,例如表示如果属性的值设置为0,则该属性将不会保存到 DFM 中。但由于默认值可能会有所不同,因此我无法为该属性标记默认值(因为它需要定义默认值)。

如果TSub 组件已设置为0,我如何构造TSub 组件以将此属性保存到DFM,而是使用属性getter 中main 中的默认值? p>

【问题讨论】:

docwiki.embarcadero.com/RADStudio/en/… 【参考方案1】:
property Value: Integer read GetValue write SetValue stored IsValueStored;

在哪里

function TSub.IsValueStored: Boolean;
begin
  Result := (FValue <> 0) or (FMain = nil);
end;

如果我猜对了。

【讨论】:

@Jerry - 谢谢。不要忘记查看documentation。 完全按照我的需要工作,再次感谢 Sertac

以上是关于如何有条件地将属性保存到 DFM?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi实现类的持久化保存(DFM格式)

如何有效地将 zmm 寄存器的低 64 位保存到内存中?

如何有效地将 Pandas Dataframe 保存到一个/多个 TFRecord 文件中?

如何正确地将时区设置为 UTC,以便以这种格式正确保存和检索所有时间戳?

如何将模板中的动态表传递给我的视图以迭代地将它们保存到我的数据库中

有条件地将“multiple”属性添加到 ui-select