编写C ++ Builder / Delphi组件并将二进制属性保存到DFM文件

时间:2013-01-16 11:35:32

标签: delphi components c++builder-xe dfm tpersistent

我写了一个C ++构建器组件来显示SVG文件在它们上面执行一些操作。

目前,我发布了一个名为SvgFile(UnicodeString)的属性,该属性可以在IDE中使用SVG文件的文件名进行初始化。这很好用。此属性保存在DFM文件中,可以从中重新加载。

但是我必须提供带有应用程序的SVG文件,所以我想将SVG保存到DFM文件中,就像使用TImage组件一样。

我想我必须写一个TPropertyEditor,也许是一个TPersistent类,但我不知道该怎么做。

有人可以帮我这么做吗?

编辑2013/01/17:这是一个解决方案http://www.informit.com/articles/article.aspx?p=28278&seqNum=5

感谢您的帮助。

1 个答案:

答案 0 :(得分:6)

您可以通过编写自己的方法来创建自己的方法来读取和写入属性,以便在流中执行二进制数据的流式处理,并使用DefineProperties将它们注册到VCL / RTL流式系统和DefineBinaryProperty。 JEDI JVCL单元JVXSlider.pas中有一个易于理解的示例:

// interface
type
  TJvCustomSlider=class(TJvCustomControl)
  private
    procedure ReadUserImages(Stream: TStream);
    procedure WriteUserImages(Stream: TStream);
    ...
  protected
    procedure DefineProperties(Filer: TFiler); override;


// implementation
procedure TJvCustomSlider.DefineProperties(Filer: TFiler);

  function DoWrite: Boolean;
  begin
    if Assigned(Filer.Ancestor) then
      Result := FUserImages <> TJvCustomSlider(Filer.Ancestor).FUserImages
    else
      Result := FUserImages <> [];
  end;

begin
  // @RemyLebeau points out that the next line is apparently a bug
  // in the JVCL code, and that inherited DefineProperties should always
  // be called regardless of the type of Filer. Commented it out, but
  // didn't delete it because it *is* in the JVCL code I cited.

  //if Filer is TReader then
    inherited DefineProperties(Filer);
  Filer.DefineBinaryProperty('UserImages', ReadUserImages, WriteUserImages, DoWrite);
end;

procedure TJvCustomSlider.ReadUserImages(Stream: TStream);
begin
  Stream.ReadBuffer(FUserImages, SizeOf(FUserImages));
end;

procedure TJvCustomSlider.WriteUserImages(Stream: TStream);
begin
  Stream.WriteBuffer(FUserImages, SizeOf(FUserImages));
end;

Delphi流系统将根据需要自动调用已定义属性的适当方法(在上面的示例中,属性UserImages),以自动保存或读取dfm文件;你永远不需要自己打电话。