FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Optener un Stream como "Result" en una funcion
Buenas:
Estoy mejorando una aplicación y se me ocurrio usar Streams en lugar de archivos temporales pero no he podido "pasar" el resultado de una funcion como un stream. El caso es el siguiente: Tengo una aplicacion que usa campos memo para almacenar archivos html (comprimidos) (En el registro 1 guardo los encabezados, y en los siguientes los diferentes contenidos, lo trabajé así para ahorrar espacio ya que como los html son generados desde winword los encabezados de los archivos eran identicos y muy, MUY grandes) entonces para poder usar el archivo html completo uso:
Como pueden ver eso me deja con un archivo temporal (destino) Que cargo en un componente WebBrowser: TEmbeddedWB que permite usar: WebBrowser.LoadFromFile(Destino); Pero revizandolo un poco más tambien permite cargarlo desde: WebBrowser.LoadFromStream(Destino); Lo que quisiera hacer es convertir el procedimiento anterior en una funcion donde al final poga algo como:
He hecho algunas pruebas y he tenido problemas con los create's y Free's ya que al final no sé si debo liberar el objeto asignado al result o si tengo que crear un objeto para asignarle el resultado. En fin lo que necesito es un ejemplo de una funcion en la que el resultado pueda ir directo a un método "LoadFromStream". Gracias Uso delphi 7 + el TEmbeddedWB (http://www.euromind.com/iedelphi/embeddedwb.htm) Toda la aplicación corre localmente y se usa para consultar unos informes históricos
__________________
Sitrico Última edición por sitrico fecha: 24-11-2004 a las 18:42:16. |
#2
|
||||
|
||||
Puedes regresar directamente como lo haces
pero no puedes liberarlo dentro de la misma función sino posteriormente. Por tanto, si usas simplemente:
tendrás una fuga de memoria ya que no tienes ninguna referencia al Stream devuelto para poder liberarlo, así que tendrías que hacer algo como:
de manera que no ahorras nada. Si de plano te da flojera escribir tanto podrías englobar el stream dentro de una interfaz:
En tu función CargarStream creas una instancia de TLazyStream y esa es la que devuelves usando LazyStream.Stream:
Así, cuando se pierda el contexto de LoadFromStream (es decir termine el procedimiento desde donde lo llamas) CargarStream, siendo una interfaz, automáticamente llamará al destructor de TLazyStream. // Saludos |
#3
|
||||
|
||||
Bueno Gracias (aunque la parte del interface escapa de mis posibilidades actuales ) creo que has dado en el clavo.
Por suerte, el trabajo de crear los html lo realizo dentro de un objeto:
Ahora se me ocurre que puedo cambiar el objeto padre de TObject a TMemoryStream (que cuenta con los Métodos LoadFromStream y LoadFromFile (y los save...) entonces lo unico que tendría que hacer es modificar las rutinas para que en lugar de terminar creando un archivo temporal cargen el stream en el propio objeto derivado de TMemoryStream y no tendría que usar una función para obtener el resultado sino que mi objeto TGenHTML seria un "TStreamGenHTML" Voy a probar a ver que sale. Gracias nuevamente.
__________________
Sitrico |
#4
|
||||
|
||||
Bueno, quedo muy bien, al convertir el objeto a un tMemoryStream lo único que tuve que hacer fue asignar el resultado a la variable "Self" y listo
Puedo usar:
Pero y siempre hay un pero. El componente tEmbeddedWB recibe el archivo html y lo muestra como texto (el código html) aparece: <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns........ En lugar del archivo formateado. Pienso que el problema puede estar en el largo de la línea (algunas de mucho más de 256 carácteres) o bien en el primer caracter del stream (distinto a "<") como puedo "Ver" y editar el contenido de un MemoryStream? Ya he probado casí todo y por lo visto el problema es del tEmbeddedWB voy a buscar otras opciones y si acaso luego pondré otro post.
__________________
Sitrico Última edición por sitrico fecha: 24-11-2004 a las 23:51:46. Razón: Pruebas |
|
|
|