2009-05-21 13 views
5

Algunas aplicaciones que usamos depende de descendientes TComponent a guardar fácilmente/cargar el estado de sus objetos internos, con la ayuda de escritura/ReadComponentResFileComprimir TComponents al escribir en un TStream

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

Ahora nos me gusta comprimir estos datos, pero por alguna razón no he podido encontrar una forma de escribir una función similar usando la clase de flujo JCL bzip2, algo sobre la operación de búsqueda no es compatible

Como no soy un experto en TStream, lo haría me gusta saber la forma más fácil para mí de implementar dicha compresión; trabajando con TComponent de lectura/escritura?

Gracias

Respuesta

14

TComponent parecer quiere ser capaz de buscar en la corriente se lee o escribe en, y por lo general no pueden hacer eso con transmisiones comprimidas - al menos no hacia atrás. Una vez que haya leído un byte, no podrá volver atrás y volver a leerlo porque, en primer lugar, el valor que obtenga puede depender del contenido completo de la secuencia que lo condujo a ese byte. Buscar hacia atrás para volver a leer un byte podría significar volver a leer todo el flujo. Y para escribir, para volver y "arreglar" alguna región de la transmisión, cambiar un byte significaría tener que volver a comprimir todo lo que venga después. Entonces puede ver por qué las transmisiones comprimidas no desean buscar hacia atrás.

Escriba sus datos en TMemoryStream y luego copie el contenido de esa secuencia a una secuencia comprimida posteriormente. Para leer, copie la secuencia de descompresión en TMemoryStream y luego cargue sus componentes desde allí. (No olvide establecer la propiedad Position en cero antes de cargar el componente fuera de la secuencia de memoria.)

+0

Como siempre, una buena explicación para complementar la solución. Prestigio. – mghie

Cuestiones relacionadas