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.