Mecanismo de lectura y escritura de componentes de Delphi (1)
1. Introducción a los objetos de transmisión (Stream) y los objetos de lectura y escritura (Filer)
En la programación orientada a objetos, la gestión de datos basada en objetos juega un papel importante. En Delphi, el soporte para la gestión de datos basada en objetos es una característica importante.
Delphi es un entorno de desarrollo integrado que combina diseño visual orientado a objetos con lenguaje orientado a objetos. El núcleo de Delphi son los componentes. El componente es un tipo de objeto. Las aplicaciones Delphi se construyen enteramente a partir de componentes, por lo que el desarrollo de aplicaciones Delphi de alto rendimiento implicará inevitablemente tecnología de gestión de datos basada en objetos.
La gestión de datos de objetos incluye dos aspectos:
● Usar objetos para administrar datos.
● Gestión de diversos objetos de datos (incluidos objetos y componentes)
Delphi resume las clases de gestión de datos basadas en objetos en objetos Stream (Stream) y objetos Filer (Filer), y los aplica a todos los aspectos de la Biblioteca de clases de componentes visuales (VCL). Proporcionan funciones completas para administrar objetos en la memoria, almacenamiento externo y recursos de Windows.
El objeto Stream, también conocido como objeto streaming, es el nombre colectivo de TStream, THandleStream, TFileStream, TMemoryStream, TResourceStream y TBlobStream. Representan, respectivamente, la capacidad de almacenar datos en varios medios. Abstraen las operaciones de gestión de varios tipos de datos (incluidos objetos y componentes) en la memoria, la memoria externa y los campos de la base de datos en métodos de objeto, y hacen un uso completo de la tecnología orientada a objetos. La ventaja es que las aplicaciones pueden copiar datos en varios objetos Stream con bastante facilidad.
Los objetos de lectura y escritura (Filer) incluyen objetos TFiler, objetos TReader y objetos TWriter. El objeto TFiler es el objeto básico para la lectura y escritura de archivos. TReader y TWriter se utilizan principalmente en aplicaciones. Tanto los objetos TReader como TWriter heredan directamente de los objetos TFiler. El objeto TFiler define las propiedades y métodos básicos del objeto Filer.
El objeto Filer completa principalmente dos funciones principales:
● Acceder a archivos de formulario y componentes en archivos de formulario
●Proporcionar almacenamiento en búfer de datos para acelerar las operaciones de lectura y escritura de datos.
Para tener una comprensión perceptiva de los objetos de transmisión y los objetos de lectura y escritura, primero veamos un ejemplo.
a)Escribir un archivo
Procedimiento TFomr1.WriteData (Remitente: TObject);
var
Corriente de archivos: TFilestream;
Mi escritor: TWriter;
yo: entero
Comenzar
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);//Crear un objeto de secuencia de archivos
Mywriter:=TWriter.create(FileStream,1024); //Asociar Mywriter con FileStream
Mywriter.writelistbegin; // Bandera de inicio de la lista de escritura
Para i:=0 a Memo1.lines.count-1, haga
Mywriter.writestring(memo1.lines[i]); //Guarda la información de texto del componente Memo en el archivo.
Mywriter.writelistend; //escribir marca de fin de lista
FileStream.seek(0,sofrombeginning); //El puntero del objeto de secuencia de archivos se mueve al principio de la secuencia
Mywriter.free; //Libera el objeto Mywriter.
FileStream.free //Libera el objeto FileStream
Fin;
b) Leer archivos
procedimiento TForm1.ReadData(Remitente: TObject);
var
Corriente de archivos: TFilestream;
Mi lector:TReader;
Comenzar
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); //Asociar Myreader con FileStream
Myreader.readlistbegin; //Leer la marca de inicio de la lista escrita
Memo1.lines.clear; //Borrar el contenido de texto del componente Memo1
Mientras no sea myreader.endoflist hazlo //Presta atención a un método de TReader: endoflist
Comenzar
Memo1.lines.add(myreader.readstring); //Agrega la cadena de lectura al componente Memo1.
Fin;
Myreader.readlistend; //Leer la marca de final de la lista escrita
Myreader.free; //Libera el objeto Myreader
FileStream.free //Libera el objeto FileStream
Fin;
Los dos procesos anteriores, uno es un proceso de escritura y el otro es un proceso de lectura. El proceso de escritura pasa por TWriter y utiliza TFilestream para guardar el contenido (información de texto) en un Memo como un archivo binario guardado en el disco. El proceso de lectura es todo lo contrario del proceso de escritura. A través de TReader, TFilestream se utiliza para convertir el contenido del archivo binario en información de texto y mostrarlo en Memo. Cuando ejecuta el programa, puede ver que el proceso de lectura restaura fielmente la información guardada por el proceso de escritura.
El siguiente diagrama describe la relación entre los objetos de datos (incluidos objetos y componentes), objetos de transmisión y objetos de lectura y escritura.
Figura (1)
Vale la pena señalar que los escritores de aplicaciones rara vez llaman directamente a los objetos de lectura y escritura, como los objetos TFiler, TReader y TWriter. Generalmente se utilizan para leer y escribir el estado de los componentes. -Escribir mecanismo de componentes.
Para el objeto de transmisión Stream, muchos materiales de referencia tienen introducciones muy detalladas, mientras que los materiales de referencia para los objetos TFiler, objetos TReader y objetos TWriter, especialmente los mecanismos de lectura y escritura de componentes, son raros. Este artículo rastreará el código original de VCL. y mecanismo de escritura.
2. Lectura y escritura de objetos (Filer) y mecanismos de lectura y escritura de componentes.
El objeto Filer se utiliza principalmente para acceder a archivos de formulario Delphi y componentes en el archivo de formulario, por lo que para comprender claramente el objeto Filer, debe conocer la estructura del archivo de formulario Delphi (archivo DFM).
Los archivos DFM se utilizan para formularios de almacenamiento de Delphi. La forma es el núcleo de la programación visual de Delphi. El formulario corresponde a la ventana de la aplicación Delphi, los componentes visuales del formulario corresponden a los elementos de la interfaz de la ventana y los componentes no visuales como TTimer y TOpenDialog corresponden a una determinada función de la aplicación Delphi. El diseño de aplicaciones Delphi en realidad se centra en el diseño del formulario. Por tanto, los archivos DFM también ocupan una posición muy importante en el diseño de aplicaciones Delphi. Todos los elementos del formulario, incluidas las propiedades del propio formulario, se incluyen en el archivo DFM.
En la ventana de la aplicación Delphi, los elementos de la interfaz están relacionados entre sí según la relación de propiedad, por lo que la estructura de árbol es la forma de expresión más natural. En consecuencia, los componentes del formulario también se organizan de acuerdo con la estructura de árbol; el archivo DFM, también Para expresar esta relación. Los archivos DFM se almacenan físicamente en formato de texto (antes de la versión Delphi2.0, se almacenaban como archivos binarios) y, lógicamente, las relaciones entre los componentes se organizan en una estructura de árbol. La estructura de árbol del formulario se puede ver claramente en este texto. A continuación se muestra el contenido del archivo DFM:
objeto Formulario1: TForm1
Izquierda = 197
Arriba = 124
…
Píxeles por pulgada = 96
Altura del texto = 13
objeto Botón1: TButton
Izquierda = 272
…
Título = 'Botón1'
Orden de tabulación = 0
fin
objeto Panel1: TPanel
Izquierda = 120
…
Título = 'Panel1'
Orden de tabulación = 1
objeto CheckBox1: TCheckBox
Izquierda = 104
…
Título = 'Casilla de verificación1'
Orden de tabulación = 0
fin
fin
fin
Este archivo DFM es generado por TWriter a través del objeto de transmisión Stream. Por supuesto, también existe un proceso de conversión de un archivo binario a un archivo de información de texto. Este proceso de conversión no es el objeto de este artículo, por lo que dicho proceso se ignora.
Cuando el programa comienza a ejecutarse, TReader lee los formularios y componentes a través del objeto de transmisión Stream, porque cuando Delphi compila el programa, ha compilado la información del archivo DFM en el archivo ejecutable usando la instrucción de compilación {$R *.dfm}, ¿y qué? Las lecturas de TReader son en realidad información sobre formularios y componentes que se compila en el archivo ejecutable.
TReader y TWriter no solo pueden leer y escribir la mayoría de los tipos de datos estándar en Object Pascal, sino que también pueden leer y escribir tipos avanzados como Lista y Variante, e incluso leer y escribir Propiedades y Componentes. Sin embargo, TReader y TWriter en sí mismos proporcionan funciones muy limitadas, y la mayor parte del trabajo real lo realiza la muy poderosa clase TStream. En otras palabras, TReader y TWriter son en realidad solo herramientas. Solo son responsables de los componentes de lectura y escritura. TStream completa las operaciones específicas de lectura y escritura.
Dado que TFiler es la clase ancestral común de TReader y TWriter, para comprender TReader y TWriter, primero debe comenzar con TFiler.