2009-04-02 14 views
0

このコンポーネントとすべての内部変数を保存するにはどうすればよいですか?コードの例が分かるでしょう。Delphiコンポーネントの保存

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; 

答えて

1

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

良いアドバイスをたくさんと例がここにあります:あなたは、ビジュアルコンポーネントにカスタムデータを保存する例を探しているなら

What's a good way to serialize Delphi object tree to XML--using RTTI and not custom code?

、メソッドTTreeNodes.DefinePropertiesのためのDelphi VCLソース内をチェックファイルComCtrls.pas。

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; 

文字列が[XXX] AnsiStringのように扱われているようだ覚えておいてください、あなたはDelphi 2009では使用する場合は、保存するとき、あなたのUnicode文字列がのAnsiStringに変更されます。少なくとも、Delphiの古いバージョンでコンパイルされたソフトウェアとファイルを交換することができます。

TSmallでは、AgeをByteに変更するので、64bit Delphiで問題になることはありません。
「8ビットは、すべての人のために十分でなければなりません」(C)2009はWouterの:-)

+0

である(オフトピックは)それを指摘して32ビット –

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; 

レコード - すでにレコードに入っています。

がRECORD.FIELD構文が追加されました読んだとき、私はよく分からない - デヴィッド・I整数によると、それは2006

+0

感謝をままになります - 私が持っていました読んだRecord.field構文には当てはまらない。 – robsoft

関連する問題