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
// // 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 IfNot 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; IfNot 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(255) Shl 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;