Die Vererbungsbeziehung von TMemoryStream ist wie folgt
TObject
|
TStream
|
TCustomMemoryStream
|
TMemoryStream
Wie verwende ich TMemoryStream?
Tatsächlich wird TmemoryStream genauso verwendet wie TStream.
Informationen zu bestimmten Attributen und Methoden finden Sie in der Hilfe.
Hier ist ein Beispiel:
Was soll ich tun, wenn ich eine Bitmap direkt im Speicher lesen und schreiben möchte?
TmemoryStream hilft Ihnen sehr
var
BitmapMemoryStream:TMemoryStream;
Bitmap1:TBitmap;
PROzedur TForm.Button1Click(Sender:TObject);
beginnen
BitmapmemroyStream:=TmemoryStream.Create; file://Create MemoryStream
Bitmap1:=TBitmap.Create;
versuchen
Bitmap1.LoadFromFile('d:Bitmap1.bmp');
außer
ShowMessage('Fehler beim Laden der Datei bitmap1.bmp');
Ende;
Ende;
procedure TForm.Button2Click(Sneder:Tobject);
beginnen
wenn Zugewiesen(Bitmap1), dann
Bitmap1.SaveToStream(BitmapmemoryStream);
Ende;
procedure TForm.Button3Click(Sender:TObject);
beginnen
wenn BitmapMemoryStream<>nil dann
beginnen
versuchen
BitmapMemroyStream.SaveToFile('Bitmap1.str'); file://Speicherstrom speichern, Größe und
file://Bitmap1.bmp gleich
außer
showmessage('Fehler beim Zugriff auf den Speicher!');
Ende;
Ende;
Ende;
procedure TForm.Button4Click(Sender:TObject);
var
Puffer:Array[0..53] of char;
beginnen
wenn Assigned(BitmapMemroyStream) dann
versuchen
BitmapMemroyStream.Seek(0,soFromBeginning);
BitmapMemoryStream.Read(Buffer,54);
wenn Buffer[0]='B' und Buffer[1]='M' dann file://Speicherinhalt neu schreiben
beginnen
BitmapMemoryStream.Seek(0,soFromBeginning);
BitmapmemoryStream.Write('ICE',3);
Button3Click(Sender);//Den neu geschriebenen Inhalt in die Datei schreiben
Ende;
außer
ShowMessage('error On Access memroyStream');
Ende;
Ende;
Sie können sehen, wie praktisch es ist, TMemoryStream zum Lesen und Schreiben von Speicher zu verwenden. Natürlich ist es nicht erforderlich, zuerst eine Bitmap zu erstellen.
Sie können LoadFromFile verwenden, um die Datei direkt zu starten. Für andere Speicherströme können Sie jedoch die oben beschriebene Methode verwenden.
Das Obige ist nur eine Einführung. Für andere Funktionen können Sie die Hilfe lesen und sie selbst herausfinden!
Es gibt viele andere Streaming-Objekte, die alle ziemlich gleich sind, sodass Sie sie alle verwenden können!
So schreiben Sie den Inhalt eines Streams in die Zwischenablage und verarbeiten ihn
Diese Technik wird unter Bezugnahme auf die Implementierung der Clipboard-Klasse von Delphi durchgeführt. Den Inhalt eines Streams in die Zwischenablage legen,
Registrieren Sie zunächst Ihr eigenes Format mit der Funktion RegisterClipboardFormat()
Führen Sie dann die folgenden drei Schritte aus:
1. Erstellen Sie einen Content-Stream und schreiben Sie den Inhalt hinein
2. Erstellen Sie einen globalen Inhaltsbereich und schreiben Sie den Inhalt des Streams
3. Rufen Sie ClipBoard.SetAsHandle() auf, um den Inhalt in die Zwischenablage zu schreiben
Inhalte in die Zwischenablage schreiben
var
hbuf :THandle;
bufptr: Zeiger;
mstream: TMemoryStream;
beginnen
mstream := TMemoryStream.Create;
versuchen
{-- Code zur Verarbeitung von Streams --}
hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
versuchen
bufptr := GlobalLock(hbuf);
versuchen
Move(mstream.Memory^, bufptr^, mstream.size);
Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);
Endlich
GlobalUnlock(hbuf);
Ende;
außer
GlobalFree(hbuf);
erheben;
Ende;
Endlich
mstream.Free;
Ende;
Ende;
Bitte achten Sie darauf, den zugewiesenen globalen Puffer nicht freizugeben. Diese Arbeit wird beim Lesen der Daten erledigt
Sie sollten es kopieren und später weiterverarbeiten.
Lesen Sie den Inhalt der Zwischenablage
var
hbuf :THandle;
bufptr: Zeiger;
mstream: TMemoryStream;
beginnen
hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);
Wenn hbuf <> 0, dann beginnen
bufptr := GlobalLock(hbuf);
Wenn bufptr <> nil, dann beginnen
versuchen
mstream := TMemoryStream.Create;
versuchen
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
mstream.Position := 0;
{-- Code zur Verarbeitung von Streams --}
Endlich
mstream.Free;
Ende;
Endlich
GlobalUnlock(hbuf);
Ende;
Ende;
Ende;
Ende;
Tipps zur Verwendung von TStream zum Lesen und Schreiben von Daten in Dephi
In Dephi wird ein abstrakter Datentyp TStream bereitgestellt, um Vorgänge für Streaming-Daten zu unterstützen. Diese Daten stammen normalerweise aus Dateien, Datenbanken, Speicherobjekten, OLE-Objekten usw. TStream bietet eine einheitliche und übersichtliche Methode zum Lesen und Schreiben von Daten. Unter normalen Umständen müssen wir die TStream-Klasse nicht direkt verwenden, und das Lesen und Schreiben von Streaming-Daten ist in den Methoden der VCL-Steuerung gekapselt. Wenn diese Methoden unsere Anforderungen jedoch nicht erfüllen können, müssen wir das Lesen und Schreiben von Daten selbst manuell steuern.
1. Häufig verwendete Methoden und Eigenschaften von TStream:
---- 1. Funktion Read(var Buffer; Count: Longint): Longint; abstract
---- 2. function Write(const Buffer; Count: Longint): Longint virtual;
---- 3. Funktion Seek(Offset: Longint; Origin: Word): Longint virtual;
---- 4. Eigentumsposition: Longint;
---- 5. Grundstücksgröße: Longint
---- Lesen, Schreiben und Suchen sind alles rein virtuelle Funktionen und bieten abstrakte Methoden zum Lesen, Schreiben und Positionieren von Daten. Die Read-Methode liest die Daten aus dem Stream in den Puffer und die Write-Methode implementiert den umgekehrten Vorgang. Der Rückgabewert gibt die tatsächliche Größe der gelesenen und geschriebenen Daten an. Seek bietet eine Methode zum Verschieben des Datenzeigers im Stream. Der Parameter Origin kann drei Werte annehmen: soFromBeginning, soFromCurrent und soFromEnd. Offset ist der Offset und der Rückgabewert ist die Position des aktuellen Stream-Datenzeigers.
---- Position repräsentiert die Position des Datenzeigers im Stream. Diese Eigenschaft ist lesbar und beschreibbar. Sie wird tatsächlich durch Aufrufen der Seek-Methode implementiert, sodass es bequemer ist, diese Eigenschaft bei der tatsächlichen Verwendung zu verwenden. Das Size-Attribut gibt die Größe des aktuellen Streams an. Für verschiedene Streams ist es manchmal schreibgeschützt.
2. Lesen und Schreiben von Stream-Daten.
---- 1. SaveToStream(Stream: TStream); file://schreibt die Daten in der Klasse an die aktuelle Position des Streams
---- 2. LoadFromStream(Stream: TStream); file://Liest die Daten im Stream von der aktuellen Position
---- Im tatsächlichen Gebrauch müssen wir grundsätzlich nur die beiden oben genannten Funktionen verwenden.
3. Beispiele
----Das Vererbungsbaumdiagramm von TStream ist in Abbildung 1 dargestellt (weggelassen). Die am häufigsten verwendeten sind TFileStream, TMemoryStream und TblobStream. Nehmen wir diese drei Streams als Beispiel, um die spezifische Verwendung zu veranschaulichen.
---- Erstellen Sie ein Formular Form1, platzieren Sie drei Schaltflächen btnRead, btnInvert, btnSave und ein Dialogfeld zum Öffnen einer Datei OpenDialog1 sowie die Datensteuerelemente DataSource1, Table1, test.
---- Verwenden Sie den von Dephi bereitgestellten Datenbank-Desktop, um einen Tabellentest zu erstellen. Die Tabelle enthält ein Feldbild und der Name der Datenbankdatei wird als test.db gespeichert. Platzieren Sie ein TDatabase-Steuerelement dbTest, ein TTable-Steuerelement Table1, ein DataSource-Steuerelement DataSource1 und ein TDBNavigator-Steuerelement DBNavigator1 im Formular. Verbinden Sie dbTest mit der soeben von Desktop erstellten Datenbank, legen Sie die TableName-Eigenschaft von Table1 auf test.db fest, legen Sie die DataSet-Eigenschaft von DataSource1 auf Table1 fest, legen Sie die DataSource-Eigenschaft von DBNavigator1 auf DataSource1 fest und legen Sie die ersten vier VisibleButtons-Eigenschaften auf TRUE fest. Setzen Sie außerdem Connected von dbtest auf TRUE und die Active-Eigenschaft von Table1 auf TRUE, damit die Datenbank von Anfang an geöffnet ist.
----Der Ereigniscode lautet wie folgt:
---- 1. Klicken Sie auf das Ereignis von btnRead, hier wird die Verwendung von TFileStream demonstriert.
var
MS: TFileStream;
beginnen
wenn OpenDialog1.Execute dann
beginnen
MS:=TFileStream.Create
(OpenDialog1.FileName, fmOpenRead);
Image1.Picture.Bitmap.LoadFromStream(MS);
MS.Free;
Ende;
Ende;
---- 2. Klicken Sie auf das Ereignis von btnInvert. Hier wird die Verwendung von TMemoryStream demonstriert. Es wird die Invert-Funktion verwendet, eine einfache Funktion, die die Farbe eines Bildes invertiert (nur gültig für Echtfarbenbilder). Sie gibt einen Zeiger auf den verarbeiteten Bilddatenblock zurück.
var
M
S: TMemoryStream;
pImage: Zeiger;
beginnen
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
pImage:=Invert(MS.Memory, MS.size);
Das Attribut file://Memory ist ein Zeiger auf den tatsächlichen Speicherblock
MS.Write(pImage^,MS.size);
MS.Position:=0;
Die vorherige Codezeile in file:// verschiebt den Zeiger an das Ende des Streams und muss daher zurückgesetzt werden.
Image1.Picture.Bitmap.LoadFromStream(MS);
FreeMem(pImage);
MS.Free;
Ende;
Die Funktion „Invertieren“ lautet wie folgt:
Funktion TForm1.Invert
(pImage: Zeiger; Größe: Ganzzahl): Zeiger;
var
pData, pMem: PChar;
i: Ganzzahl;
beginnen
pMem:=AllocMem(size);
CopyMemory(pMem,pImage,size);
pData:=pMem+54;
for i:=0 to size-54-1 do
beginnen
pData^:=Char(not integer(pData^));
pData:=pData+1;
Ende;
Ergebnis:=pMem;
Ende;
---- 1. Klicken Sie auf das Ereignis von btnSave. Hier wird eine weitere Verwendung von TMemoryStream gezeigt, bei dem die Daten im Stream in die Datenbank geschrieben werden.
var
MS: TMemoryStream;
beginnen
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
Table1.Append;
file://fügt einen Datensatz in der Datenbank hinzu
TBlobField(Table1.FieldbyName
('image')).LoadFromStream(MS);
Table1.Post;
file://schreibt die Aktualisierungen in die Datenbank
Ende;
---- 4. Klicken Sie auf das Ereignis von DBNavigator1. Hier wird die Verwendung von TBlobStream demonstriert, wobei zum Lesen der Bilddaten der Datenbank eine andere Methode als das Schreiben verwendet wird.
var
MS: TStream;
beginnen
mit Tabelle1 tun
MS:=CreateBlobStream
(FieldbyName('image'),bmRead);
Bild1.Bild.Bitmap.
LoadFromStream(MS);
MS.Free;
Ende;
Das ist es. Vielen Dank, dass Sie diesen Artikel gelesen haben. Ich habe nicht genügend Punkte zum Einlösen, daher muss ich einige Punkte sammeln, um sie einzulösen. Wenn Sie der Meinung sind, dass dieser Artikel für Sie hilfreich ist, stimmen Sie bitte für mich. Vielen Dank.