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
// // 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 IfNot Sauver.Execute Then Exit;
WriteComponentResFile(Sauver.FileName, Frame);
MajBoutons; End;
Procedure TForm1.btnChargerClick(Sender: TObject); Var i:Integer; Begin
Charger.FileName := Sauver.FileName; IfNot 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(255) Shl 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;