2009-05-21 3 views
5

Certaines applications que nous utilisons dépend de descendants TComponent facilement sauvegarder/charger l'état de ses objets internes, avec l'aide de l'écriture/ReadComponentResFileCompress TComponents tout en les écrivant dans un TStream

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

Maintenant, nous le ferions tiens à compresser ces données, mais pour une raison quelconque, j'ai été incapable de trouver un moyen d'écrire une fonction similaire à l'aide de la classe de flux JCL bzip2, quelque chose à propos de l'opération de recherche n'est pas supporté

Comme je ne suis pas un expert TStream, je voudrais aimerais connaître la façon la plus simple pour moi de mettre en œuvre une telle compression; travailler avec TComponent lire/écrire?

Merci

Répondre

14

TComponent veut apparemment être en mesure de rechercher dans le flux, il lit ou écrit, et vous ne peuvent généralement pas faire avec des flux compressés - au moins pas en arrière. Une fois que vous avez lu un octet, vous ne pouvez pas revenir en arrière et le relire, car la valeur que vous obtenez peut dépendre du contenu entier du flux qui a conduit à cet octet. Chercher en arrière à relire un octet pourrait signifier relire le flux entier. Et pour écrire, revenir en arrière et "réparer" une partie du flux, changer un octet signifierait avoir besoin de recomprimer tout ce qui vient après. Vous pouvez donc voir pourquoi les flux compressés n'aiment pas chercher en arrière.

Ecrivez vos données dans un TMemoryStream, puis copiez le contenu de ce flux dans un flux compressé par la suite. Pour lire, copiez le flux de décompression dans un TMemoryStream puis chargez vos composants à partir de là. (N'oubliez pas de remettre la propriété Position à zéro avant de charger le composant hors du flux de mémoire.)

+0

Comme toujours, bonne explication pour compléter la solution. Gloire. – mghie

Questions connexes