0

How best could I save this component and all internal variables? Examples of code would be appreciated.

  TSmall = record
      fName: string[30];
      fAge: integer;
      fID_Number: string[30];
  end;

  TRec = record
    ArraySmall: array[1..10] of TSmall;
  end;

  TBigComponent = class(TComponent)
    private
      fSmallArr: TRec;
      fCompCount: integer;
      fBigName: string;
    public
      procedure AddNew(Name: string; Age: integer; ID: string);
      procedure Save(FileName: string);
      procedure Load(FileName: string);
      procedure SetName(Name: string);
      function GetName: string;
      function ToString: string;
    published
      property SmallArr: TRec read fSmallArr write fSmallArr;
      property Count: integer read fCompCount write fCompCount;
      property Name: string read fBigName write fBigName;
    end;
4

3 回答 3

2

对 Wouter 建议的一个小改进:

 type
  TSmall = record
      fName: string[30];
      fAge: integer;
      fID_Number: string[30];
  end;

  TRec = record
    ArraySmall: array[1..10] of TSmall;
  end;

  TBigComponent = class(TComponent)
  private
      type
        TInternalFields = record
          SmallArr: TRec;
          CompCount: integer;
          BigName: Shortstring;
       end;
    var
      FFields : TInternalFields;
    public
      procedure AddNew(Name: string; Age: integer; ID: string);
      procedure Save(FileName: string);
      procedure Load(FileName: string);
      procedure SetName(Name: string);reintroduce;
      function GetName: string;
      function ToString: string;
    published
      property SmallArr: TRec read FFields.SmallArr write FFields.SmallArr;
      property Count: integer read FFields.CompCount write FFields.CompCount;
      property Name: ShortString read FFields.BigName write FFields.BigName;
    end;

procedure TBigComponent.Save(FileName: string);
var
  F:File of TInternalFields;
begin
  AssignFile(F,FileName);
  Rewrite(F);
  Write(F, FFields);
  CloseFile(F);
end;

这消除了将对象中的每个字段复制到记录中的需要 - 它已经在记录中。

我不确定何时添加了read Record.field语法 - 它是在 2006 年

于 2009-04-03T01:45:48.870 回答
1

要使用 Delphi 内部持久性和 RTTI,您应该使用类而不是记录。

这里有很多很好的建议和例子:

使用 RTTI 而不是自定义代码将 Delphi 对象树序列化为 XML 的好方法是什么?

如果您正在寻找将自定义数据保存到可视组件的示例,请检查 Delphi VCL 源代码中的 ComCtrls.pas 文件中的方法 TTreeNodes.DefineProperties。

于 2009-04-02T11:22:35.987 回答
1

一般来说,遵循 VilleK 的建议并利用 Tpersistent 提供的东西可能是最容易的。

但是,不知何故,我更喜欢这种方法,因此我可以完全控制文件的结构。

type
  TFileStruct=packed record
    fSmallArr: TRec;
    fCompCount: UINT32; // be explicit.. who knows what 64bit Delphi does to your integers...
    fBigName: String[250]; // AnsiChar
  end;

procedure TBigComponent.Save(FileName: string);
var
  F:File of TFileStruct;
  FileStruct:TFileStruct;
begin
  FileStruct.fSmallArr := fSmallArr;
  FileStruct.fCompCount := fCompCount;
  FileStruct.fBigName := fBigName;

  AssignFile(F,FileName);
  Rewrite(F);
  Write(F,FileStruct);
  CloseFile(F);
end;

请记住,String[xxx] 似乎被视为 AnsiString,因此如果您使用 Delphi 2009,您的 Unicode 字符串将在您保存时更改为 AnsiStrings。至少文件可以与用旧版本的 Delphi 编译的软件交换。

在 TSmall 中,我会将 Age 的整数更改为 Byte,这样您就不会遇到 64 位 Delphi 的麻烦。
“8 位应该对每个人都足够了”(c) 2009 Wouter :-)

于 2009-04-02T12:02:52.070 回答