0/5 (2 avis)
Vue 10 005 fois - Téléchargée 1 117 fois
Imports System.Windows.Forms.Application 'pour DoEvents() Public Class Form1 Structure Fiche Dim Nom As String Dim Prénom As String Dim Age As Integer Dim Dép As Integer Dim Ville As String Public Sub New(ByVal n As String, ByVal p As String, ByVal a As Integer, ByVal d As Integer, ByVal v As String) Me.Nom = n Me.Prénom = p Me.Age = a Me.Dép = d Me.Ville = v End Sub 'constructeur d'une nouvelle fiche End Structure 'fiche d'ID pour les essais, avec constructeur NEW 'variables globales Dim LF As New List(Of Fiche) 'liste des Fiches à classer Dim LFT As New List(Of Fiche) 'liste des Fiches triées ou filtrées (qui seront affichées) 'boutons : Private Sub ButtonNoms_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNoms.Click 'tri par nom RecopieListeLF() LFT.Sort(AddressOf CompareNoms) ActualiseListBox() End Sub 'tri de la liste LFT par nom Private Sub ButtonPrénoms_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonPrénoms.Click 'tri par prénom RecopieListeLF() LFT.Sort(AddressOf ComparePrénoms) ActualiseListBox() End Sub 'tri de la liste LFT par prénom Private Sub ButtonAges_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAges.Click 'tri par age RecopieListeLF() LFT.Sort(AddressOf CompareAges) ActualiseListBox() End Sub 'tri de la liste LFT par age Private Sub ButtonVilles_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonVilles.Click 'tri par ville RecopieListeLF() LFT.Sort(AddressOf CompareVilles) ActualiseListBox() End Sub 'tri de la liste LFT par ville Private Sub ButtonDepartements_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDepartements.Click 'tri par département RecopieListeLF() LFT.Sort(AddressOf CompareDépartements) ActualiseListBox() End Sub 'tri de la liste LFT par département Private Sub ButtonFiltre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonFiltre.Click 'filtrer la liste en ne gardant que les départements de Bourgogne (21,71,89,58) LFT.Clear() LFT = LF.FindAll(AddressOf FiltreBourgogne) 'ne garde que les éléments qui conviennent ActualiseListBox() End Sub 'filtrer la liste en ne gardant que les départements de Bourgogne (21,71,89,58) 'fonctions : Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'initialisation des fiches et des listes : Dim f, g, h, i, j As Fiche 'on pourrait écrire LF.Add(New Fiche("Térieur", "Alex", 21, 71, "Chalon")) mais cela risque d'entrainer 'des fuites de mémoire...car il semble que la mémoire de la nouvelle fiche ne soit pas libérée si NEW est 'un paramètre d'une fonction f = New Fiche("Térieur", "Alex", 21, 71, "Chalon") LF.Add(f) g = New Fiche("Térieur", "Alain", 22, 25, "Besançon") LF.Add(g) h = New Fiche("Enfaillite", "Mélusine", 58, 89, "Sens") LF.Add(h) i = New Fiche("Marollex", "Eléonore", 15, 75, "Paris") LF.Add(i) j = New Fiche("Fonfec", "Sophie", 48, 39, "Saint-Claude") LF.Add(j) RecopieListeLF() ' recopie dans LFT ActualiseListBox() 'au début, la liste LFT n'est pas triée...elle est identique à LF End Sub Private Sub RecopieListeLF() 'recopie la liste LF dans la liste LFT Dim i As Integer LFT.Clear() For i = 0 To LF.Count - 1 LFT.Add(LF(i)) Next End Sub Private Sub ActualiseListBox() 'permet l'affichage de la liste LFT Dim i As Integer ListBoxFiches.Items.Clear() For i = 0 To LFT.Count - 1 ListBoxFiches.Items.Add(LFT(i).Prénom & ", " & _ LFT(i).Nom & ", " & _ CStr(LFT(i).Age) & " ans, " & _ LFT(i).Ville & ", " & _ CStr(LFT(i).Dép)) Next ListBoxFiches.Refresh() DoEvents() End Sub 'permet de rafraichir l'affichage de la liste LFT dans le ListBox Private Function CompareNoms(ByVal f As Fiche, ByVal g As Fiche) As Integer 'retour : 0 si chaines égales ' : -1 si f.nom < g.nom ' : +1 si f.nom > g.nom Return String.Compare(f.Nom, g.Nom) End Function Private Function ComparePrénoms(ByVal f As Fiche, ByVal g As Fiche) As Integer ' mêmes conditions de retour Return String.Compare(f.Prénom, g.Prénom) End Function Private Function CompareVilles(ByVal f As Fiche, ByVal g As Fiche) As Integer ' mêmes conditions de retour Return String.Compare(f.Ville, g.Ville) End Function Private Function CompareAges(ByVal f As Fiche, ByVal g As Fiche) As Integer 'retour : 0 si ages égaux ' : -1 si f.age < g.age ' : +1 si f.age > g.age Return IIf(f.Age = g.Age, 0, IIf(f.Age < g.Age, -1, 1)) End Function Private Function CompareDépartements(ByVal f As Fiche, ByVal g As Fiche) As Integer Return IIf(f.Dép = g.Dép, 0, IIf(f.Dép < g.Dép, -1, 1)) End Function Private Function FiltreBourgogne(ByVal f As Fiche) As Boolean If f.Dép = 21 Or f.Dép = 71 Or f.Dép = 58 Or f.Dép = 89 Then Return True 'à garder Else Return False 'à laisser End If End Function End Class
10 févr. 2011 à 17:05
Ne serai-t'il pas plus simpl d'utiliser le Linq pour trier les listes ??
Je fais cela, en C#, et le tri se fait de façon assez simple avec les requètes Linq.
A plus
13 août 2010 à 17:01
Ce n'est pas pour les si novices que çà!
En tout cas, code très utile et très bien structuré, compréhensible malgré que je ne sois pas très familier du VB 2008 (je suis resté au bon vieux VB6...)
Cdt
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.