TMemoryStreamの継承関係は以下のとおりです。
Tオブジェクト
|
Tストリーム
|
TCustomMemoryStream
|
Tメモリストリーム
TMemoryStreamの使い方は?
実際、TmemoryStream は TStream と同じように使用されます。
特定の属性とメソッドについては、ヘルプを参照してください。
以下に例を示します。
ビットマップをメモリ内で直接読み書きしたい場合はどうすればよいですか?
TmemoryStream はとても役に立ちます
変数
ビットマップメモリストリーム:TMemoryStream;
ビットマップ1:TBitmap;
手順 TForm.Button1Click(Sender:TObject);
始める
BitmapmemroyStream:=TmemoryStream.Create file://MemoryStream を作成します。
Bitmap1:=TBitmap.Create;
試す
Bitmap1.LoadFromFile('d:Bitmap1.bmp');
を除外する
ShowMessage('LoadFile bitmap1.bmp のエラー');
終わり;
終わり;
プロシージャ TForm.Button2Click(Sneder:Tobject);
始める
割り当て済み(ビットマップ1)の場合
Bitmap1.SaveToStream(BitmapmemoryStream);
終わり;
プロシージャ TForm.Button3Click(Sender:TObject);
始める
BitmapMemoryStream<>nil の場合
始める
試す
BitmapMemroyStream.SaveToFile('Bitmap1.str'); file://メモリ ストリームの保存、サイズ、
file://Bitmap1.bmp 同じ
を除外する
showmessage('アクセスメモリでエラー!');
終わり;
終わり;
終わり;
プロシージャ TForm.Button4Click(Sender:TObject);
変数
バッファ:文字の配列[0..53]。
始める
割り当て済み(BitmapMemroyStream)の場合
試す
BitmapMemroyStream.Seek(0,soFromBeginning);
BitmapMemoryStream.Read(Buffer,54);
Buffer[0]='B' および Buffer[1]='M' の場合、file://rewrite メモリ内容
始める
BitmapMemoryStream.Seek(0,soFromBeginning);
BitmapmemoryStream.Write('ICE',3);
Button3Click(Sender);//書き換えた内容をファイルに書き込みます
終わり;
を除外する
ShowMessage('アクセス時のエラー memroyStream');
終わり;
終わり;
TMemoryStream を使用してメモリの読み取りと書き込みを行うことがいかに便利であるかがわかります。もちろん、最初にビットマップを構築する必要はありません。
LoadFromFile を使用してファイルを直接ブートすることもできますが、他のメモリ ストリームの場合は上記の方法を使用できます。
上記は単なる紹介です。他の機能については、ヘルプを読んで自分で理解してください。
他にも多くのストリーミング オブジェクトがありますが、それらはすべてほぼ同じなので、すべて使用できます。
ストリームの内容をクリップボードに書き込んで処理する方法
この手法は、Delphi のクリップボード クラスの実装を参照して実現されます。ストリームの内容をクリップボードに入れます。
まず、RegisterClipboardFormat() 関数を使用して独自の形式を登録します。
次に、次の 3 つの手順を実行します。
1. コンテンツ ストリームを作成し、そこにコンテンツを書き込みます
2. グローバルコンテンツ領域を作成し、ストリームのコンテンツを書き込みます
3. ClipBoard.SetAsHandle() を呼び出してコンテンツをクリップボードに書き込みます
コンテンツをクリップボードに書き込む
変数
hbuf :THandle;
bufptr : ポインタ。
mstream: TMemoryStream;
始める
mstream := TMemoryStream.Create;
試す
{-- ストリームを処理するコード --}
hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
試す
bufptr := GlobalLock(hbuf);
試す
Move(mstream.Memory^, bufptr^, mstream.size);
Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);
ついに
GlobalUnlock(hbuf);
終わり;
を除外する
GlobalFree(hbuf);
上げる;
終わり;
ついに
mstream.無料。
終わり;
終わり;
データ読み込み時には、割り当てられたグローバルバッファを解放しないように注意してください。
それをコピーして後で処理する必要があります。
クリップボードの内容を読み取る
変数
hbuf :THandle;
bufptr : ポインタ。
mstream: TMemoryStream;
始める
hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);
hbuf <> 0 の場合は開始します
bufptr := GlobalLock(hbuf);
bufptr <> nil の場合、開始します
試す
mstream := TMemoryStream.Create;
試す
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
mstream.位置 := 0;
{-- ストリームを処理するコード --}
ついに
mstream.無料。
終わり;
ついに
GlobalUnlock(hbuf);
終わり;
終わり;
終わり;
終わり;
TStream を使用して Dephi でデータを読み書きするためのヒント
抽象データ型 TStream は、ストリーミング データの操作をサポートするために Dephi で提供されています。これらのデータは通常、ファイル、データベース、メモリ オブジェクト、OLE オブジェクトなどから取得されます。TStream は、データを読み書きするための統一された簡潔なメソッドを提供します。通常の状況では、TStream クラスを直接使用する必要はなく、ストリーミング データの読み取りと書き込みは VCL コントロールのメソッドにカプセル化されます。ただし、これらの方法で要件を満たせない場合は、データの読み取りと書き込みを自分で手動で制御する必要があります。
1. TStream の一般的に使用されるメソッドとプロパティ:
---- 1. 関数 Read(var Buffer; Count: Longint): virtual;
---- 2. 関数 Write(const バッファ; カウント:倍長整数): 仮想;
---- 3. 関数 Seek(オフセット:倍長整数;原点:Word):仮想;
---- 4. プロパティの位置: 倍長整数。
---- 5. プロパティのサイズ: 倍長整数
---- Read、Write、Seek はすべて純粋な仮想関数であり、データの読み取り、書き込み、配置のための抽象メソッドを提供します。 Read メソッドはデータを Stream から Buffer に読み取り、Write メソッドはその逆の操作を実装します。戻り値は、読み取られたデータと書き込まれたデータの実際のサイズを示します。 Seek は、ストリーム内のデータ ポインターを移動するメソッドを提供します。パラメータ Origin は、soFromBeginning、soFromCurrent、soFromEnd の 3 つの値を取ることができ、Offset はオフセットであり、戻り値は現在の Stream データ ポインタの位置です。
---- Position は、ストリーム内のデータ ポインターの位置を表します。このプロパティは読み書き可能であり、実際には Seek メソッドを呼び出すことで実装されるため、実際に使用する場合はこのプロパティを使用する方が便利です。 Size 属性は、現在のストリームのサイズを示します。場合によっては読み取り専用になります。
2. ストリームデータの読み書き。
---- 1. SaveToStream(Stream: TStream); file://クラス内のデータをストリームの現在位置に書き込みます。
---- 2. LoadFromStream(Stream: TStream); file://Stream のデータを現在位置から読み取ります。
---- 実際に使う場合は、基本的に上記の2つの機能を使うだけです。
3. 例
----TStream の継承ツリー図を図 1 に示します (省略) 実際の使用では、TFileStream、TMemoryStream、TblobStream を例に挙げて具体的な使用方法を説明します。
---- フォーム Form1 を作成し、3 つのボタン btnRead、btnInvert、btnSave とファイルを開くダイアログ ボックス OpenDialog1、およびデータ コントロール DataSource1、Table1、test を配置します。
---- Dephi が提供する Database Desktop を使用してテーブル test を作成します。テーブルには Image フィールドがあり、データベース ファイル名は test.db として保存されます。 TDatabase コントロール dbTest、TTable コントロール Table1、DataSource コントロール DataSource1、TDBNavigator コントロール DBNavigator1 をフォーム上に配置します。 Desktop によって作成されたばかりのデータベースに dbTest を接続し、Table1 の TableName プロパティを test.db に設定し、DataSource1 の DataSet プロパティを Table1 に設定し、DBNavigator1 の DataSource プロパティを DataSource1 に設定し、最初の 4 つの VisibleButtons プロパティを TRUE に設定します。さらに、データベースが最初から開かれるように、dbtest の Connected を TRUE に設定し、Table1 の Active プロパティを TRUE に設定します。
----イベントコードは次のように記述されます。
---- 1. btnRead の Click イベント。ここでは TFileStream の使用方法を示します。
変数
MS: TFileStream;
始める
OpenDialog1.Execute の場合
始める
MS:=TFileStream.Create
(OpenDialog1.FileName、fmOpenRead);
Image1.Picture.Bitmap.LoadFromStream(MS);
MS.無料。
終わり;
終わり;
---- 2. btnInvert の Click イベント。ここでは TMemoryStream の使用方法を示します。 Invert 関数が使用されます。これは、画像の色を反転する単純な関数です (トゥルー カラー イメージにのみ有効)。処理された画像データ ブロックへのポインターを返します。
変数
M
S: Tメモリストリーム;
pImage: ポインタ;
始める
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.位置:=0;
pImage:=Invert(MS.Memory, MS.size);
file://Memory 属性は、実際のメモリ ブロックへのポインタです。
MS.Write(pImage^,MS.size);
MS.位置:=0;
file:// の前のコード行はポインタをストリームの末尾に移動するため、リセットする必要があります。
Image1.Picture.Bitmap.LoadFromStream(MS);
FreeMem(pImage);
MS.無料。
終わり;
反転機能は次のとおりです。
関数 TForm1.Invert
(pImage: ポインタ; サイズ: 整数): ポインタ;
変数
pData、pMem: PChar;
i: 整数。
始める
pMem:=AllocMem(サイズ);
CopyMemory(pMem,pImage,size);
pData:=pMem+54;
for i:=0 から size-54-1 まで
始める
pData^:=Char(整数(pData^)ではありません);
pData:=pData+1;
終わり;
結果:=pMem;
終わり;
---- 1. btnSave のクリック イベント。ここでは、TMemoryStream の別の使用法を示し、ストリーム内のデータをデータベースに書き込みます。
変数
MS: TMemoryStream;
始める
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.位置:=0;
表1.追加;
file://データベースにレコードを追加します
TBlobField(Table1.FieldbyName
('画像')).LoadFromStream(MS);
表1.ポスト;
file:// データベースに更新を書き込みます
終わり;
---- 4. DBNavigator1 の Click イベント。ここでは、データベースの画像データの書き込みとは異なる方法で TBlobStream を使用する方法を示します。
変数
MS: Tストリーム。
始める
Table1 で行う
MS:=BlobStream の作成
(FieldbyName('image'),bmRead);
画像 1.ピクチャ.ビットマップ。
LoadFromStream(MS);
MS.無料。
終わり;
以上です。この記事をお読みいただきありがとうございます。使えるポイントが足りないので、ポイントを貯めて交換する必要があります。この記事が役に立ったと思われる場合は、投票してください。ありがとうございます。