Delphis Lese- und Schreibmechanismus für Komponenten (1)
1. Einführung in Streaming-Objekte (Stream) und Lese-/Schreibobjekte (Filer)
Bei der objektorientierten Programmierung spielt die objektbasierte Datenverwaltung eine wichtige Rolle. In Delphi ist die Unterstützung der objektbasierten Datenverwaltung ein wichtiges Feature.
Delphi ist eine integrierte Entwicklungsumgebung, die objektorientiertes visuelles Design mit objektorientierter Sprache kombiniert. Der Kern von Delphi sind Komponenten. Eine Komponente ist ein Objekttyp. Da Delphi-Anwendungen vollständig aus Komponenten aufgebaut sind, erfordert die Entwicklung leistungsstarker Delphi-Anwendungen zwangsläufig objektbasierte Datenverwaltungstechnologie.
Das Objektdatenmanagement umfasst zwei Aspekte:
● Verwenden Sie Objekte zum Verwalten von Daten
● Verwaltung verschiedener Datenobjekte (einschließlich Objekte und Komponenten)
Delphi fasst objektbasierte Datenverwaltungsklassen in Stream-Objekte (Stream) und Filer-Objekte (Filer) zusammen und wendet sie auf alle Aspekte der Visual Component Class Library (VCL) an. Sie bieten umfangreiche Funktionen zum Verwalten von Objekten im Speicher, im externen Speicher und in Windows-Ressourcen.
Stream-Objekt, auch Streaming-Objekt genannt, ist der Sammelname für TStream, THandleStream, TFileStream, TMemoryStream, TResourceStream und TBlobStream. Sie stellen jeweils die Fähigkeit dar, Daten auf verschiedenen Medien zu speichern. Sie abstrahieren die Verwaltungsvorgänge verschiedener Datentypen (einschließlich Objekten und Komponenten) in Objektmethoden und nutzen die objektorientierte Technologie Der Vorteil besteht darin, dass Anwendungen relativ einfach Daten in verschiedene Stream-Objekte kopieren können.
Zu den Lese-/Schreibobjekten (Filer) gehören TFiler-Objekte, TReader-Objekte und TWriter-Objekte. Das TFiler-Objekt ist das Basisobjekt zum Lesen und Schreiben von Dateien. TReader und TWriter werden hauptsächlich in Anwendungen verwendet. Sowohl TReader- als auch TWriter-Objekte erben direkt von TFiler-Objekten. Das TFiler-Objekt definiert die grundlegenden Eigenschaften und Methoden des Filer-Objekts.
Das Filer-Objekt erfüllt hauptsächlich zwei Hauptfunktionen:
● Zugriff auf Formulardateien und Komponenten in Formulardateien
●Stellen Sie Datenpufferung bereit, um das Lesen und Schreiben von Daten zu beschleunigen
Um ein wahrnehmungsmäßiges Verständnis von Streaming-Objekten und Lese-/Schreibobjekten zu erlangen, schauen wir uns zunächst ein Beispiel an.
a)Schreiben Sie eine Datei
PROzedur TFomr1.WriteData (Sender: TObject);
Var
FileStream:TFilestream;
MeinWriter:TWriter;
i: ganze Zahl
Beginnen
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);//Erstellt ein Dateistream-Objekt
Mywriter:=TWriter.create(FileStream,1024); //Mywriter mit FileStream verknüpfen
Mywriter.writelistbegin; //Startflag für das Schreiben der Liste
Für i:=0 bis Memo1.lines.count-1 tun
Mywriter.writestring(memo1.lines[i]); //Speichern Sie die Textinformationen in der Memo-Komponente in der Datei
Mywriter.writelistend; // Endmarkierung der Schreibliste
FileStream.seek(0,sofrombeginning); //Der Dateistream-Objektzeiger bewegt sich zum Anfang des Streams
Mywriter.free; //Das Mywriter-Objekt freigeben
FileStream.free; //Das FileStream-Objekt freigeben
Ende;
b) Dateien lesen
procedure TForm1.ReadData(Sender: TObject);
Var
FileStream:TFilestream;
Myreader:TReader;
Beginnen
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); //Myreader mit FileStream verknüpfen
Myreader.readlistbegin; //Die Startmarkierung der geschriebenen Liste vorlesen
Memo1.lines.clear; //Löschen Sie den Textinhalt der Memo1-Komponente
Während nicht myreader.endoflist tun //Achten Sie auf eine Methode von TReader: endoflist
Beginnen
Memo1.lines.add(myreader.readstring); //Füge die gelesene Zeichenfolge zur Memo1-Komponente hinzu
Ende;
Myreader.readlistend; //Lies die Endmarkierung der geschriebenen Liste aus
Myreader.free; //Das Myreader-Objekt freigeben
FileStream.free; //Das FileStream-Objekt freigeben
Ende;
Bei den beiden oben genannten Prozessen handelt es sich zum einen um einen Schreibprozess und zum anderen um einen Leseprozess. Der Schreibvorgang durchläuft TWriter und verwendet TFilestream, um den Inhalt (Textinformationen) in einem Memo als Binärdatei auf der Festplatte zu speichern. Der Lesevorgang ist genau das Gegenteil des Schreibvorgangs. Über TReader wird TFilestream verwendet, um den Inhalt der Binärdatei in Textinformationen umzuwandeln und in Memo anzuzeigen. Wenn Sie das Programm ausführen, können Sie feststellen, dass der Lesevorgang die durch den Schreibvorgang gespeicherten Informationen originalgetreu wiederherstellt.
Das folgende Diagramm beschreibt die Beziehung zwischen Datenobjekten (einschließlich Objekten und Komponenten), Streaming-Objekten und Lese- und Schreibobjekten.
Abbildung (1)
Es ist erwähnenswert, dass Lese-/Schreibobjekte wie TFiler-Objekte, TReader-Objekte und TWriter-Objekte selten direkt von Anwendungsautoren aufgerufen werden. Sie werden normalerweise zum Lesen und Schreiben des Status von Komponenten verwendet. Sie spielen beim Lesen eine sehr wichtige Rolle -Write-Komponentenmechanismus.
Für das Streaming-Objekt Stream gibt es sehr detaillierte Einführungen, während Referenzmaterialien für TFiler-Objekte, TReader-Objekte und TWriter-Objekte, insbesondere Komponenten-Lese- und Schreibmechanismen, selten sind. In diesem Artikel wird der VCL-Originalcode analysiert und Schreibmechanismus.
2. Lesen und Schreiben von Objekten (Filer) und Lese- und Schreibmechanismen für Komponenten
Das Filer-Objekt wird hauptsächlich für den Zugriff auf Delphi-Formulardateien und Komponenten in der Formulardatei verwendet. Um das Filer-Objekt klar zu verstehen, müssen Sie die Struktur der Delphi-Formulardatei (DFM-Datei) kennen.
DFM-Dateien werden für Delphi-Speicherformulare verwendet. Form ist der Kern der visuellen Programmierung von Delphi. Das Formular entspricht dem Fenster in der Delphi-Anwendung, die visuellen Komponenten im Formular entsprechen den Schnittstellenelementen im Fenster und die nicht-visuellen Komponenten wie TTimer und TOpenDialog entsprechen einer bestimmten Funktion der Delphi-Anwendung. Das Design von Delphi-Anwendungen konzentriert sich eigentlich auf die Gestaltung des Formulars. Daher nehmen DFM-Dateien auch im Delphi-Anwendungsdesign eine sehr wichtige Stellung ein. Alle Elemente im Formular, einschließlich der Eigenschaften des Formulars selbst, sind in der DFM-Datei enthalten.
Im Delphi-Anwendungsfenster sind die Schnittstellenelemente entsprechend der Eigentümerbeziehung miteinander verbunden, daher ist die Baumstruktur die natürlichste Ausdrucksform. Dementsprechend sind auch die Komponenten im Formular entsprechend der Baumstruktur organisiert die DFM-Datei, auch Um diese Beziehung auszudrücken. DFM-Dateien werden physisch im Textformat gespeichert (vor Delphi 2.0 wurden sie als Binärdateien gespeichert), und logischerweise ist die Beziehung zwischen den Komponenten in einer Baumstruktur angeordnet. Die Baumstruktur des Formulars ist aus diesem Text deutlich ersichtlich. Nachfolgend finden Sie den Inhalt der DFM-Datei:
Objekt Form1: TForm1
Links = 197
Oben = 124
…
Pixel pro Zoll = 96
Texthöhe = 13
Objekt Button1: TButton
Links = 272
…
Beschriftung = 'Button1'
TabOrder = 0
Ende
Objekt Panel1: TPanel
Links = 120
…
Bildunterschrift = 'Panel1'
TabOrder = 1
Objekt CheckBox1: TCheckBox
Links = 104
…
Bildunterschrift = 'CheckBox1'
TabOrder = 0
Ende
Ende
Ende
Diese DFM-Datei wird von TWriter über das Streaming-Objekt Stream generiert. Natürlich gibt es auch einen Konvertierungsprozess von einer Binärdatei in eine Textinformationsdatei. Dieser Konvertierungsprozess ist nicht Gegenstand dieses Artikels, daher wird ein solcher Prozess ignoriert.
Wenn das Programm ausgeführt wird, liest TReader die Formulare und Komponenten über das Streaming-Objekt Stream, denn wenn Delphi das Programm kompiliert, hat es die DFM-Dateiinformationen mithilfe der Kompilierungsanweisung {$R *.dfm} in die ausführbare Datei kompiliert, na und TReader liest tatsächlich Informationen über Formulare und Komponenten, die in die ausführbare Datei kompiliert werden.
TReader und TWriter können nicht nur die meisten Standarddatentypen in Object Pascal lesen und schreiben, sondern auch erweiterte Typen wie List und Variant lesen und schreiben und sogar Eigenschaften und Komponenten lesen und schreiben. Allerdings bieten TReader und TWriter selbst tatsächlich nur sehr begrenzte Funktionen und der Großteil der eigentlichen Arbeit wird von der sehr leistungsfähigen Klasse TStream erledigt. Mit anderen Worten, TReader und TWriter sind eigentlich nur Werkzeuge. Sie sind nur für das Lesen und Schreiben von Komponenten verantwortlich. Die spezifischen Lese- und Schreibvorgänge werden von TStream ausgeführt.
Da TFiler die gemeinsame Vorgängerklasse von TReader und TWriter ist, sollten Sie zum Verständnis von TReader und TWriter zunächst mit TFiler beginnen.