Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
62 - WRITECOMPONENT / READCOMPONENT

PRÉSENTATION : Ecrire et lire des composants dans un fichier
ZIP : Téléchargez le zip APERÇUS :

NOTES : Ce source présente une méthode simple pour enregistrer et lire des composants dans un fichier.

La description de la méthode employée est dans les commentaires du source.
Attention : dans le cas de sauvegarde de composants personnalisés, seules les propriétés ( au sens POO ) sont enregistrées.

Pour tester la méthode, il suffit de lancer l'application. De créer un panneau avec le bouton "créer". Puis de l'enregistrer dans un fichier avec le bouton "sauver...". Ensuite pour relire le fichier il suffit de détruire le panneau actuel, ou de fermer/relancer l'application. Le bouton "Charger" permet alors de lire une sauvegarde du panneau avec tous ses boutons.

CODE :
Unit Unit1;
//
// Sujet : Enregistrement / Lecture de composants dans un fichier
//
// Par Nono40 : http://nono40.developpez.com   http://nono40.fr.st
//              mailTo:nono40@fr.st
//
// Le 22/07/2003
//
// Lisez les commentaires dans le sources pour obtenir la
// marche à suivre complète.
//
Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls;

Type
  TForm1 = Class(TForm)
    Panel1: TPanel;
    btnCreer: TBitBtn;
    btnDetruire: TBitBtn;
    btnSauver: TBitBtn;
    btnCharger: TBitBtn;
    Charger: TOpenDialog;
    Sauver: TSaveDialog;
    Procedure btnCreerClick(Sender: TObject);
    Procedure FormCreate(Sender: TObject);
    Procedure btnDetruireClick(Sender: TObject);
    Procedure btnSauverClick(Sender: TObject);
    Procedure btnChargerClick(Sender: TObject);
  Private
    { Déclarations privées }
    Panel : TPanel;
    Procedure MAJBoutons;
  Public
    { Déclarations publiques }
    Chaine:String;
  End;

Var
  Form1: TForm1;

Implementation

{$R *.dfm}

//
// TStream.ReadComponent ne peut lire que les classes qu'il connait.
// Par défaut il ne connait pas les composants utilisés. Pour palier
// à ce problème il faut enregistrer les classes susceptibles d'être
// lus par ReadComponent.
// Si une classe manque, la lecture provoque un exception EClassNotFound
// avec le message "Classe xxxxxx non trouvée". Ajoutez alors une ligne
// dans le OnCreate comme ci-dessous pour déclarer la classe manquante.
//
Procedure TForm1.FormCreate(Sender: TObject);
Begin
  // Panel contient notre composant de test. Au démarrge il est vide
  Panel:=Nil;

  // Enregistrement des deux classes utilisées dans cet exemple
  RegisterClass(TPanel);
  RegisterClass(TButton);

  // Pour générer des boutons différents à chaque lancement
  Randomize;
  MajBoutons;
End;

// Procédure de sauvegarde du paneeau créé dynamiquement avec
// un trentaine de boutons. On ne peut faire plus simple...
Procedure TForm1.btnSauverClick(Sender: TObject);
Var Stream:TFileStream;
Begin
  If Not Sauver.Execute Then Exit;
  // Création d'un flux pour sauvegarder le composant et ses descendants
  Stream:=TFileStream.Create(Sauver.FileName,fmCreate);
  Try
    // Sauvergarde du composant, de ses propriétés et des objets inclus
    // et le tout en une simple ligne !
    Stream.WriteComponent(Panel);
  Finally
    // Libération du flux
    Stream.Free;
  End;
  MajBoutons;
End;

Procedure TForm1.btnChargerClick(Sender: TObject);
Var Stream:TFileStream;
Begin
  Charger.FileName := Sauver.FileName;
  If Not Charger.Execute Then Exit;
  // Création d'un flux pour la lecture du panneau
  Stream:=TFileStream.Create(Charger.FileName,fmOpenRead);
  Try
    // Lecture des propriétés du panneau, et des composants
    // qu'il doit contenir. Toujours en une simple ligne !
    // Ici, en passant Nil comme paramètre, le composant
    // est automatiquement créé.
    Panel:=TPanel(Stream.ReadComponent(Nil));
    // Attention, Parent n'est jamais Lu/Ecrit, il faut
    // donc le mettre manuellement après la lecture/
    Panel.Parent := Self;
  Finally
    Stream.Free;
  End;
  MajBoutons;
End;

// Simple procédure de création dynamique d'un panneau
// et de 30 boutons aléatoires. Juste pour la démo.
Procedure TForm1.btnCreerClick(Sender: TObject);
Var i:Integer;
Begin
  Panel:=TPanel.Create(Self);
  Panel.Caption:='';
  Panel.Align  :=AlClient;
  Panel.Parent :=Self;
  Panel.Color  :=Random(255Shl 8;
  For i:=1 To 30 Do
  With TButton.Create(Panel)Do
  Begin
    // attention, il est très important dans cet exemple
    // que le propriétaire soit Panel et non pas Form1.
    // Car c'est le tableau Panel.Components qui est
    // utilisé pour l'enregistrement des composants enfants
    Parent  := Panel;
    Left    := Random(Panel.Width -80);
    Top     := Random(Panel.Height-30);
    Caption := IntToStr(Random(8000)+1000);
  End;
  MajBoutons;
End;

// Toujours pour la démo, la destruction du panneau
// afin de pouvoir le relire à partir d'un fichier.
Procedure TForm1.btnDetruireClick(Sender: TObject);
Begin
  FreeAndNil(Panel);
  MajBoutons;
End;

Procedure TForm1.MAJBoutons;
Begin
  btnCreer    .Enabled := Panel =  Nil;
  btnDetruire .Enabled := Panel <> Nil;
  btnSauver   .Enabled := Panel <> Nil;
  btnCharger  .Enabled := Panel =  Nil;
End;

end.

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -