Sign in Join
Wiki copytemporary

Streaming components/fr

Deutsch · English · Français · Polski · Português · 日本語

Introduction

Normalement, quand vous voulez stocker des données sur le disque ou le réseau, vous devez écrire le code pour le chargement et l'enregistrement de chaque propriété. Ce tutoriel décrit comment écrire des classes qui peuvent être chargées et enregistrées à partir de flux sans charge supplémentaire de code de chargement/enregistrement, tout cela en utilisant la RTTI.

Vous trouverez un exemple dans les sources de Lazarus démontrant comment enregistrer un TGroupBox avec un enfant TCheckBox vers un flux et relire ce flux pour créer une copie des deux composants. Voir <lazaruspath>/examples/componentstreaming/

En combinaison avec Les contrôles RTTI, vous pouvez réduire au minimum la quantité de code nécessaire pour connecter les données du programme avec le GUI et le Disque/Réseau.

TComponent / TPersistent

La classe TPersistent est définie dans l'unité Classes et utilise la directive de compilation {$M+} . Cette directive dit au compilateur de créer de l'information pendant le temps d'exécution (RTTI). Lui et tous ses descendants comprennent alors une nouvelle section de classe published. Les propriétés published sont visibles comme si elles étaient public, mais leur structure est aussi accessible pendant le temps d'exécution. Cela signifie que toute propriété published peut être lue et écrite pendant ce temps d'exécution. Par exemple, l'EDI emploie cette technique pour travailler avec des composants dont il n'a jamais entendu parler.

TComponent étend les possibilités de TPersistent par sa capacité à posséder des composants enfants. Cette capacité est importante pour le traitement des flux : un composant est le composant racine (appelé parfois lookup root) qui gère une liste de composants enfants.

TReader / TWriter

Ce sont les classes qui permettent d'écrire/de lire un TComponent vers/depuis un flux (Voir CreateLRSReader et CreateLRSWriter). Elles emploient un Pilote pour lire/écrire dans un format spécial. A l'heure actuelle, il y a un lecteur (TLRSObjectReader), un outil d'écriture (TLRSObjectWriter) pour le format d'objet binaire défini dans l'unité LResources et un outil d'écriture (TXMLObjectWriter) pour TDOMDocument défini dans Laz_XMLStreaming. L'unité LResources contient également des fonctions pour convertir le format binaire en texte et l'inverse (LRSObjectBinaryToText, LRSObjectTextToBinary). La bibliothèque LCL utilise de préférence le codage UTF8 pour les chaînes de caractères tandis que Delphi préfère Widestrings . Par conséquent, vous disposez aussi de quelques fonctions de conversion si bien que vous pouvez tout aussi bien travailler avec des données de flux provenant de Lazarus qu'avec des données au format binaire de Delphi.

Streaming Collections

Consultez TCollection/fr#Streaming

Il s'agit d'un exemple complet qui montre comment utiliser les classes TCollectionItem, TCollection et les gérer par des flux grâce à TComponent.

Écrire votre propre composant - Partie 1

Un composant personnalisé peut être aussi simple que :

pascal
type
 TMyComponent = class(TComponent)
 private
   FID: integer;
 published
   property ID: integer read FID write FID;
 end;

Écrire un composant dans un flux

L'unité LResources a une fonction pour cela :

pascal
 procedure WriteComponentAsBinaryToStream(AStream: TStream; AComponent: TComponent);

Elle écrit un composant dans le format binaire du flux. Par exemple :

pascal
procedure TForm1.Button1Click(Sender: TObject);
var
  AStream: TMemoryStream;
begin
  AStream:=TMemoryStream.Create;
  try
    WriteComponentAsBinaryToStream(AStream,AGroupBox);
    ... enregistre le flux quelque part ...
  finally
    AStream.Free;
  end;
end;

Lecture d'un composant depuis un flux

L'unité LResources a une fonction pour cela :

pascal
 procedure ReadComponentFromBinaryStream(AStream: TStream;
   var RootComponent: TComponent; OnFindComponentClass: TFindComponentClassEvent; TheOwner: TComponent = nil);

Propriétés pouvant être stockées dans un flux

Il y a quelques limitations concernant les types TReader/TWriter qui peuvent être stockés dans un flux :

Mise en flux de données courantes - DefineProperties.

Vous pouvez mettre en flux des données arbitraires additionnelles en écrasant DefineProperties. Ceci permet de mettre en flux toutes les données qui n'ont aucun type de base. Par exemple, pour mettre en flux une variable FMyRect: TRect de votre composant , ajoutez les trois méthodes suivantes à votre composant :

pascal
procedure DefineProperties(Filer: TFiler); override;
procedure ReadMyRect(Reader: TReader);
procedure WriteMyRect(Writer: TWriter);

avec le code suivant :

pascal
procedure TMyComponent.DefineProperties(Filer: TFiler);
var
  MyRectMustBeSaved: Boolean;
begin
  inherited DefineProperties(Filer);
  MyRectMustBeSaved:=(MyRect.Left<>0)
                     or (MyRect.Top<>0)
                     or (MyRect.Right<>0)
                     or (MyRect.Bottom<>0);
  Filer.DefineProperty('MyRect',@ReadMyRect,@WriteMyRect,MyRectMustBeSaved);
