Mécanisme de lecture et d'écriture des composants de Delphi (1)
1. Introduction aux objets de streaming (Stream) et aux objets en lecture-écriture (Filer)
Dans la programmation orientée objet, la gestion des données basée sur les objets joue un rôle important. Dans Delphi, la prise en charge de la gestion des données basée sur les objets est une fonctionnalité majeure.
Delphi est un environnement de développement intégré qui combine une conception visuelle orientée objet avec un langage orienté objet. Le cœur de Delphi est constitué de composants. Un composant est un type d'objet. Les applications Delphi sont entièrement construites à partir de composants. Le développement d'applications Delphi hautes performances impliquera donc inévitablement une technologie de gestion de données basée sur les objets.
La gestion des données objets comprend deux aspects :
● Utiliser des objets pour gérer les données
● Gestion de divers objets de données (y compris les objets et composants)
Delphi résume les classes de gestion de données basées sur les objets en objets Stream (Stream) et en objets Filer (Filer), et les applique à tous les aspects de la bibliothèque de classes de composants visuels (VCL). Ils fournissent des fonctions riches pour gérer les objets en mémoire, le stockage externe et les ressources Windows.
L'objet Stream, également connu sous le nom d'objet de streaming, est le nom collectif de TStream, THandleStream, TFileStream, TMemoryStream, TResourceStream et TBlobStream. Ils représentent respectivement la capacité de stocker des données sur divers supports.Ils résument les opérations de gestion de divers types de données (y compris les objets et les composants) dans la mémoire, la mémoire externe et les champs de base de données en méthodes objet, et utilisent pleinement la technologie orientée objet. L'avantage est que les applications peuvent copier assez facilement des données dans divers objets Stream.
Les objets en lecture-écriture (Filer) incluent les objets TFiler, les objets TReader et les objets TWriter. L'objet TFiler est l'objet de base pour la lecture et l'écriture de fichiers. TReader et TWriter sont principalement utilisés dans les applications. Les objets TReader et TWriter héritent directement des objets TFiler. L'objet TFiler définit les propriétés et méthodes de base de l'objet Filer.
L'objet Filer remplit principalement deux fonctions majeures :
● Accéder aux fichiers de formulaire et aux composants dans les fichiers de formulaire
●Fournir une mise en mémoire tampon des données pour accélérer les opérations de lecture et d'écriture des données
Afin d'avoir une compréhension perceptuelle des objets de streaming et des objets en lecture-écriture, regardons d'abord un exemple.
a) Écrire un fichier
PRocédure TFomr1.WriteData (Expéditeur : TObject );
Var
FileStream : TFilestream ;
Mon écrivain : TWriter ;
je: entier
Commencer
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);//Créer un objet flux de fichiers
Mywriter:=TWriter.create(FileStream,1024); //Associer Mywriter à FileStream
Mywriter.writelistbegin; //Écrire l'indicateur de début de liste
Pour i:=0 à Memo1.lines.count-1 faites
Mywriter.writestring(memo1.lines[i]); //Enregistrez les informations textuelles du composant Memo dans le fichier
Mywriter.writelistend; //écrire la marque de fin de liste
FileStream.seek(0,sofrombeginning); //Le pointeur de l'objet flux de fichier se déplace au début du flux
Mywriter.free; // Libérez l'objet Mywriter.
FileStream.free; // Libère l'objet FileStream.
Fin;
b) Lire des fichiers
procédure TForm1.ReadData(Expéditeur : TObject);
Var
FileStream : TFilestream ;
Mon lecteur : TReader ;
Commencer
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); //Associer Myreader à FileStream
Myreader.readlistbegin; //Lire la marque de début de la liste écrite
Memo1.lines.clear; //Effacer le contenu textuel du composant Memo1
Bien que ce ne soit pas myreader.endoflist //Faites attention à une méthode de TReader : endoflist
Commencer
Memo1.lines.add(myreader.readstring); //Ajoute la chaîne lue au composant Memo1
Fin;
Myreader.readlistend; //Lire la marque de fin de liste écrite
Myreader.free; // Libérer l'objet Myreader
FileStream.free; // Libère l'objet FileStream.
Fin;
Les deux processus ci-dessus, l’un est un processus d’écriture et l’autre est un processus de lecture. Le processus d'écriture passe par TWriter et utilise TFilestream pour enregistrer le contenu (informations textuelles) d'un mémo sous forme de fichier binaire enregistré sur le disque. Le processus de lecture est exactement l'opposé du processus d'écriture. Grâce à TReader, TFilestream est utilisé pour convertir le contenu du fichier binaire en informations textuelles et l'afficher dans Memo. Lorsque vous exécutez le programme, vous pouvez constater que le processus de lecture restaure fidèlement les informations enregistrées par le processus d'écriture.
Le diagramme suivant décrit la relation entre les objets de données (y compris les objets et les composants), les objets de streaming et les objets de lecture et d'écriture.
Chiffre (1)
Il convient de noter que les objets en lecture-écriture tels que les objets TFiler, les objets TReader et les objets TWriter sont rarement appelés directement par les rédacteurs d'applications. Ils sont généralement utilisés pour lire et écrire l'état des composants. Ils jouent un rôle très important dans la lecture. -Mécanisme de composant d'écriture.
Pour l'objet de streaming Stream, de nombreux documents de référence ont des introductions très détaillées, tandis que les documents de référence pour les objets TFiler, les objets TReader et les objets TWriter, en particulier les mécanismes de lecture et d'écriture des composants, sont rares. Cet article retracera le code original de la VCL. et mécanisme d'écriture.
2. Objets de lecture et d'écriture (Filer) et mécanismes de lecture et d'écriture des composants
L'objet Filer est principalement utilisé pour accéder aux fichiers de formulaire Delphi et aux composants du fichier de formulaire, donc pour comprendre clairement l'objet Filer, vous devez connaître la structure du fichier de formulaire Delphi (fichier DFM).
Les fichiers DFM sont utilisés pour les formulaires de stockage Delphi. La forme est au cœur de la programmation visuelle Delphi. Le formulaire correspond à la fenêtre de l'application Delphi, les composants visuels du formulaire correspondent aux éléments d'interface de la fenêtre et les composants non visuels tels que TTimer et TOpenDialog correspondent à une certaine fonction de l'application Delphi. La conception des applications Delphi est en réalité centrée sur la conception du formulaire. Par conséquent, les fichiers DFM occupent également une place très importante dans la conception d’applications Delphi. Tous les éléments du formulaire, y compris les propriétés du formulaire lui-même, sont inclus dans le fichier DFM.
Dans la fenêtre de l'application Delphi, les éléments de l'interface sont liés les uns aux autres selon la relation de propriété, de sorte que la structure arborescente est la forme d'expression la plus naturelle ; par conséquent, les composants du formulaire sont également organisés en fonction de la structure arborescente ; le fichier DFM, également pour exprimer cette relation. Les fichiers DFM sont physiquement stockés au format texte (avant la version Delphi 2.0, ils étaient stockés sous forme de fichiers binaires) et logiquement, la relation entre les composants est organisée dans une structure arborescente. La structure arborescente du formulaire ressort clairement de ce texte. Ci-dessous le contenu du fichier DFM :
objet Form1 : TForm1
Gauche = 197
Haut = 124
…
PixelsParPouce = 96
Hauteur du texte = 13
objet Button1 : TButton
Gauche = 272
…
Légende = 'Bouton1'
Ordre de tabulation = 0
fin
objet Panneau1 : TPanel
Gauche = 120
…
Légende = 'Panneau1'
Ordre de tabulation = 1
objet CheckBox1 : TCheckBox
Gauche = 104
…
Légende = 'CheckBox1'
Ordre de tabulation = 0
fin
fin
fin
Ce fichier DFM est généré par TWriter via l'objet de streaming Stream. Bien entendu, il existe également un processus de conversion d'un fichier binaire en fichier d'informations texte. Ce processus de conversion n'est pas l'objet de cet article, un tel processus est donc ignoré.
Lorsque le programme démarre, TReader lit les formulaires et les composants via l'objet de streaming Stream, car lorsque Delphi compile le programme, il a compilé les informations du fichier DFM dans le fichier exécutable à l'aide de l'instruction de compilation {$R *.dfm} , et alors TReader lit des informations sur les formulaires et les composants qui sont compilées dans le fichier exécutable.
TReader et TWriter peuvent non seulement lire et écrire la plupart des types de données standard dans Object Pascal, mais également lire et écrire des types avancés tels que List et Variant, et même lire et écrire des propriétés et des composants. Cependant, TReader et TWriter eux-mêmes fournissent en réalité des fonctions très limitées, et la majeure partie du travail réel est effectuée par la très puissante classe TStream. En d'autres termes, TReader et TWriter ne sont en réalité que des outils. Ils sont uniquement responsables des composants de lecture et d'écriture. Les opérations spécifiques de lecture et d'écriture sont effectuées par TStream.
Puisque TFiler est la classe ancêtre commune de TReader et TWriter, pour comprendre TReader et TWriter, vous devez d'abord commencer par TFiler.