Trier croissant listbox [Résolu]

liliesma 69 Messages postés mercredi 5 janvier 2005Date d'inscription 15 septembre 2005 Dernière intervention - 5 janv. 2005 à 19:34 - Dernière réponse : Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention
- 17 juin 2005 à 16:38
Je débute seulement dans la programmation (je suis en 1ère année de BTS IG) et j'ai un TP de VB à faire, mais je n'arrive pas a faire un tri croissant dans une listbox de nombres choisis aléatoirement. Merci de m'aider...
Lilie
Afficher la suite 

14 réponses

Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 janv. 2005 à 00:07
+3
Utile
si je récapitule, il y a 3 ListBox et 2 boutons, la première ListBox n'est pas triée donc les nombres aléatoires apparaissent dans le désordre, ensuite en appuyant sur le premier bouton les nombres apparaissent en ordre décroissant dans la deuxième ListBox et si on appuie sur le deuxième bouton ils apparaissent en ordre croissant dans le troisième ListBox.
ici les nombres sont en doubles, les propriétés Sorted sont à False, aucune table n'est utilisée, le tri se fait par insertion directe dans la ListBox réceptrice

Private Sub Form_Load()
Dim i As Integer
Dim x As Double
For i = 1 To 100
x = Rnd * 15
List1.AddItem x
Next
End Sub


Private Sub Command1_Click()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim x As Double
List2.Clear
List2.AddItem List1.List(0)
For i = 1 To List1.ListCount - 1
x = List1.List(i)
For j = 0 To List2.ListCount - 1
If x > List2.List(j) Then
x = List2.List(List2.ListCount - 1)
For k = List2.ListCount - 1 To j + 1 Step -1
List2.List(k) = List2.List(k - 1)
Next
List2.List(j) = List1.List(i)
Exit For
End If
Next
List2.AddItem x
' DoEvents
Next
End Sub


Private Sub Command2_Click()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim x As Double
List3.Clear
List3.AddItem List1.List(0)
For i = 1 To List1.ListCount - 1
x = List1.List(i)
For j = 0 To List3.ListCount - 1
If x < List3.List(j) Then
x = List3.List(List3.ListCount - 1)
For k = List3.ListCount - 1 To j + 1 Step -1
List3.List(k) = List3.List(k - 1)
Next
List3.List(j) = List1.List(i)
Exit For
End If
Next
List3.AddItem x
' DoEvents
Next

End Sub

Daniel
Cette réponse vous a-t-elle aidé ?  
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 janv. 2005 à 19:38
0
Utile
et en mettant la propriété Sorted à True ?

Daniel
liliesma 69 Messages postés mercredi 5 janvier 2005Date d'inscription 15 septembre 2005 Dernière intervention - 5 janv. 2005 à 19:42
0
Utile
en fait mon TP se décompose en 3 colonnes, dans la 1ère les nombres sont rentrés aléatoirement avec la fonction rnd, la 2ème le tri se fait décroissant à l'aide d'un bouton de commande et la 3ème le tri est croissant également à l'aide d'un bouton de commande...
mais la propriété Sorted ne se fait elle pas que dans une seule colonne?
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 janv. 2005 à 19:53
0
Utile
je crois bien que si
mais est ce que t'as déjà fait les tris dans les autres colonnes ?
et comment as tu fait ta ListBox multi colonnes ?
est tu obligé d'utiliser une ListBox ou peut tu prendre une ListView ?

Daniel
liliesma 69 Messages postés mercredi 5 janvier 2005Date d'inscription 15 septembre 2005 Dernière intervention - 5 janv. 2005 à 19:59
0
Utile
on a vu que les listbox... j'ai créé 3 listboxles 2 listbox de tri sont vide, j'ai juste ma 1ère listbox qui est rempli avec ces fameux nombre aléatoire...
pour ce qui est de la propriété sorted, elle ne marche pa dans mon cas, car elle ne me trie que le premier chiffre ex :
15.568
24.56
5.169
51.27
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 janv. 2005 à 20:06
0
Utile
est ce que tu peux rajouter un nombre d'espaces ou de zéros devant chaque chiffre de façon à avoir le même nombre de caractères avant le point décimal.
ça dépend de ce que ton TP impose

