Sie sind auf Seite 1von 23

La sauvegarde d'objets

La srialisation, c'est quoi ?


Vous vous souvenez du cycle de vie d'une variable normale, ds que la boucle, fonction, classe dans laquelle elle a t cre est termine, la variable est dtruite et libre de la mmoire. Les donnes qu'elle contient sont donc perdues. Vous avez dus vous douter que le mme principe s'appliquait pour les objets. Et l ce n'est pas une simple valeur de variable qui est perdue mais toutes les variables que l'objet contenant (des attributs). Pour sauvegarder notre variable pour une utilisation ultrieure (un autre lancement du programme), nous avons vus comment stocker cette variable dans un fichier. Les integers, strings, dates, bref les variables basiques sont facilement stockables mais les objets le sont plus difficilement. Je vais crer une classe basique contenant des informations concrtes. Le projet que j'ai cre est de type console car l'interface graphique est superflue pour le moment. Code : VB.NET - Slectionner
Public Class Film 1 2 Public Titre As String 3 Public Annee As Integer 4 Public Desciption As String 5 6 Sub New() 7 8 End Sub 9 10 Sub New(ByVal TitreFilm As String, ByVal AnneeFilm As Integer, ByVal 11 DescriptionFilm As String) 12 Titre = TitreFilm 13 Annee = AnneeFilm 14 Desciption = DescriptionFilm 15 End Sub 16 17 End Class

Ma classe s'appelle Film, elle va contenir des informations pour crer un objet Film auquel on spcifiera son nom, son anne de sortie et une petite description. Cette classe est trs basique, seulement trois attributs. Mais si je veux la sauvegarder il va dj falloir crire 3 variables diffrentes dans un fichier. Donc imaginez avec plusieurs dizaines d'informations (attributs).

