La relación de herencia de TMemoryStream es la siguiente
Objeto
|
Tstream
|
TCustomMemoryStream
|
TMemoryStream
¿Cómo utilizar TMemoryStream?
De hecho, TmemoryStream se usa igual que TStream.
Para atributos y métodos específicos, consulte la ayuda.
He aquí un ejemplo:
¿Qué debo hacer si quiero leer y escribir un mapa de bits directamente en la memoria?
TmemoryStream te ayuda mucho
var
BitmapMemoryStream:TMemoryStream;
Mapa de bits1: TBmapa de bits;
Procedimiento TForm.Button1Click(Sender:TObject);
comenzar
BitmapmemroyStream:=TmemoryStream.Create file://Crear MemoryStream;
Mapa de bits1:=TBitmap.Create;
intentar
Bitmap1.LoadFromFile('d:Bitmap1.bmp');
excepto
ShowMessage('Error al cargar el archivo bitmap1.bmp');
fin;
fin;
procedimiento TForm.Button2Click(Sneder:Tobject);
comenzar
si está asignado (mapa de bits1), entonces
Bitmap1.SaveToStream (BitmapmemoryStream);
fin;
procedimiento TForm.Button3Click(Remitente:TObject);
comenzar
si BitmapMemoryStream<>nil entonces
comenzar
intentar
BitmapMemroyStream.SaveToFile('Bitmap1.str'); archivo://guardado de flujo de memoria, tamaño y
archivo://Bitmap1.bmp mismo
excepto
showmessage('¡error en la memoria de acceso!');
fin;
fin;
fin;
procedimiento TForm.Button4Click(Remitente:TObject);
var
Búfer: Matriz [0..53] de char;
comenzar
si está asignado (BitmapMemroyStream), entonces
intentar
BitmapMemroyStream.Seek(0,soFromBeginning);
BitmapMemoryStream.Read(Buffer,54);
si Buffer[0]='B' y Buffer[1]='M' entonces file://reescribe el contenido de la memoria
comenzar
BitmapMemoryStream.Seek(0,soFromBeginning);
BitmapmemoryStream.Write('ICE',3);
Button3Click(Sender);//Escribe el contenido reescrito en el archivo
fin;
excepto
ShowMessage('error al acceder a memroyStream');
fin;
fin;
Puede ver lo conveniente que es usar TMemoryStream para leer y escribir en la memoria. Por supuesto, no es necesario crear un mapa de bits primero.
Puede usar LoadFromFile para iniciar el archivo directamente, pero para otras secuencias de memoria, puede usar el método anterior.
Lo anterior es solo una introducción. Para otras funciones, puede leer la ayuda y descubrirlas usted mismo.
Hay muchos otros objetos de transmisión, todos los cuales son prácticamente iguales, ¡así que puedes usarlos todos!
Cómo escribir el contenido de una secuencia en el portapapeles y procesarlo
Esta técnica se logra con referencia a la implementación de la clase portapapeles de Delphi. Poner el contenido de una secuencia en el portapapeles,
Primero, registre su propio formato usando la función RegisterClipboardFormat()
Luego siga los siguientes tres pasos:
1. Cree un flujo de contenido y escriba el contenido en él.
2. Cree un área de contenido global y escriba el contenido de la transmisión.
3. Llame a ClipBoard.SetAsHandle() para escribir el contenido en el portapapeles.
Escribir contenido en el portapapeles
var
hbuf :TManejar;
bufptr: Puntero;
mstream: TMemoryStream;
comenzar
mstream := TMemoryStream.Create;
intentar
{-- Código para procesar flujos --}
hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
intentar
bufptr := GlobalLock(hbuf);
intentar
Mover(mstream.Memory^, bufptr^, mstream.size);
Portapapeles.SetAsHandle(CF_MYFORMAT, hbuf);
finalmente
Desbloqueo global(hbuf);
fin;
excepto
GlobalFree(hbuf);
aumentar;
fin;
finalmente
mstream.Gratis;
fin;
fin;
Tenga cuidado de no liberar el búfer global asignado. Este trabajo lo realiza el portapapeles al leer los datos.
Debes copiarlo y procesarlo más tarde.
Leer el contenido del portapapeles.
var
hbuf :TManejar;
bufptr: Puntero;
mstream: TMemoryStream;
comenzar
hbuf := Portapapeles.GetAsHandle(CF_MYFORMAT);
si hbuf <> 0 entonces comienza
bufptr := GlobalLock(hbuf);
si bufptr <> nil entonces comienza
intentar
mstream := TMemoryStream.Create;
intentar
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
mstream.Posición: = 0;
{-- Código para procesar flujos --}
finalmente
mstream.Gratis;
fin;
finalmente
Desbloqueo global(hbuf);
fin;
fin;
fin;
fin;
Consejos para usar TStream para leer y escribir datos en Dephi
En Dephi se proporciona un tipo de datos abstracto TStream para admitir operaciones en la transmisión de datos. Estos datos generalmente provienen de archivos, bases de datos, objetos de memoria, objetos OLE, etc. TStream proporciona un método unificado y conciso para leer y escribir datos. En circunstancias normales, no necesitamos usar la clase TStream directamente, y la lectura y escritura de datos de transmisión están encapsuladas en los métodos del control VCL. Pero si estos métodos no pueden cumplir con nuestros requisitos, debemos controlar manualmente la lectura y escritura de datos nosotros mismos.
1. Métodos y propiedades de uso común de TStream:
---- 1. función Leer (var Buffer; Conteo: Entero largo): Entero largo virtual;
---- 2. función Escribir (búfer constante; Conteo: Entero largo): abstracto;
---- 3. función Buscar (Desplazamiento: Entero largo; Origen: Palabra): resumen;
---- 4. Posición de la propiedad: Entero largo;
---- 5. Tamaño de propiedad: Entero largo
---- Leer, escribir y buscar son funciones virtuales puras que proporcionan métodos abstractos para la lectura, escritura y posicionamiento de datos. El método Read lee los datos de Stream en el Buffer y el método Write implementa la operación opuesta. El valor de retorno indica el tamaño real de los datos leídos y escritos. Seek proporciona un método para mover el puntero de datos en Stream. El parámetro Origen puede tomar tres valores: soFromBeginning, soFromCurrent y soFromEnd. Offset es el desplazamiento y el valor de retorno es la posición del puntero de datos de Stream actual.
---- Posición representa la posición del puntero de datos en la secuencia. Esta propiedad se puede leer y escribir. En realidad, se implementa llamando al método Seek, por lo que es más conveniente utilizar esta propiedad en el uso real. El atributo Tamaño indica el tamaño de la secuencia actual. Para diferentes secuencias, a veces es de solo lectura.
2. Lectura y escritura de datos Stream.
---- 1. SaveToStream(Stream: TStream file://escribe los datos de la clase en la posición actual de Stream);
---- 2. LoadFromStream(Stream: TStream file://Leer los datos en Stream desde la posición actual);
---- En el uso real, básicamente solo necesitamos usar las dos funciones anteriores.
3. Ejemplos
---- El diagrama de árbol de herencia de TStream se muestra en la Figura 1 (omitido). En el uso real, TFileStream, TMemoryStream y TblobStream se usan más comúnmente como ejemplos para ilustrar el uso específico.
---- Cree un formulario Form1, coloque tres botones btnRead, btnInvert, btnSave y un cuadro de diálogo de apertura de archivos OpenDialog1, así como los controles de datos DataSource1, Table1, test.
---- Utilice el escritorio de base de datos proporcionado por Dephi para crear una prueba de tabla. Hay un campo Imagen en la tabla y el nombre del archivo de la base de datos se guarda como test.db. Coloque un control TDatabase dbTest, un control TTable Table1, un control DataSource DataSource1 y un control TDBNavigator DBNavigator1 en el formulario. Conecte dbTest a la base de datos que acaba de crear Desktop, establezca la propiedad TableName de Table1 en test.db, establezca la propiedad DataSet de DataSource1 en Table1, establezca la propiedad DataSource de DBNavigator1 en DataSource1 y establezca las primeras cuatro propiedades de VisibleButtons en TRUE. Además, establezca Connected de dbtest en TRUE y la propiedad Active de Table1 en TRUE para que la base de datos esté abierta desde el principio.
----El código del evento está escrito de la siguiente manera:
---- 1. Haga clic en el evento de btnRead, aquí se demuestra el uso de TFileStream.
var
EM: TFileStream;
comenzar
si OpenDialog1.Execute entonces
comenzar
MS:=TFileStream.Crear
(OpenDialog1.FileName, fmOpenRead);
Imagen1.Imagen.Mapa de bits.LoadFromStream(MS);
MS.Gratis;
fin;
fin;
---- 2. Haga clic en el evento de btnInvert, aquí se demuestra el uso de TMemoryStream. Se utiliza la función Invertir, que es una función simple que invierte el color de una imagen (solo válida para imágenes en color verdadero). Devuelve un puntero al bloque de datos de la imagen procesada.
var
METRO
S: TMemoryStream;
pImagen: puntero;
comenzar
MS:=TMemoryStream.create;
Imagen1.Imagen.Mapa de bits.SaveToStream(MS);
Posición.MS:=0;
pImagen:=Invertir(MS.Memoria, MS.tamaño);
El atributo file://Memory es un puntero al bloque de memoria real.
MS.Write(pImage^,MS.size);
Posición.MS:=0;
La línea de código anterior en file:// mueve el puntero al final de Stream, por lo que es necesario restablecerlo.
Imagen1.Imagen.Mapa de bits.LoadFromStream(MS);
FreeMem(pImagen);
MS.Gratis;
fin;
La función Invertir es la siguiente:
función TForm1.Invertir
(pImage: puntero; tamaño: Entero): puntero;
var
pData, pMem: PChar;
i: Entero;
comenzar
pMem:=AllocMem(tamaño);
CopiarMemoria(pMem,pImagen,tamaño);
pDatos:=pMem+54;
para i:=0 al tamaño-54-1 hacer
comenzar
pData^:=Char(no entero(pData^));
pDatos:=pDatos+1;
fin;
Resultado:=pMem;
fin;
---- 1. Haga clic en el evento de btnSave. Aquí se muestra otro uso de TMemoryStream, escribiendo los datos del Stream en la base de datos.
var
EM: TMemoryStream;
comenzar
MS:=TMemoryStream.create;
Imagen1.Imagen.Mapa de bits.SaveToStream(MS);
Posición.MS:=0;
Tabla 1.Anexar;
file://agrega un registro en la base de datos
TBlobField(Tabla1.CampoporNombre
('imagen')).LoadFromStream(MS);
Tabla1.Publicar;
file://escribe las actualizaciones en la base de datos
fin;
---- 4. Evento de clic de DBNavigator1. Aquí se demuestra el uso de TBlobStream, utilizando un método diferente al de escribir para leer los datos de imagen de la base de datos.
var
EM: TStream;
comenzar
con la Tabla 1 hacer
MS:=CrearBlobStream
(FieldbyName('imagen'),bmRead);
Imagen1.Imagen.Mapa de bits.
CargaDesdeStream(MS);
MS.Gratis;
fin;
Eso es todo. Gracias por leer este artículo. No tengo suficientes puntos para usar, así que tengo que ganar algunos puntos para canjearlos. Si cree que este artículo le resulta útil, vote por mí, gracias.