Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

TMemoryStream

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: TMemoryStream Responder citando

Hola a tod@s!

Estoy empezando a trabajar con este componente y hay algunas cosas que no entiendo. Lo primero que quiero hacer es inicializar todo el "bloque" de memoria con un determinado valor, por ejemplo con el caracter 'F'. Además el tamaño de mi bloque de memoria debe ser de 1000 bytes. Bien, para ello hago lo siguiente:

TMemoryStream* memoria=new TMemoryStream();
memoria->SetSize(1000);
char buff[1000];
for (int i=0;i<1000;i++)
buff[i]='F';
memoria->Write(buff,1000);

Para saber si ha escrito bien los datos en memoria tengo un RichEdit en el que pretendo escribir el contenido de memoria:

RichEdit1->Lines->LoadFromStream(memoria);

Pero no escribe nada en el RichEdit, sin embargo si lo guardo en un fichero de texto sí funciona, es decir, que si hago:

memoria->SaveToFile("FicheroMemoria.TXT");

Si abro FicheroMemoria veo que sí están grabadas las FFF.....

Me pregunta es por qué no sale nada en el Richedit?

Gracias a todos y espero haberme explicado bien.

Saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Mónica:

El método Write del TMemoryStream deja el puntero señalando al final de donde escribió, por tanto necesitas "rebobinar" la posición del puntero al principio. Por tanto antes de usar el ...LoadFromStream tendrías que poner:

    memoria->Position = 0;

O bien lo siguiente que hace lo mismo:

    memoria->Seek(0, soFromBeginning);


Luego usando la propiedad 'Memory' del TMemoryStream puedes abreviar un poco el código, ya que en esa propiedad tienes un puntero al 'buffer' del stream. O sea, que abreviado quedaría algo así:

    TMemoryStream *memoria = new TMemoryStream();
    memoria->SetSize(1000);
    memset(memoria->Memory, 'F', 1000);
    RichEdit1->Lines->LoadFromStream(memoria);
    //...

(En este caso no necesitamos "rebobinar" ya que no usamos Write y por tanto la posición sigue siendo 0)

También podemos escribir en la propiedad Memory del siguiente modo:

    static_cast<BYTE*>(memoria->Memory)[0] = 'F';
    static_cast<BYTE*>(memoria->Memory)[1] = 'F';
    //...

Saludos:
_Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy

¡Muchísimas gracias _Leo!, funciona perfectamente. Probé lo de posicionar el puntero al inicio y así funciona a la perfección, pero lo del método Memory me viene muy bien.

Un millón de gracias!

Saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.