0

このコンポーネントとすべての内部変数をどのように保存すればよいでしょうか。コードの例をいただければ幸いです。

  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

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 に答える
1

Delphi の内部永続性と RTTI を利用するには、レコードの代わりにクラスを使用する必要があります。

ここにはたくさんの良いアドバイスと例があります:

カスタム コードではなく RTTI を使用して、Delphi オブジェクト ツリーを XML にシリアル化する良い方法は何ですか?

カスタム データをビジュアル コンポーネントに保存する例を探している場合は、ファイル ComCtrls.pas のメソッド TTreeNodes.DefineProperties の Delphi VCL ソースを確認してください。

于 2009-04-02T11:22:35.987 に答える