Delphi のコンポーネント読み取りおよび書き込みメカニズム (1)
1. ストリーミング オブジェクト (Stream) と読み取り/書き込みオブジェクト (Filer) の概要
オブジェクト指向プログラミングでは、オブジェクトベースのデータ管理が重要な役割を果たします。 Delphi では、オブジェクトベースのデータ管理のサポートが主要な機能です。
Delphi は、オブジェクト指向のビジュアル デザインとオブジェクト指向言語を組み合わせた統合開発環境です。 Delphi の中核はコンポーネントです。コンポーネントはオブジェクトの一種です。 Delphi アプリケーションは完全にコンポーネントで構築されているため、高パフォーマンスの Delphi アプリケーションの開発には必然的にオブジェクト ベースのデータ管理テクノロジが必要になります。
オブジェクト データ管理には、次の 2 つの側面が含まれます。
● オブジェクトを使用してデータを管理する
● さまざまなデータオブジェクト(オブジェクトやコンポーネントを含む)の管理
Delphi は、オブジェクトベースのデータ管理クラスを Stream オブジェクト (Stream) と Filer オブジェクト (Filer) に要約し、それらを Visual Component Class Library (VCL) のすべての側面に適用します。これらは、メモリ、外部ストレージ、Windows リソース内のオブジェクトを管理するための豊富な機能を提供します。
ストリーミング オブジェクトとも呼ばれるストリーム オブジェクトは、TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream、TBlobStream の総称です。これらはそれぞれ、メモリ、外部メモリ、データベース フィールド内のさまざまなデータ型 (オブジェクトやコンポーネントを含む) の管理操作をオブジェクト メソッドに抽象化し、オブジェクト指向テクノロジを最大限に活用して、さまざまなメディアにデータを保存する機能を表します。利点は、アプリケーションがさまざまな Stream オブジェクトのデータをかなり簡単にコピーできることです。
読み取り/書き込みオブジェクト (Filer) には、TFiler オブジェクト、TReader オブジェクト、および TWriter オブジェクトが含まれます。 TFiler オブジェクトは、ファイルの読み取りと書き込みのための基本オブジェクトであり、TReader と TWriter は主にアプリケーションで使用されます。 TReader オブジェクトと TWriter オブジェクトはどちらも TFiler オブジェクトから直接継承します。 TFiler オブジェクトは、Filer オブジェクトの基本的なプロパティとメソッドを定義します。
Filer オブジェクトは主に 2 つの主要な機能を実行します。
● フォーム ファイルおよびフォーム ファイル内のコンポーネントにアクセスする
●データバッファリングを提供し、データの読み取りおよび書き込み操作を高速化します。
ストリーミング オブジェクトと読み書きオブジェクトを知覚的に理解するために、まず例を見てみましょう。
a)ファイルを書き込む
プロシージャ TFomr1.WriteData (送信者: TObject);
ヴァール
ファイルストリーム:TFilestream;
私のライター:TWriter;
i: 整数
始める
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);//ファイル ストリーム オブジェクトを作成する
Mywriter:=TWriter.create(FileStream,1024); //Mywriter を FileStream に関連付ける
Mywriter.writelistbegin; // リストの書き込み開始フラグ
i:=0 から Memo1.lines.count-1 の場合は次のようにします
Mywriter.writestring(memo1.lines[i]); //メモコンポーネントのテキスト情報をファイルに保存します
Mywriter.writelistend; //リストの終了マークを書き込みます
FileStream.seek(0,sofrombeginning); // ファイル ストリーム オブジェクト ポインタがストリームの先頭に移動します
Mywriter.free //Mywriter オブジェクトを解放します。
FileStream.free //FileStream オブジェクトを解放します。
終わり;
b) ファイルの読み取り
プロシージャ TForm1.ReadData(送信者: TObject);
ヴァール
ファイルストリーム:TFilestream;
マイリーダー:TReader;
始める
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); //Myreader を FileStream に関連付ける
Myreader.readlistbegin; // 書き込まれたリストの開始マークを読み出す
Memo1.lines.clear; //Memo1 コンポーネントのテキスト内容をクリアします。
myreader.endoflist ではありませんが、 //TReader のメソッドに注意してください: endoflist
始める
Memo1.lines.add(myreader.readstring); // 読み取った文字列を Memo1 コンポーネントに追加します
終わり;
Myreader.readlistend; // 書き込まれたリストの終了マークを読み出す
Myreader.free //Myreader オブジェクトを解放します。
FileStream.free //FileStream オブジェクトを解放します。
終わり;
上記 2 つの処理は、1 つは書き込み処理、もう 1 つは読み取り処理です。書き込み処理はTWriterを経由し、TFilestreamを利用してメモの内容(テキスト情報)をバイナリファイルとしてディスク上に保存します。読み取りプロセスは書き込みプロセスの逆で、TReader を介して TFilestream を使用してバイナリ ファイルの内容をテキスト情報に変換し、メモに表示します。プログラムを実行すると、書き込みプロセスによって保存された情報が読み取りプロセスによって忠実に復元されることがわかります。
次の図は、データ オブジェクト (オブジェクトとコンポーネントを含む)、ストリーミング オブジェクト、読み取りおよび書き込みオブジェクトの関係を示しています。
図(1)
TFiler オブジェクト、TReader オブジェクト、TWriter オブジェクトなどの読み取り/書き込みオブジェクトがアプリケーション作成者によって直接呼び出されることはほとんどなく、通常はコンポーネントの状態の読み取りと書き込みに使用され、読み取りにおいて非常に重要な役割を果たします。 -書き込みコンポーネントのメカニズムが重要な役割を果たします。
ストリーミング オブジェクト Stream については、多くの参考資料に非常に詳細な説明が記載されていますが、TFiler オブジェクト、TReader オブジェクト、および TWriter オブジェクト、特にコンポーネントの読み取りおよび書き込みメカニズムに関する参考資料はほとんどありません。この記事では、VCL の元のコードの読み取りを分析します。そして書き込みの仕組み。
2. オブジェクトの読み取りおよび書き込み (Filer) およびコンポーネントの読み取りおよび書き込みメカニズム
Filer オブジェクトは主に、Delphi フォーム ファイルおよびフォーム ファイル内のコンポーネントにアクセスするために使用されるため、Filer オブジェクトを明確に理解するには、Delphi フォーム ファイル (DFM ファイル) の構造を理解する必要があります。
DFM ファイルは、Delphi ストレージ フォームに使用されます。フォームは、Delphi ビジュアル プログラミングの中核です。フォームは Delphi アプリケーションのウィンドウに対応し、フォームのビジュアル コンポーネントはウィンドウのインターフェイス要素に対応し、TTimer や TOpenDialog などの非ビジュアル コンポーネントは Delphi アプリケーションの特定の機能に対応します。 Delphi アプリケーションの設計は、実際にはフォームの設計が中心になります。したがって、DFM ファイルも Delphi アプリケーションの設計において非常に重要な位置を占めます。フォーム自体のプロパティを含む、フォーム内のすべての要素が DFM ファイルに含まれます。
Delphi アプリケーション ウィンドウでは、インターフェイス要素は所有権関係に従って相互に関連付けられているため、ツリー構造が最も自然な表現形式となり、フォーム内のコンポーネントもそれに応じてツリー構造に従って編成されます。 DFM ファイルでも、この関係を表現します。 DFM ファイルは物理的にテキスト形式で保存され (Delphi2.0 バージョン以前はバイナリ ファイルとして保存されていました)、論理的にはコンポーネント間の関係がツリー構造で配置されます。このテキストから、フォームのツリー構造がはっきりとわかります。 DFM ファイルの内容は次のとおりです。
オブジェクト Form1: TForm1
左 = 197
トップ = 124
…
インチあたりのピクセル数 = 96
テキストの高さ = 13
オブジェクト Button1: TButton
左 = 272
…
キャプション = 'ボタン 1'
タブオーダー = 0
終わり
オブジェクトPanel1: TPanel
左 = 120
…
キャプション = 'パネル 1'
タブオーダー = 1
オブジェクト CheckBox1: TCheckBox
左 = 104
…
キャプション = 'チェックボックス 1'
タブオーダー = 0
終わり
終わり
終わり
この DFM ファイルは、ストリーミング オブジェクト Stream を通じて TWriter によって生成されます。もちろん、バイナリ ファイルからテキスト情報ファイルへの変換プロセスも存在します。この変換プロセスは、この記事の対象ではないため、そのようなプロセスは無視されます。
プログラムの実行が開始されると、TReader はストリーミング オブジェクト Stream を通じてフォームとコンポーネントを読み取ります。これは、Delphi がプログラムをコンパイルするときに、コンパイル命令 {$R *.dfm} を使用して DFM ファイル情報を実行可能ファイルにコンパイルしているためです。 TReader が実際に読み取るのは、実行可能ファイルにコンパイルされたフォームとコンポーネントに関する情報です。
TReader と TWriter は、Object Pascal の標準データ型のほとんどを読み書きできるだけでなく、List や Variant などの高度な型の読み書き、さらにはプロパティやコンポーネントの読み書きもできます。ただし、TReader と TWriter 自体が実際に提供する機能は非常に限られており、実際の作業のほとんどは非常に強力なクラス TStream によって実行されます。言い換えれば、TReader と TWriter は実際には単なるツールであり、コンポーネントの読み取りと書き込みを行うだけです。TStream によって実行されます。
TFiler は TReader と TWriter の共通の祖先クラスであるため、TReader と TWriter を理解するには、まず TFiler から始める必要があります。