Skip to content

TMemoryStream en Delphi: Una Guía Completa

TMemoryStream es una de las clases más versátiles y útiles en Delphi para la manipulación de datos en memoria.

En este artículo, exploraremos qué es TMemoryStream, cómo utilizarlo, y profundizaremos en sus propiedades y eventos, acompañado de ejemplos de código detallados.

¿Qué es TMemoryStream?

TMemoryStream es una clase en Delphi que proporciona métodos para leer, escribir, y manipular streams de memoria. A diferencia de otros streams que operan con archivos o con la red, TMemoryStream trabaja completamente en la memoria RAM, lo que le confiere una alta velocidad de acceso y manipulación.

Creando un TMemoryStream

Para usar un TMemoryStream, primero debes crear una instancia de la clase:

var
  MemoryStream: TMemoryStream;
begin
  MemoryStream := TMemoryStream.Create;
  try
    // Utilizar MemoryStream
  finally
    MemoryStream.Free;
  end;
end;

Propiedades a tener en cuenta en TMemoryStream

Algunas propiedades clave de TMemoryStream incluyen:

  • Size: Indica el tamaño actual del stream en memoria.
  • Position: La posición actual en el stream para leer o escribir datos.
  • Memory: Proporciona acceso directo a la memoria subyacente del stream.

Trabajando con TMemoryStream

Escribiendo en un TMemoryStream

Para escribir en un TMemoryStream, puedes usar el método Write o WriteBuffer:

var
  Data: string;
begin
  Data := 'Hola mundo';
  MemoryStream.WriteBuffer(Data[1], Length(Data));
end;

Leyendo de un TMemoryStream

Para leer datos, utiliza el método Read o ReadBuffer:

var
  Data: string;
  Count: Integer;
begin
  SetLength(Data, MemoryStream.Size);
  MemoryStream.Position := 0;
  Count := MemoryStream.Read(Data[1], MemoryStream.Size);
end;

Copiando entre Streams

Puedes copiar datos de un stream a otro, por ejemplo, de un TFileStream a un TMemoryStream:

var
  FileStream: TFileStream;
begin
  FileStream := TFileStream.Create('archivo.txt', fmOpenRead);
  try
    MemoryStream.CopyFrom(FileStream, FileStream.Size);
  finally
    FileStream.Free;
  end;
end;

Guardando y Cargando desde un TMemoryStream

TMemoryStream ofrece métodos SaveToFile y LoadFromFile para interactuar con archivos:

// Guardar en archivo
MemoryStream.SaveToFile('salida.dat');

// Cargar desde archivo
MemoryStream.LoadFromFile('entrada.dat');

Eventos en TMemoryStream

A diferencia de otras clases, TMemoryStream no tiene eventos propios.

Sin embargo, puedes extender la clase para agregar funcionalidades personalizadas, como notificaciones de escritura o lectura.

Extendiendo TMemoryStream

Crear una subclase de TMemoryStream permite agregar eventos:

type
  TCustomMemoryStream = class(TMemoryStream)
  private
    FOnWrite: TNotifyEvent;
  protected
    procedure Write(const Buffer; Count: Longint); override;
  public
    property OnWrite: TNotifyEvent read FOnWrite write FOnWrite;
  end;

procedure TCustomMemoryStream.Write(const Buffer; Count: Longint);
begin
  inherited;
  if Assigned(FOnWrite) then
    FOnWrite(self);
end;

Consideraciones de Rendimiento

Aunque TMemoryStream es rápido, su uso inadecuado puede resultar en un alto consumo de memoria, especialmente con datos grandes.

Es importante gestionar su uso de manera eficiente y liberar la memoria cuando ya no sea necesaria.