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

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

我编写了一个 C++ 构建器组件来显示 SVG 文件,并对其执行一些操作。

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

但是我必须向应用程序提供 SVG 文件,因此我想将 SVG 保存到 DFM 文件中,因为它是使用 TImage 组件完成的。

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

有人可以帮助我吗?

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

感谢您的帮助。

最佳答案

您可以通过编写自己的方法来创建自己的方法来读取和写入属性,以将二进制数据流式传输到流中或从流中传输,并使用 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 文件或从 dfm 文件中读取;您永远不需要自己调用他们。

关于delphi - 编写 C++ Builder/Delphi 组件并将二进制属性保存到 DFM 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14357482/

相关文章:

delphi - 以提升的权限运行在WIN7上失败

delphi - 如何将 TXT 文件作为资源添加到我的 EXE 文件中?

javascript - Angular,将来自组件的输入注入(inject)我的标题

Angular 2 setter 和 getter

migration - C++ Builder XE 无法成功从 BCB6 转换项目

c++ - 为什么在阻塞模式下不会为 TServerSocket 触发 OnClientConnect 和 OnClientError 事件

delphi - 如何获取 Advantage 数据库服务器的版本号?

delphi - 使用箭头对 ListView 列进行排序

java - 如何使GWT组件解耦

c++ - 这个字符串的范围是什么?