end;
pascal
procedure TMyComponent.ReadMyRect(Reader: TReader);
begin
  with Reader do begin
    ReadListBegin;
    FMyRect.Left:=ReadInteger;
    FMyRect.Top:=ReadInteger;
    FMyRect.Right:=ReadInteger;
    FMyRect.Bottom:=ReadInteger;
    ReadListEnd;
  end;
end;
pascal
procedure TMyComponent.WriteMyRect(Writer: TWriter);
begin
  with Writer do begin
    WriteListBegin;
    WriteInteger(FMyRect.Left);
    WriteInteger(FMyRect.Top);
    WriteInteger(FMyRect.Right);
    WriteInteger(FMyRect.Bottom);
    WriteListEnd;
  end;
end;

Cela sauvegardera MyRect en tant que propriété MyRect.

Si vous mettez en flux beaucoup de TRect, vous ne voudrez probablement pas écrire ce code chaque fois. L'unité LResources contient un exemple qui montre comment écrire une procédure pour définir une propriété rect :

pascal
 procedure DefineRectProperty(Filer: TFiler; const Name: string; ARect, DefaultRect: PRect);

De cette façon, le code ci-dessus peut être réduit à :

pascal
procedure TMyComponent.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  DefineRectProperty(Filer,'MyRect',@FMyRect,nil);
end;

Écrire votre propre composant - Partie 2

L'exemple décrit peut être étendu. Ainsi, nous pouvons employer des propriétés arbitraires avec seulement quelques lignes de code :

pascal
type
  TMyComponent = class(TComponent)
  private
    FID: integer;
    FRect1: TRect;
    FRect2: TRect;
  protected
    procedure DefineProperties(Filer: TFiler); override;
  public
    property Rect1: TRect read FRect1 write FRect1;
    property Rect2: TRect read FRect2 write FRect2;
  published
    property ID: integer read FID write FID;
  end;
pascal
procedure TMyComponent.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  DefineRectProperty(Filer,'Rect1',@FRect1,nil);
  DefineRectProperty(Filer,'Rect2',@FRect2,nil);
end;

Ce composant peut maintenant être sauvegardé, chargé ou utilisé par Les contrôles RTTI. Vous n'avez pas besoin d'écrire quoi que ce soit d'autre.

Écrire et lire des composants depuis/vers LFM

Consultez les fonctions ReadComponentFromTextStream et WriteComponentAsTextToStream de l'unité lresources pour des exemples.

Écrire et lire des composants depuis/vers XML

Mettre en flux des composants est simple : Consultez l'exemple dans lazarus/examples/xmlstreaming/.

Noms

Conclusion

La RTTI est un mécanisme puissant qui peut être employé pour facilement mettre en flux des classes entières et qui évite d'écrire beaucoup de code de chargement/enregistrement pénible.

Voir également :

Les contrôles RTTI


From the Free Pascal wiki, page "Streaming components/fr", as it stood on 2017-05-30 after a change by Gillou58, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Edited on wiki.freepascal.org by 4 people, 2007–2017

From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.

WhenWhoWhat changed
PaulatreidesNew page: {{Streaming components}} == Introduction == Normally, when you want to store data on disk or to network streams, you must write code for loading and saving each property. This tutorial d...
PaulatreidesIntroduction
Swen (minor)
PaulatreidesConclusion
PaulatreidesConclusion
PaulatreidesWriting your own component - Part 2
PaulatreidesIntroduction
PaulatreidesTComponent / TPersistent
PaulatreidesTReader / TWriter
PaulatreidesWriting your own component - Part 1
PaulatreidesEcriture de votre propre composant - Partie 1
PaulatreidesEcriture de votre propre composant - Partie 1
PaulatreidesWriting a component to a stream
PaulatreidesReading a component from a stream
PaulatreidesLecture d'un composant depuis un flux
PaulatreidesStreamable properties
PaulatreidesStreaming custom Data - DefineProperties
PaulatreidesPropriétés pouvant être mise en flux
PaulatreidesMise en flux de données courantes - DefineProperties.
PaulatreidesWriting your own component - Part 2
PaulatreidesWriting and Reading components from/to XML
PaulatreidesConclusion
Gillou58
Gillou58Introduction
Gillou58TComponent / TPersistent
Gillou58TReader / TWriter
Gillou58TReader / TWriter
Gillou58Ecriture de votre propre composant - Partie 1
Gillou58Ecrire un composant sur un flux
Gillou58Lecture d'un composant depuis un flux
Gillou58Lecture d'un composant depuis un flux
Gillou58Propriétés pouvant être mise en flux
Gillou58Propriétés pouvant être stockées dans un flux
Gillou58Mise en flux de données courantes - DefineProperties.
Gillou58Mise en flux de données courantes - DefineProperties.
Gillou58Inscriture de votre propre composant - Partie 2
Gillou58Écriture de votre propre composant - Partie 1
Gillou58Ecrire et lire des composants depuis/vers XML
Gillou58Écrire et lire des composants depuis/vers LFM
Gillou58Conclusion
Gillou58Écrire et lire des composants depuis/vers XML
Gillou58Écrire et lire des composants depuis/vers XML
Gillou58Écrire votre propre composant - Partie 1
Gillou58Streaming Collections
Gillou58Noms
E-ric (minor)
E-ricStreaming Collections (minor)
Gillou58

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.