2009-05-21 3 views
5

使用しているアプリケーションの中には、TComponentの子孫に依存して、内部オブジェクトの状態を簡単に保存/読み込むことができます。Write/ReadComponentResFileコンポーネントをストリームに書き込んでいる間にコンポーネントを圧縮する

function TSomeClass.SaveState: boolean; 
begin 
    ... 
    try 
    ... 
    WriteComponentResFile(self.f_path, TComponent(self)); 
    result := true; 
    except 
    result := false; 
    end; 
    .... 
end; 

これで圧縮したいのですが、私はJCL bzip2ストリームクラスを使って同様の関数を書く方法を見つけることができませんでした。シーク操作はサポートされていません。

私はTStreamのエキスパートではありませんので、そのような圧縮; TComponentの読み書きはできますか?

ありがとう

答えて

14

TComponentは明らかにそれがの読み書きを行うストリームに求めることができるように望んでいる、とあなたは、一般的に圧縮されたストリームでこれを行うことはできません - 後方ではない、少なくとも。あるバイトを読み終えたら、戻ってもう一度読むことはできません。なぜなら、どんな価値が得られるかは、最初にそのバイトにつながったストリームの内容全体に依存するかもしれないからです。逆に1バイトを読み直すと、ストリーム全体を読み直すことができます。そして、書き込みのために、ストリームの一部の領域を "修復"するために、1バイトを変更すると、それ以降のすべてのデータを再圧縮する必要があります。圧縮されたストリームがなぜ後方に向かうのが好きではないかを知ることができます。

データをTMemoryStreamに書き込み、その後、そのストリームの内容を圧縮ストリームにコピーします。読み込むには、解凍ストリームをTMemoryStreamにコピーし、そこでコンポーネントを読み込みます。 (メモリストリームからコンポーネントをロードする前に、Positionプロパティを0に戻すことを忘れないでください)

+0

いつものように、ソリューションを補完する良い説明です。名声。 – mghie

関連する問題