Avec la srialisation (le stockage d'objet) on va pouvoir facilement crire tous les attributs d'un objet dans un fichier. Ce fichier sera automatiquement format. Ce formatage va dpendre de la mthode de srialisation utilise. Il existe donc deux mthodes. La mthode binaire, elle permet la sauvegarde des attributs Publics et Privs tout en incluant galement le nom de la classe dans le fichier. La seconde mthode, la srialisation XML est trs utile car le format soap (le type de formatage d'un fichier XML) est trs rpandu, pour communiquer via des Webservices et en gnral sur l'internet. Ses inconvnients sont que les attributs privs ne sont pas pris en compte et les types des attributs ne sont enregistrs nulle part. Commenons avec la srialisation Binaire :

La srialisation binaire.
Pour commencer je modifie notre classe Film pour spcifier au programme qu'il peut la srialiser grce <Serializable()> inscrit dans sa dclaration : Code : VB.NET - Slectionner
1 <Serializable()> 2 Public Class Film 3 4 Public Titre As String 5 Public Annee As Integer 6 Public Desciption As String 7 8 Sub New() 9

10 End Sub 11 12 Sub New(ByVal TitreFilm As String, ByVal AnneeFilm As Integer, ByVal 13 DescriptionFilm As String) 14 Titre = TitreFilm 15 Annee = AnneeFilm 16 Desciption = DescriptionFilm 17 End Sub 18 End Class

Ensuite, dans la page contenant le code qui va permettre de srialiser l'objet on va faire deux Imports, l'un permettant d'utiliser la srialisation, le second permettant l'criture dans un fichier : Code : VB.NET - Slectionner
1 Imports System.Runtime.Serialization.Formatters.binary 2 Imports System.IO

Je ne sais pas si vous vous souvenez de la partie 1 sur les fichiers mais elle tait fastidieuse car je vous faisais travailler sur des flux. La srialisation reprend le mme principe, nous allons ouvrir un flux d'criture sur le fichier et la fonction de srialisation va se charger de le remplir. Donc pour remplir un fichier bin avec un objet que je viens de crer : Code : VB.NET - Slectionner
'On cre l'objet 1 Dim Avatar As New Film("Avatar", 2009, "Avatar, film de James 2 Cameron sorti en dcembre 2009.") 3 'On cre le fichier et rcupre son flux 4 Dim FluxDeFichier As FileStream = File.Create("Film.bin") 5 Dim Serialiseur As New BinaryFormatter 6 'Serialisation et criture 7 Serialiseur.Serialize(FluxDeFichier, Avatar) 8 'Fermeture du fichier 9 FluxDeFichier.Close()

Et pourquoi .bin l'extension du fichier ? Ce n'est pas obligatoire de lui assigner cette extension, c'est juste une convention. Comme lorsque nous crions des fichiers de configuration, nous avions tendance les nommer en .ini, mme si nous aurions pu leur donner l'extension .bla. Le BinaryFormatter est un objet qui va se charger de la srialisation Binaire. C'est lui qui va effectuer le formatage spcifique ce type de srialisation. L'objet Avatar tant un film est dsormais sauvegard, si je veux rcuprer les informations il faut que je le dsrialise.

La dsrialisation est l'oppos de la srialisation. Sur le principe de la lecture / criture dans un fichier. La srialisation crit l'objet, la dsrialisation le lit. Nous allons utiliser le mme BinaryFormatter que lors de la srialisation. Programmatiquement : Code : VB.NET - Slectionner
If File.Exists("Film.bin") Then 1 'Je cre ma classe "vide" 2 Dim Avatar As New Film() 3 'On ouvre le fichier et recupere son flux 4 Dim FluxDeFichier As Stream = File.OpenRead("Film.bin") 5 Dim Deserialiseur As New BinaryFormatter() 6 'Dsrialisation et conversion de ce qu'on rcupre dans le 7 type "Film" 8 Avatar = CType(Deserialiseur.Deserialize(FluxDeFichier), 9 Film) 10 'Fermeture du flux 11 FluxDeFichier.Close() End If

Je vrifie avant tout que le fichier est bien prsent. La ligne de dsrialisation effectue deux oprations : la dsrialisation et la conversion avec Ctype de ce qu'on rcupre dans le type de notre classe (ici Film). Et on entre le tout dans "Avatar". Si vous analysez les attributs, vous remarquez que notre film a bien t rcupr. VB.Net est "intelligent", si vous n'aviez pas effectu de Ctype, il aurait tout de mme russi l'insrer dans l'objet Avatar. La seule diffrence est que le Ctype offre une meilleure vue et comprhension de notre programme. La mme remarque peut tre faite lors de renvoie de valeurs via des fonctions, le type de retour n'est pas forc d'tre spcifi, une variable de type Object (spcifique Visual Basic) sera alors retourn mais pour un programmeur, un code avec des "oublis" de ce type peut trs vite devenir incomprhensible et ouvre la porte beaucoup de possibilit d'erreur. Bon, je ne vous montre pas le contenu du fichier rsultant, ce n'est pas beau voir. Ce n'est pas fait pour a en mme temps, la srialisation XML quand elle va nous donner un rsultat plus comprhensible et modifiable manuellement par un simple mortel. Voyons a tout de suite.

La srialisation XML
La srialisation XML quand elle respecte le protocole SOAP (Simple Object Access Protocol), le fichier XML que vous allez gnrer va pourvoir tre transport et utilis plus facilement sur d'autres plateformes et langages de programmations qui respecteront eux aussi le protocole SOAP. Le format XML (je vous renvoie sa page Wikipedia pour plus d'informations) formate le fichier sous une mthode bien spcifique compose de sections et sous-sections.

Je vais reprends l'exemple de Wikipedia pour vous dtailler rapidement sa composition : Code : XML - Slectionner
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- '''Commentaire''' --> 3 <lment-document xmlns="http://exemple.org/" xml:lang=";fr"> 4 <lment>Texte</lment> 5 <lment>lment rpt</lment> 6 <lment> 7 <lment>Hirarchie rcursive</lment> 8 </lment> 9 <lment>Texte avec<lment>un lment</lment>inclus</lment> 10 <lment/><!-- lment vide --> 11 <lment attribut="valeur"></lment> 12 </lment-document>

La premire ligne spcifiant une instruction de traitement, elle est ncessaire pour des logiciels traitant ce type de fichier, une convention encore une fois. Viens une ligne de commentaire, elle n'est pas cense nous intresser car notre srialisation ne gnrera pas de commentaire. Par contre le reste est intressant. La srialisation va convertir la classe en un noeud principal (lment racine) et ses attributs seront transforms en sous-lments. Un exemple simple du rsultat de la srialisation :

Code : VB.NET - Slectionner


Public Class ClasseExemple 1 Public ValeurNumerique As 2 Integer 3 End Class

Code : XML - Slectionner


<ClasseExemple> 1 2 <ValeurNumerique>23</ValeurNumerique> 3 </ClasseExemple>

Vous arrivez distinguer l'oeil nu les corrlations qui sont prsentes entre la classe et sa srialisation, ce qui va tre beaucoup plus facile pour les modifications manuelles. Bon, passons la programmation. On va changer un l'import que nous utilisions pour la srialisation binaire. Ce qui nous amne crire : Code : VB.NET - Slectionner
1 Imports System.IO 2 Imports System.Xml.Serialization

O System.IO contient toujours de quoi interagir avec les fichiers et System.Xml.Serialization les classes ncessaires la srialisation XML. Et dans notre code, presque aucun changement :

Code : VB.NET - Slectionner


1 2 3 4 5 6 7 8 Dim Avatar As New Film("Avatar", 2009, "Avatar, film de James Cameron sorti en dcembre 2009.") 'On cre le fichier et rcupre son flux Dim FluxDeFichier As FileStream = File.Create("Film.xml") Dim Serialiseur As New XmlSerializer(GetType(Film)) 'Serialisation et criture Serialiseur.Serialize(FluxDeFichier, Avatar) 'Fermeture du fichier FluxDeFichier.Close()

Eh oui, le principe de srialisation reste le mme, c'est juste un objet de type XmlSerializer qu'on instancie cette fois-ci. Il faut passer un argument son constructeur : le type de l'objet que nous allons srialiser. Ici c'est ma classe film donc la fonction GetType(Film) convient parfaitement. Une fois la srialisation effectue, le fichier en rsultant contient : Code : XML - Slectionner
<?xml version="1.0"?> 1 <Film xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <Titre>Avatar</Titre> 4 <Annee>2009</Annee> 5 <Desciption>Avatar, film de James Cameron sorti en dcembre 6 2009.</Desciption> </Film>

Un beau fichier bien format ! Pour la dsrialisation, mme principe : Code : VB.NET - Slectionner
If File.Exists("Film.xml") Then 1 'Je cre ma classe "vide" 2 Dim Avatar As New Film() 3 'On ouvre le fichier et recupere son flux 4 Dim FluxDeFichier As Stream = File.OpenRead("Film.xml") 5 Dim Deserialiseur As New XmlSerializer(GetType(Film)) 6 'Dsrialisation et convertion de ce qu'on rcupre dans le type 7 "Film" 8 Avatar = CType(Deserialiseur.Deserialize(FluxDeFichier), Film) 9 'Fermeture du flux 10 FluxDeFichier.Close() 11 End If

Juste un petit mot sur la taille du fichier rsultant. Mme si le fichier XML semble plus long leur taille ne diffre que du type de formatage qu'utilise XML.

Si votre objet contient 1Ko de donnes programmatiquement parlant, la srialisation n'est pas l pour rduire cette taille. Au contraire, le formatage qu'apporte la srialisation (binaire ou XML) ne tend qu' l'alourdir.

La srialisation multiple
Bon, jusqu' prsent aucun problme pour ce qui est de srialiser notre petit film "Avatar". Mais immaginez que nous voulons enregistrer toute une bibliothque de films (une ide de TP ? ). Dj, avant que vous vous enfonciez je vous dis qu'avec notre mthode a ne va pas tre possible. Et pourquoi a ?

Eh bien vous avez vus que le noeud principal de notre document XML est <Film>, et j'ai dit qu'il ne pouvait avoir qu'un seul nud principal par document XML. autrement dit, qu'un seul film. Certes il reste l'ide de crer un fichier XML par Film sauvegarder mais je pense que ce n'est pas la meilleure mthode . Rappelez vous de nos amis les tableaux. Un tableau de string, vous vous souvenez, et dans une TP je vous ai tendu un pige en faisant un tableau de RadioButtons. a va tre le mme principe ici, un tableau de films. Oui, il fallait juste y penser. Ce qui nous donne en cration d'un tableau de films et srialisation du tout : Code : VB.NET - Slectionner
1 2 3 4 5 6 7 8 9 10 Dim Films(1) As Film Films(0) = New Film("Avatar", 2009, "Avatar, film de James Cameron sorti en dcembre 2009.") Films(1) = New Film("Twilight 3", 2010, "Troisime volet de la quadrilogie Twilight") 'On cre le fichier et rcupre son flux Dim FluxDeFichier As FileStream = File.Create("Films.xml") Dim Serialiseur As New XmlSerializer(GetType(Film())) 'Serialisation et criture Serialiseur.Serialize(FluxDeFichier, Films) 'Fermeture du fichier FluxDeFichier.Close()

Pour la cration du tableau, je ne vous fais pas d'explication je pense. Un tableau de 2 cases, Avatar dans la premire, Twilight 3 dans la seconde (il va falloir que je mette jour ce tuto dans le futur, avec les films du moment ).

La seule particularit est le type que l'on fournit au XmlSerializer. Ce n'est pas un simple GetType(Film) , autrement dit le type de ma classe Film mais c'est GetType(Film()) , le type d'un tableau de ma classe Film. Une fois la srialisation effectue, notre fichier se compose ainsi : Code : XML - Slectionner
<?xml version="1.0"?> 1 <ArrayOfFilm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <Film> 4 <Titre>Avatar</Titre> 5 <Annee>2009</Annee> 6 <Desciption>Avatar, film de James Cameron sorti en dcembre 7 2009.</Desciption> 8 </Film> 9 <Film> 10 <Titre>Twilight 3</Titre> 11 <Annee>2010</Annee> 12 <Desciption>Troisime volet de la quadrilogie Twilight</Desciption> 13 </Film> </ArrayOfFilm>

Le nud principal est dsormais un ArrayOfFilm, soit un Tableau de Film. Et chaque nud secondaire correspond un film. La dsrialisation est pratiquement la mme elle aussi : Code : VB.NET - Slectionner
1 If File.Exists("Film.xml") Then 2 'On ouvre le fichier et recupere son flux 3 Dim FluxDeFichier As Stream = File.OpenRead("Film.xml") 4 Dim Deserialiseur As New XmlSerializer(GetType(Film())) 5 'Dsrialisation et insertion dans le tableau de Film() 6 Dim Films() As Film = Deserialiseur.Deserialize(FluxDeFichier) 7 'Fermeture du flux 8 FluxDeFichier.Close() 9 End If

Ici, mme remarque que pour la srialisation, le type qu'on fournit est bien un tableau de Film() et non plus un Film simple. Seconde remarque : j'ai effectu la dclaration de mon tableau sur la mme ligne que la dsrialisation. Cela me permet de m'affranchir de la dclaration fixe du la longeur de mon tableau. Autrement dit, le programme va se charger tout seul de dterminer combien il y a de films prsents et construira un tableau de taille ncessaire. J'ai fait ceci en crivant Films() au lieu de Films(1). Mais le rsultat sera le mme, et au moins pas de risque d'erreurs de taille =) Et en ce qui concerne les collections, que nous venons d'aborder ; la mthode est la mme : Code : VB.NET - Slectionner

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

Imports System.IO Imports System.Xml.Serialization Module Module1 Sub Main() Dim MaListeDeClasses As New List(Of Classe) MaListeDeClasses.Add(New Classe("Avatar")) MaListeDeClasses.Add(New Classe("Twilight 1")) MaListeDeClasses.Insert(0, New Classe("Titanic")) 'On cre le fichier et rcupre son flux Dim FluxDeFichier As FileStream = File.Create("C:\Classes.xml") Dim Serialiseur As New XmlSerializer(GetType(List(Of Classe))) 'Serialisation et criture Serialiseur.Serialize(FluxDeFichier, MaListeDeClasses) 'Fermeture du fichier FluxDeFichier.Close() End Sub End Module Public Class Classe Private _Variable As String Sub New() End Sub Sub New(ByVal Variable As String) _Variable = Variable End Sub Public Property Variable As String Get Return _Variable End Get Set(ByVal value As String) _Variable = value End Set End Property End Class

Sur le mme principe, le GetType s'effectue sur une List(Of Classe). Et le fichier XML rsultant a le mme schma qu'un tableau : Code : XML - Slectionner
1 <?xml version="1.0"?> 2 <ArrayOfClasse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 4 <Classe> 5 <Variable>Titanic</Variable> 6 </Classe> 7 <Classe>

8 9 10 11 12

<Variable>Avatar</Variable> </Classe> <Classe> <Variable>Twilight 1</Variable> </Classe> </ArrayOfClasse>

Il serait mme prfrable prsent d'utiliser des collections, qui sont plus modulaires et qui reprsentent mieux les concepts de la POO que des tableau (archaques) . En conclusion, la srialisation est vraiment trs pratique, une simple ligne pour sauvegarder tout un objet. Sur ce principe, une configuration peut aisment tre sauvegard dans un objet fait par vos soins recensant toutes les valeurs ncessaires au fonctionnement de votre programme puis une srialisation XML vous donnera un fichier clair et format, au mme titre qu'un fichier .ini. Mme si ce n'est pas son utilisation principale, a peut tre une bonne alternative. Rappelez vous toutefois que la srialisation XML n'enregistre pas les attributs privs ! Source d'erreur.

Pour combler cette lacune deux solutions : passer tout ses arguments en public, mais cette technique "tue" le principe de la POO ou alors utiliser des proprits. Les property. Si votre attribut est priv et que vous avez cr la property publique correspondante, il sera srialis. Le XML est donc un format gnrique et, il a t conu pour stocker des donnes. Lorsque nous aborderons le chapitre sur les bases de donnes, les premires notions se feront srement avec des documents XML, c'est une base de donne comme une autre ... Bref, n'allons pas trop vite, il nous reste a finir cette mchante partie d'orient objet avant d'attaquer ces autres concepts .

TP : ZBiblio, la bibliothque de films

Le cahier des charges


Comme dans chaque TP, je vais quand mme vous laisser faire a vous mme. Donc je vais vous donner un cahier des charges, et quelques informations. Tout cela pour but de vous guider et d'axer vos recherches et vos ides. Eh oui parce-que les TP qu'on commence attaquer sont d'une certaine envergure, vous allez vous confronter des problmes auxquels vous ne trouverez srement pas de solutions dans ce TP (tout dpend de la manire dont vous abordez la situation). Il va donc srement falloir (si vous tes un minimum courageux et que vous ne sautez pas directement la solution) que vous fassiez quelques recherches sur Google (je ne fais pas de pub ) ou alors la MSDN de Microsoft, une bibliothque recensant toutes les fonctions intgres au Framework (une

annexe ne tardera pas sortir la concernant). Sinon, si votre problme n'a aucune solution, vous pouvez toujours demander une petite aide sur le forum du SDZ, section "Autres langages" en prcdant le titre de votre topic par [VB.NET], a aide les distinguer. Bien bien, excusez moi, je m'gare, le cahier des charges donc. Ce TP pour but de vous faire dvelopper une bibliothque de films (vous pouvez bien sr transformer des films en musiques, images, ...). Je vais vous laisser libre court concernant le design, les mthodes de programmation. Je vous donne juste quelques lignes de guidage : Les films dans la bibliothque devront tre lists dans une liste avec possibilit d'ouvrir la fiche d'un film pour plus d'informations. La fiche d'un film contiendra des informations basiques : nom, acteurs, date de sortie, synopsis, tout ce que votre esprit pourra imaginer. La possibilit de crer, modifier et supprimer un film (autrement dit la fiche d'un film). Et pourquoi pas une fonction de recherche, dans de grandes collections de films.

Concernant la ralisation, je l'ai dj dit, je le rpte, vous faites comme vous voulez. Quelques conseils cependant : Un objet "Film" ou "FicheFilm" serait de rigueur pour contenir les informations d'une fiche film. Une collection pour contenir toutes vos fiches ne serait pas une mauvaise ide ? La srialisation pour stocker vos films (je dis a, je dis rien).

Alors bien videmment, comme pour les autres TP ne sautez pas directement la solution. Essayez de chercher un minimum. Ce TP n'a rien de compliqu en soi, il va juste falloir que vous trouviez la bonne mthode pour agir entre les films et la liste. Bref, une rflexion qui a du bon. Courage et l'attaque .

La correction.
Avant tout je tiens dire que la correction n'est pas universelle. Elle servira juste ceux qui n'ont absolument pas russi manipuler les objets et autres collection s'en tirer un minimum. Mais si vous n'avez rien compris ce TP et si vous n'avez pas t capable d'en raliser un bauche, je ne saurai que vous conseiller de recommencer la lecture de la partie sur la POO. Pour les autres, chaque situation tant diffrente je vais tcher de vous prsenter un programme aussi concis et universel que possible. Mon programme est compos de deux fentres. La premire regroupant les fonctions de

recherche, liste et visualisation d'une fiche. La seconde permettant la cration et modification d'une fiche. Je vais dj vous dtailler des deux fentres :

Fentre principale. Name : ZBiblio

Fentre d'ajout/modification. Name : AjoutEditionFilm

Voici mes deux fentres. Quelques contrles spcifiques. Un DateTimePicker pour la slection de la date et un NumericUpDown pour la slection de la note. Vous avez sans doutes remarqus les DropDownList pour les genres et le ralisateur. Elles sont l pour une fonctionnalit ultrieure qui permettra d'insrer les acteurs et genres dj remplis sur des films pour permettre un choix rapide. Mais en attendant on peut s'en servir comme de simples TextBox en utilisant la proprit Text. Je vous demanderai de vous passer de moqueries sur mes interfaces l'me d'un designer . Bien bien, passons aux feuilles de code. La classe Film , je n'ai jamais eu

Code : VB.NET - Slectionner


1 Public Class Film 2 3 Private _Nom As String 4 Public Property Nom As String 5 Get 6 Return _Nom 7 End Get 8 Set(ByVal value As String) 9 _Nom = value 10 End Set 11 End Property 12 13 Private _DateSortie As Date 14 Public Property DateSortie As Date 15 Get 16 Return _DateSortie 17 End Get 18 Set(ByVal value As Date) 19 _DateSortie = value 20 End Set 21 End Property 22 23 Private _Realisateur As String 24 Public Property Realisateur As String 25 Get 26 Return _Realisateur 27 End Get 28 Set(ByVal value As String) 29 _Realisateur = value 30 End Set 31 End Property 32 33 Private _Genre1 As String 34 Public Property Genre1 As String 35 Get 36 Return _Genre1 37 End Get 38 Set(ByVal value As String) 39 _Genre1 = value 40 End Set 41 End Property 42 43 Private _Genre2 As String 44 Public Property Genre2 As String 45 Get 46 Return _Genre2 47 End Get 48 Set(ByVal value As String) 49 _Genre2 = value 50 End Set 51 End Property 52 53 Private _Acteurs As String 54 Public Property Acteurs As String 55 Get 56 Return _Acteurs 57 End Get

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

Set(ByVal value As String) _Acteurs = value End Set End Property Private _Synopsis As String Public Property Synopsis As String Get Return _Synopsis End Get Set(ByVal value As String) _Synopsis = value End Set End Property Private _RemarquePerso As String Public Property RemarquePerso As String Get Return _RemarquePerso End Get Set(ByVal value As String) _RemarquePerso = value End Set End Property Private _NotePerso As Integer Public Property NotePerso As Integer Get Return _NotePerso End Get Set(ByVal value As Integer) _NotePerso = value End Set End Property Public Sub New() End Sub Public Sub New(ByVal Nom As String, ByVal DateSortie As Date, ByVal Realisateur As String, ByVal Genre1 As String, ByVal Genre2 As String, ByVal Acteurs As String, ByVal Synopsis As String, ByVal RemarquePerso As String, ByVal NotePerso As Integer) _Nom = Nom _DateSortie = DateSortie _Realisateur = Realisateur _Genre1 = Genre1 _Genre2 = Genre2 _Acteurs = Acteurs _Synopsis = Synopsis _RemarquePerso = RemarquePerso _NotePerso = NotePerso End Sub Public Sub Update(ByVal Nom As String, ByVal DateSortie As Date, ByVal Realisateur As String, ByVal Genre1 As String, ByVal Genre2 As String, ByVal Acteurs As String, ByVal Synopsis As String, ByVal RemarquePerso As String, ByVal NotePerso As Integer) _Nom = Nom _DateSortie = DateSortie _Realisateur = Realisateur

119 120 121 122 123 124 125 126

_Genre1 = Genre1 _Genre2 = Genre2 _Acteurs = Acteurs _Synopsis = Synopsis _RemarquePerso = RemarquePerso _NotePerso = NotePerso End Sub 'Je surcharge le Tostring Public Overrides Function ToString() As String Return _Nom End Function End Class

Beaucoup de lignes pour ce qui concerne les proprits. Mais c'est un passage oblig

Le constructeur a deux signatures (une signature tant une faon de l'appeler) grce une surcharge. Une avec arguments, l'autre sans. Une mthode Update permettant la Mise jour en une ligne de tous les attributs de la fiche. Et finalement une surcharge de ToString spcifiant qu'il faut retourner le nom du film lorsque j'utiliserai cette fonction. La fentre principale : ZBiblio

Code : VB.NET - Slectionner


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Imports System.Xml.Serialization Imports System.IO Public Class ZBiblio Private _FenetreAjout As AjoutEditionFilm Private _FilmEnVisualisation As Film Private _ListeFilms As List(Of Film) Public Property ListeFilms As List(Of Film) Get Return _ListeFilms End Get Set(ByVal value As List(Of Film)) _ListeFilms = value End Set End Property Private Sub ListeFilms_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Instancie une nouvelle liste _ListeFilms = New List(Of Film) 'Rcupre les infos Deserialisation()

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

'MAJ la liste de films UpdateListe() End Sub Private Sub ListeFilms_FormClosing(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing 'Srialise les films lors de la fermeture Serialisation() End Sub Private Sub LB_LISTE_FILMS_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LB_LISTE_FILMS.SelectedIndexChanged 'On vrifie qu'on a slectionn quelquechose If Not Me.LB_LISTE_FILMS.SelectedItem Is Nothing Then 'Retrouve le film avec ce nom For Each FilmALister As Film In _ListeFilms If FilmALister.Nom = LB_LISTE_FILMS.SelectedItem.ToString Then 'L'insre dans une variable globale Me._FilmEnVisualisation = FilmALister End If Next 'On MAJ les infos de la fiche Me.LBL_TITRE.Text = Me._FilmEnVisualisation.Nom Me.LBL_DATE_SORTIE.Text = Me._FilmEnVisualisation.DateSortie.ToShortDateString 'La date seule Me.LBL_GENRE1.Text = Me._FilmEnVisualisation.Genre1 Me.LBL_GENRE2.Text = Me._FilmEnVisualisation.Genre2 Me.LBL_REALISATEUR.Text = Me._FilmEnVisualisation.Realisateur Me.LBL_ACTEURS.Text = Me._FilmEnVisualisation.Acteurs Me.LBL_SYNOPSIS.Text = Me._FilmEnVisualisation.Synopsis Me.LBL_AVIS_PERSONNEL.Text = Me._FilmEnVisualisation.RemarquePerso Me.LBL_NOTE.Text = Me._FilmEnVisualisation.NotePerso End If End Sub Public Sub UpdateListe() 'On vide la liste et on la reremplit Me.LB_LISTE_FILMS.Items.Clear() 'Parcours les films de la bibliotheque For Each FilmALister As Film In _ListeFilms 'Remplit la liste en se basant sur le nom (vu que j'ai surcharg tostring) 'A le mme effet que FilmALister.Nom sans la surcharge. Me.LB_LISTE_FILMS.Items.Add(FilmALister) Next End Sub #Region "Boutons modif fiche" Private Sub BT_SUPPRIMER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SUPPRIMER.Click

88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148

'Confirmation If MsgBox("Etes vous certain de vouloir supprimer ce film ?", vbYesNo, "Confirmation") Then 'On le retire de la liste Me._ListeFilms.Remove(_FilmEnVisualisation) End If 'MAJ UpdateListe() End Sub Private Sub BT_NOUVELLE_FICHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_NOUVELLE_FICHE.Click 'Si nouveau film, on passe nothing _FenetreAjout = New AjoutEditionFilm(Nothing) _FenetreAjout.Show() End Sub Private Sub BT_MAJ_FICHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_MAJ_FICHE.Click 'Si une maj on passe le paramtre du film actuel _FenetreAjout = New AjoutEditionFilm(_FilmEnVisualisation) _FenetreAjout.Show() End Sub #End Region #Region "Sauvegarde et rcupration" Private Sub Deserialisation() If File.Exists("BibliothequeFilm.xml") Then 'On ouvre le fichier et recupere son flux Dim FluxDeFichier As Stream = File.OpenRead("BibliothequeFilm.xml") Dim Deserialiseur As New XmlSerializer(GetType(List(Of Film))) 'Dsrialisation et convertion de ce qu'on rcupre dans le type "Film" _ListeFilms = Deserialiseur.Deserialize(FluxDeFichier) 'Fermeture du flux FluxDeFichier.Close() End If End Sub Private Sub Serialisation() 'On cre le fichier et rcupre son flux Dim FluxDeFichier As FileStream = File.Create("BibliothequeFilm.xml") Dim Serialiseur As New XmlSerializer(GetType(List(Of Film))) 'Serialisation et criture Serialiseur.Serialize(FluxDeFichier, _ListeFilms) 'Fermeture du fichier FluxDeFichier.Close() End Sub #End Region #Region "Section recherche" Private Sub RemplissageChampsRecherche()

149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192

'Fonction utilise plus tard pour pr-replir les DDL de genres / ralisteurs ... End Sub Private Sub BT_RECHERCHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_RECHERCHE.Click Recherche() End Sub Private Sub BT_EFFACER_RECHERCHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_EFFACER_RECHERCHE.Click Me.TXT_TITRE.Text = "" Me.DDL_ACTEUR.Text = "" Me.DDL_ANNEE.Text = "" Me.DDL_GENRE.Text = "" Me.DDL_REALISATEUR.Text = "" UpdateListe() End Sub Private Sub Recherche() 'On vide la liste et on la reremplit Me.LB_LISTE_FILMS.Items.Clear() 'Parcours les films de la bibliotheque For Each FilmALister As Film In _ListeFilms If Me.TXT_TITRE.Text <> "" Then If FilmALister.Nom.Contains(Me.TXT_TITRE.Text) Then Me.LB_LISTE_FILMS.Items.Add(FilmALister) End If End If If Me.DDL_ACTEUR.Text <> "" Then If FilmALister.Acteurs.Contains(Me.DDL_ACTEUR.Text) Then Me.LB_LISTE_FILMS.Items.Add(FilmALister) End If End If If Me.DDL_ANNEE.Text <> "" Then If CDate(FilmALister.DateSortie).Year = Me.DDL_ANNEE.Text Then Me.LB_LISTE_FILMS.Items.Add(FilmALister) End If End If If Me.DDL_GENRE.Text <> "" Then If FilmALister.Genre1.Contains(Me.DDL_GENRE.Text) Or FilmALister.Genre2.Contains(Me.DDL_GENRE.Text) Then Me.LB_LISTE_FILMS.Items.Add(FilmALister) End If End If If Me.DDL_REALISATEUR.Text <> "" Then If FilmALister.Realisateur.Contains(Me.DDL_REALISATEUR.Text) Then Me.LB_LISTE_FILMS.Items.Add(FilmALister) End If End If

Next End Sub #End Region End Class

Cette fentre contient les fonctions de srialisation et dsrialisation. En ce qui concerne la srialisation elle s'effectue automatiquement lors de la fermeture de la fentre (autrement dit du programme). La dsrialisation quand elle, se lance au dmarrage du programme en vrifiant bien videmment la prsence du fichier xml. Une proprit permettant de modifier la variable _ListeFilms est publique de faon pouvoir l'appeler depuis l'autre fentre. Il en va de mme pour la mthode Update. Pour le reste, je pense que mes commentaires sont assez explicites Fentre d'ajout et de modification. .

Code : VB.NET - Slectionner


Public Class AjoutEditionFilm 1 Private _FilmAModifier As Film 2 Sub New(ByVal FilmAModifier As Film) 3 4 5 6 7 8 'Recupere le film modifier _FilmAModifier = FilmAModifier End Sub ' Cet appel est requis par le concepteur. InitializeComponent() ' Ajoutez une initialisation quelconque aprs l'appel InitializeComponent().

9 Private Sub AjoutEditionFilm_Load(ByVal sender As System.Object, 1 ByVal e As System.EventArgs) Handles MyBase.Load 0 1 If _FilmAModifier Is Nothing Then 1 'S'il ne contient rien, on en cre un nouveau 1 Else 2 'Sinon on recupre les infos et on les entre dans les cases 1 correspondantes 3 Me.TXT_ACTEURS.Text = _FilmAModifier.Acteurs 1 Me.TXT_AVIS_PERSONNEL.Text = _FilmAModifier.RemarquePerso 4 Me.TXT_NOM.Text = _FilmAModifier.Nom 1 Me.TXT_SYNOPSIS.Text = _FilmAModifier.Synopsis 5 Me.DDL_GENRE1.Text = _FilmAModifier.Genre1 1 Me.DDL_GENRE2.Text = _FilmAModifier.Genre2 6 Me.DDL_REALISATEUR.Text = _FilmAModifier.Realisateur 1 Me.NUM_NOTE.Value = _FilmAModifier.NotePerso

7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7

Me.DT_DATE_SORTIE.Value = _FilmAModifier.DateSortie End If End Sub Private Sub BT_SAVE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_SAVE.Click If _FilmAModifier Is Nothing Then 'Enregistre notre film Dim MonFilm As New Film(Me.TXT_NOM.Text, Me.DT_DATE_SORTIE.Value, Me.DDL_REALISATEUR.Text, Me.DDL_GENRE1.Text, Me.DDL_GENRE2.Text, Me.TXT_ACTEURS.Text, Me.TXT_SYNOPSIS.Text, Me.TXT_AVIS_PERSONNEL.Text, Me.NUM_NOTE.Value) 'On l'ajoute la liste ZBiblio.ListeFilms.Add(MonFilm) MsgBox("Fiche correctement cre", vbOKOnly, "Confirmation") Else 'Sinon on le modifie en rcuprant son index dans la liste de la fentre parent ZBiblio.ListeFilms(ZBiblio.ListeFilms.IndexOf(_FilmAModifier)).Update(Me. TXT_NOM.Text, Me.DT_DATE_SORTIE.Value, Me.DDL_REALISATEUR.Text, Me.DDL_GENRE1.Text, Me.DDL_GENRE2.Text, Me.TXT_ACTEURS.Text, Me.TXT_SYNOPSIS.Text, Me.TXT_AVIS_PERSONNEL.Text, Me.NUM_NOTE.Value) End If 'MAJ de la liste dans la fentre parent ZBiblio.UpdateListe() 'Ferme la fentre d'dition Me.Close() End Sub Private Sub IMG_AFFICHE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IMG_AFFICHE.Click 'Ultrieur ; possibilit d'ajouter une fiche. End Sub End Class

4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9

J'ai ajout manuellement le constructeur de cette fentre. Lorsque vous crez le constructeur, automatiquement il ajoute : Code : VB.NET - Slectionner
1 2 3 4 ' Cet appel est requis par le concepteur. InitializeComponent() ' Ajoutez une initialisation quelconque aprs l'appel InitializeComponent().

Il ne faut surtout pas effacer, c'est ce qui initialise les lments graphiques. Ajoutez ce que vous voulez aprs. Personnellement j'ai demand un argument au constructeur, cet argument tant le film modifier. Si c'est nothing qui est pass, cela signifie que c'est une nouvelle fiche qu'il faut crer. Pour le reste, mme remarque : les commentaires doivent tre assez clairs mon avis. Si un problme vient vous bloquer, n'hsitez pas laisser un commentaire sur ce chapitre dtaillant votre problme.

Amliorations possibles
Concernant les amlioration possibles, je pense qu'il y a vraiment possibilit de faire voluer ce petit logiciel jusqu' le rendre agrable l'utilisation.

Ajout d'une affiche de film. Cette affiche pourrait tre sauvegarde dans un dossier les regroupant toutes. Remplir mes DDL, ajouter autant d'lments que de possibilits. Par exemple, pour les genres. Faites une recherche sur tous les genres de tous les films et crer une fonction permettant de les distinguer afin de garder des genre distincts, pas de double. Ce n'est qu'une ide . Amliorer un peu l'interface, faire pourquoi pas un systme d'onglets, une image de fond, etc.

Cette liste n'est videmment pas exhaustive, elle ne dpend que de votre imagination. Je prvois cependant d'amliorer ce TP lors de la partie concernant les bases de donnes et une troisime version la fin du tutoriel complet.

Das könnte Ihnen auch gefallen