Daniel
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 janv. 2005 à 20:19
0
Utile
je vois quelque chose comme çà:

Dim i As Integer
Dim x As Single

For i = 1 To 100
x = Rnd * 9999
List1.AddItem Format$(x, "0000.000")
Next

ou comme çà;

For i = 1 To 100
x = Rnd * 9999
List1.AddItem Space$(5 - Len(Str$(Int(x)))) & x
Next

Daniel
cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention - 5 janv. 2005 à 20:30
0
Utile
Salut,

La propriété sorted d'une listbox trie du texte et non des chiffres, donc dans ton exemple, c'est bien trié vu par la listbox.
Le mieux est de trier avant d'inscrire dans la listbox..
Par ex, ranger tes valeurs aléatoires dans un tableau numérique que tu trieras avant de remplir la liste.

Cordialement, CanisLupus
liliesma 69 Messages postés mercredi 5 janvier 2005Date d'inscription 15 septembre 2005 Dernière intervention - 5 janv. 2005 à 20:43
0
Utile
Gobillot : ta première solution me semble faisable, mais pourquoi multiplie tu 9999 ? et puis le pb de réglé le format, c'est qu'il n'y a pa de format, il peut aussi bien y avoir 2 chiffres après la virgule que 5 ou 7...

CanisLupus : ta solution ne peut pas m'aidé, car il faut que dans ma première liste apparaisse les nombres dans le déosrdre...

je sais tout ça n'est pas très clair... masi je vous remercie de tenter de m'aider malgré tout ..
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 janv. 2005 à 21:00
0
Utile
j'ai pris 9999 pour exemple mais tu peux mettre ce que tu veux
avec Rnd tu peux pas avoir plus de 7 décimales mais ça dépend aussi par quoi tu multiplie.
Rnd*9999 ne dépassera jamais 9999 donc 4 chiffres devant suffisent

pour supprimer les zéros inutiles derrière:
List1.AddItem Format$(x, "0000.#######")

Daniel
cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention - 5 janv. 2005 à 21:18
0
Utile
Si tes valeurs sont de type double, essaies ça :

Private Sub Command1_Click()
Dim tmp As String
Dim a As Integer
Dim b As Integer


For a = 0 To List1.ListCount - 2
For b = a + 1 To List1.ListCount - 1
If CDbl(List1.List(b)) < CDbl(List1.List(a)) Then
tmp = List1.List(a)
List1.List(a) = List1.List(b)
List1.List(b) = tmp
End If
Next
Next


End Sub

Comme ça, tu afficheras tes valeurs dans le désordre et elles ne seront triées que sur le clic du bouton.

Cordialement, CanisLupus
sakapatate 35 Messages postés lundi 13 décembre 2004Date d'inscription 19 avril 2005 Dernière intervention - 6 janv. 2005 à 11:22
0
Utile
lulu

moi je pense ke le mieu c de mettre tes valeurs ds un tableau et de les trier!
une fois ke tas fait le tri tu les affiches dans la listbox!

l'avantage c ke tu utilises une procédure de tri! ensuite pour l'affichage c tout simple: tu affiche ton tableau soit dans un sens soit dans l'autre (tu utilises qu'une seule fois la procédure de tri!!!)
liliesma 69 Messages postés mercredi 5 janvier 2005Date d'inscription 15 septembre 2005 Dernière intervention - 6 janv. 2005 à 13:14
0
Utile
Je vous remercie pour toutes vos réponses, elles m'ont beaucoup aidées pi j'ai appris des trucs aussi

tcho @ bientot ...

Lilie
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 17 juin 2005 à 16:38
0
Utile
merci lilie

Daniel

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.