IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
64 - WRITECOMPONENTRES / RESCOMPONENTRES

PRÉSENTATION : Enregsitrer un TFrame dans un fichier
ZIP : Téléchargez le zip APERÇUS :

NOTES : Ce source complète le source numéro 0062. L'objet enregistré est ici un TFrame plutôt qu'un TPanel. Cette différence est importante car le TFrame contient le code des évènements. Il est ainsi possible de sauvegarder dans le fichier la liaison entre les évènements des composants et le code associé. Pour que ceci fonctionne, les codes des évènements doivent être déclarés dans la partie publiée du TFrame.
Notez aussi que les méthodes présentées ici sont WriteComponentRes et ReadComponentRes, elles permettent d'enregistrer directement dans un fichier sans passer par un flux. Si vous utilisez les méthodes décrites dans le source 0062 ( WriteComponent / ReadComponent ), elles sont aussi applicables ici.

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
// et DelphiProg : http://delphiprog.fr.fm
//                 mailTo:delphiprog@fr.fm
//
// Le 06/09/2003
//
// Merci à Delphiprog pour l'utilisation de
// ReadComponentRes et WriteComponentRes qui n'ont pas besoin de
// flux.
//
// 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, Unit2;

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 }
    Procedure MAJBoutons;
  Public
    { Déclarations publiques }
    Chaine:String;
    Frame : TMaFrame;
  End;

Var
  Form1: TForm1;

Implementation

{$R *.dfm}

//
// ReadComponentRes 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 ReadComponentRes.
// 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
  Frame:=Nil;

  // Enregistrement des deux classes utilisées dans cet exemple
  RegisterClasses([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);
Begin
  If Not Sauver.Execute Then Exit;
  WriteComponentResFile(Sauver.FileName, Frame);
  MajBoutons;
End;

Procedure TForm1.btnChargerClick(Sender: TObject);
Var i:Integer;
Begin
  Charger.FileName := Sauver.FileName;
  If Not Charger.Execute Then Exit;
  // Création de la nouvelle trame à partir d'un fichier
  Try
    // Création d'un trame type
    Frame:= TMaFrame.Create(Self);
    // Supression des composants prédéfini de la trame
    // Car ils sont aussi dans le fichier, si on ne les
    // supprime pas ils seront en double et provoqueront
    // une erreur.
    For i:=Frame.ComponentCount-1 Downto 0 Do
      Frame.Components[i].Free;
    // Lecture du fichier et association du résultat à
    // Frame
    ReadComponentResFile(Charger.FileName,Frame);
    // Association du parent...
    Frame.Parent:=self;
  Except
    On E: Exception Do
      ShowMessageFmt('%s : à la lecture de %s', [E.Message, Charger.FileName]);
  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
  Frame:=TMaFrame.Create(Self);
  Frame.Align  :=AlClient;
  Frame.Parent :=Self;
  Frame.Color  :=Random(255Shl 8;
  For i:=1 To 30 Do
  With TButton.Create(Frame)Do
  Begin
    // attention, il est très important dans cet exemple
    // que le propriétaire soit Frame et non pas Form1.
    // Car c'est le tableau Frame.Components qui est
    // utilisé pour l'enregistrement des composants enfants
    Parent  := Frame;
    Name    := 'Bouton'+IntTostr(i);
    Left    := Random(Frame.Width -80);
    Top     := Random(Frame.Height-30);
    Caption := IntToStr(Random(8000)+1000);
    // Il est très imporant aussi que les évènement soient
    // contenu dans le code de Frame, et que leur déclaration
    // soit dans la partie publiée de TMaFrame
    OnClick := Frame.btnClick;
  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(Frame);
  MajBoutons;
End;

Procedure TForm1.MAJBoutons;
Begin
  btnCreer    .Enabled := Frame =  Nil;
  btnDetruire .Enabled := Frame <> Nil;
  btnSauver   .Enabled := Frame <> Nil;
  btnCharger  .Enabled := Frame =  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 ni 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.