La relation d'héritage de TMemoryStream est la suivante
TObject
|
TSstream
|
TCustomMemoryStream
|
TMemoryStream
Comment utiliser TMemoryStream ?
En fait, TmemoryStream est utilisé comme TStream.
Pour des attributs et des méthodes spécifiques, veuillez consulter l'aide.
Voici un exemple :
Que dois-je faire si je souhaite lire et écrire un Bitmap directement en mémoire ?
TmemoryStream vous aide beaucoup
var
BitmapMemoryStream : TMemoryStream ;
Bitmap1 : TBitmap ;
PRécédure TForm.Button1Click(Sender:TObject);
commencer
BitmapmemroyStream:=TmemoryStream.Create; fichier://Create MemoryStream
Bitmap1 :=TBitmap.Create ;
essayer
Bitmap1.LoadFromFile('d:Bitmap1.bmp');
sauf
ShowMessage('Erreur lors du chargement du fichier bitmap1.bmp');
fin;
fin;
procédure TForm.Button2Click(Sneder:Tobject);
commencer
si attribué (Bitmap1) alors
Bitmap1.SaveToStream(BitmapmemoryStream);
fin;
procédure TForm.Button3Click(Sender:TObject);
commencer
si BitmapMemoryStream<>nil alors
commencer
essayer
BitmapMemroyStream.SaveToFile('Bitmap1.str'); fichier://enregistrement du flux mémoire, taille et
fichier://Bitmap1.bmp idem
sauf
showmessage('erreur d'accès à la mémoire !');
fin;
fin;
fin;
procédure TForm.Button4Click(Sender:TObject);
var
Tampon : Array[0..53] de caractères ;
commencer
si assigné (BitmapMemroyStream) alors
essayer
BitmapMemroyStream.Seek(0,soFromBeginning);
BitmapMemoryStream.Read(Buffer,54);
si Buffer[0]='B' et Buffer[1]='M' alors file://réécrire le contenu de la mémoire
commencer
BitmapMemoryStream.Seek(0,soFromBeginning);
BitmapmemoryStream.Write('ICE',3);
Button3Click(Sender);//Écrire le contenu réécrit dans le fichier
fin;
sauf
ShowMessage('erreur lors de l'accès à memroyStream');
fin;
fin;
Vous pouvez voir à quel point il est pratique d'utiliser TMemoryStream pour lire et écrire de la mémoire. Bien sûr, il n'est pas nécessaire de créer un Bitmap au préalable.
Vous pouvez utiliser LoadFromFile pour démarrer directement le fichier, mais pour d'autres flux de mémoire, vous pouvez utiliser la méthode ci-dessus.
Ce qui précède n'est qu'une introduction. Pour les autres fonctions, vous pouvez lire l'aide et les découvrir par vous-même !
Il existe de nombreux autres objets de streaming, qui sont tous à peu près identiques, vous pouvez donc tous les utiliser !
Comment écrire le contenu d'un flux dans le presse-papiers et le traiter
Cette technique est réalisée en référence à l'implémentation de la classe clipboard de Delphi. Mettre le contenu d'un flux dans le presse-papier,
Tout d’abord, enregistrez votre propre format à l’aide de la fonction RegisterClipboardFormat()
Effectuez ensuite les trois étapes suivantes :
1. Créez un flux de contenu et écrivez-y le contenu
2. Créez une zone de contenu globale et rédigez le contenu du flux
3. Appelez ClipBoard.SetAsHandle() pour écrire le contenu dans le presse-papiers
Écrire du contenu dans le presse-papiers
var
hbuf :TPoignée;
bufptr : Pointeur ;
mstream : TMemoryStream ;
commencer
mstream := TMemoryStream.Create;
essayer
{-- Code de traitement des flux --}
hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
essayer
bufptr := GlobalLock(hbuf);
essayer
Déplacer(mstream.Memory^, bufptr^, mstream.size);
Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);
enfin
GlobalUnlock(hbuf);
fin;
sauf
GlobalFree(hbuf);
augmenter;
fin;
enfin
mstream.Gratuit ;
fin;
fin;
Veuillez faire attention à ne pas libérer le tampon global alloué. Ce travail est effectué par le presse-papier lors de la lecture des données.
Vous devriez le copier et le traiter plus tard.
Lire le contenu du presse-papiers
var
hbuf :TPoignée;
bufptr : Pointeur ;
mstream : TMemoryStream ;
commencer
hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);
si hbuf <> 0 alors commencez
bufptr := GlobalLock(hbuf);
si bufptr <> nul alors commencez
essayer
mstream := TMemoryStream.Create;
essayer
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
mstream.Position := 0;
{-- Code de traitement des flux --}
enfin
mstream.Gratuit ;
fin;
enfin
GlobalUnlock(hbuf);
fin;
fin;
fin;
fin;
Conseils pour utiliser TStream pour lire et écrire des données dans Dephi
Un type de données abstrait TStream est fourni dans Dephi pour prendre en charge les opérations sur les données en streaming. Ces données proviennent généralement de fichiers, de bases de données, d'objets mémoire, d'objets OLE, etc. TStream fournit une méthode unifiée et concise pour lire et écrire des données. Dans des circonstances normales, nous n'avons pas besoin d'utiliser directement la classe TStream, et la lecture et l'écriture des données en streaming sont encapsulées dans les méthodes du contrôle VCL. Mais si ces méthodes ne peuvent pas répondre à nos exigences, nous devons contrôler nous-mêmes manuellement la lecture et l’écriture des données.
1. Méthodes et propriétés couramment utilisées de TStream :
---- 1. fonction Read(var Buffer; Count: Longint) : Longint virtuel ;
---- 2. fonction Write(const Buffer; Count: Longint) : Longint virtuel ;
---- 3. fonction Rechercher (Décalage : Entier long ; Origine : Mot) : Virtuel ;
---- 4. Position de la propriété : Entier long ;
---- 5. Taille de la propriété : Entier long
---- Lire, écrire et rechercher sont toutes des fonctions virtuelles pures, fournissant des méthodes abstraites pour la lecture, l'écriture et le positionnement des données. La méthode Read lit les données du Stream dans le Buffer et la méthode Write implémente l'opération inverse. La valeur de retour indique la taille réelle des données lues et écrites. Seek fournit une méthode pour déplacer le pointeur de données dans le Stream. Le paramètre Origin peut prendre trois valeurs : soFromBeginning, soFromCurrent et soFromEnd Offset est le décalage et la valeur de retour est la position du pointeur de données Stream actuel.
---- Position représente la position du pointeur de données dans le Stream. Cette propriété est lisible et inscriptible. Elle est en fait implémentée en appelant la méthode Seek, il est donc plus pratique d'utiliser cette propriété dans un usage réel. L'attribut Size indique la taille du Stream actuel. Pour différents Streams, il est parfois en lecture seule.
2. Lecture et écriture des données Stream.
---- 1. SaveToStream(Stream: TStream); file://écrit les données de la classe à la position actuelle du Stream
---- 2. LoadFromStream(Stream: TStream); file://Lire les données dans Stream à partir de la position actuelle
---- En utilisation réelle, nous n'avons besoin que d'utiliser les deux fonctions ci-dessus.
3. Exemples
----L'arbre d'héritage de TStream est illustré dans la figure 1 (omis). Dans l'utilisation réelle, TFileStream, TMemoryStream et TblobStream sont plus couramment utilisés. Prenons ces trois flux comme exemple pour illustrer l'utilisation spécifique.
---- Créez un formulaire Form1, placez trois boutons btnRead, btnInvert, btnSave et une boîte de dialogue d'ouverture de fichier OpenDialog1 ainsi que des contrôles de données DataSource1, Table1, test.
---- Utilisez le Database Desktop fourni par Dephi pour créer une table de test. Il y a un champ Image dans la table et le nom du fichier de base de données est enregistré sous test.db. Placez un contrôle TDatabase dbTest, un contrôle TTable Table1, un contrôle DataSource DataSource1 et un contrôle TDBNavigator DBNavigator1 sur le formulaire. Connectez dbTest à la base de données que Desktop vient de créer, définissez la propriété TableName de Table1 sur test.db, définissez la propriété DataSet de DataSource1 sur Table1, définissez la propriété DataSource de DBNavigator1 sur DataSource1 et définissez les quatre premières propriétés VisibleButtons sur TRUE. De plus, définissez Connected de dbtest sur TRUE et Active propriété de Table1 sur TRUE afin que la base de données soit ouverte depuis le début.
----Le code de l'événement s'écrit comme suit :
---- 1. Cliquez sur l'événement de btnRead, démontre ici l'utilisation de TFileStream.
var
MS : TFileStream ;
commencer
si OpenDialog1.Execute alors
commencer
MS:=TFileStream.Create
(OpenDialog1.FileName, fmOpenRead) ;
Image1.Picture.Bitmap.LoadFromStream(MS);
MS.Gratuit ;
fin;
fin;
---- 2. Cliquez sur l'événement de btnInvert, démontre ici l'utilisation de TMemoryStream. La fonction Inverser est utilisée, qui est une fonction simple qui inverse la couleur d'une image (valable uniquement pour les images en vraies couleurs). Elle renvoie un pointeur vers le bloc de données d'image traité.
var
M.
S : TMemoryStream ;
pImage : pointeur ;
commencer
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
pImage:=Inverser(MS.Memory, MS.size);
L'attribut file://Memory est un pointeur vers le bloc de mémoire réel
MS.Write(pImage^,MS.size);
MS.Position:=0;
La ligne de code précédente dans file:// déplace le pointeur vers la fin du Stream, il doit donc être réinitialisé.
Image1.Picture.Bitmap.LoadFromStream(MS);
FreeMem(pImage);
MS.Gratuit ;
fin;
La fonction Inverser est la suivante :
fonction TForm1.Inverser
(pImage : pointeur ; taille : Entier) : pointeur ;
var
pDonnées, pMem : PChar ;
je : entier ;
commencer
pMem:=AllocMem(taille);
CopierMemory(pMem,pImage,taille);
pDonnées:=pMem+54;
pour i:=0 à la taille-54-1 faire
commencer
pData^:=Char(pas entier(pData^));
pDonnées:=pDonnées+1;
fin;
Résultat :=pMem ;
fin;
---- 1. Cliquez sur l'événement btnSave, illustre ici une autre utilisation de TMemoryStream, écrivant les données du Stream dans la base de données.
var
MS : TMemoryStream ;
commencer
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position:=0;
Tableau1.Append ;
file://ajoute un enregistrement dans la base de données
TBlobField(Table1.FieldbyName
(« image »)).LoadFromStream(MS);
Tableau1.Post ;
file://écrit les mises à jour dans la base de données
fin;
---- 4. Cliquez sur l'événement DBNavigator1, démontre ici l'utilisation de TBlobStream, en utilisant une méthode différente de l'écriture pour lire les données d'image de la base de données.
var
MS : TStream ;
commencer
avec Table1 faire
MS : = Créer un flux Blob
(FieldbyName('image'),bmRead);
Image1.Picture.Bitmap.
LoadFromStream(MS);
MS.Gratuit ;
fin;
C'est tout. Merci d'avoir lu cet article. Je n'ai pas assez de points à utiliser, je dois donc en gagner pour les échanger. Si vous pensez que cet article vous est utile, votez pour moi, merci.