Boucle sur 2 listBox

Résolu
cs_Le Pivert Messages postés 7823 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 30 septembre 2022 - 23 juil. 2013 à 11:08
cs_Le Pivert Messages postés 7823 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 30 septembre 2022 - 25 juil. 2013 à 08:25
Bonjour,

J'ai fait une boucle qui parcourt 2 litBox pour afficher les items ayant une différence dans une 3ème listBox. Cela fonctionne très bien. Mais peut-on affiner la recherche pour qu'elle ne m'affiche que l'item ayant la plus grande différence.

[code=vb]
For i = lsttaille.Items.Count - 1 To 0 Step -1
If Not lsttaillecopy.Items.Contains(lsttaille.Items(i)) Then
'MessageBox.Show("Item trouvé")
Dim TempStr As String
TempStr = CStr(lsttaille.Items.Item(i))
lstresult.Items.Add(TempStr)
lsttaille.SetSelected(i, True)
Else
' MessageBox.Show("Item non trouvé")
End If
Next i/code

Merci d'avance

@+ Le Pivert

14 réponses

Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
23 juil. 2013 à 13:35
Bonjour Le Pivert.

Je vous propose la solution suivante. Vous stockez le premier item qui apparaît dans une variable (soit Dif son nom). À chaque item qui suit, vous le comparez à Dif, et vous remplacez Dif par cet item s'il est strictement supérieur à Dif.
En fin de boucle, il ne vous reste plus qu'à récolter Dif.

Cordialement.

Étant illettré, je signe d'une croix : ×
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
23 juil. 2013 à 14:55
Bonjour, Zermeloi,
oui, mais pas seulement.
- Une listbox contient du texte (string)
- j'ai bien vu (bien qu'il n'en parle point) que la comparaison était faite sur des "nombres" (le cstr utilisé).
- or, "110" est par exemple plus petit que "21" alors que 110 est plus grand que 21
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
cs_Le Pivert Messages postés 7823 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 30 septembre 2022 134
25 juil. 2013 à 08:25
J'ai enfin réussi, pour le cas particulier qui me préoccupait. Vous m'avez bien mis sur la voie. Je cherchais la plus grande différence et c'était simple finalement:

[code=vb] 'vérifier les fichiers cachés
For i = lsttaille.Items.Count - 1 To 0 Step -1
If Not lsttaillecopy.Items.Contains(lsttaille.Items(i)) Then
'MessageBox.Show("Item trouvé")
Dim dif As Long
Dim TempStr As Long
TempStr = CLng(lsttaille.Items.Item(i))
Dim item As Long
item = CLng(lsttaillecopy.Items.Item(i))
dif = TempStr - item
If dif > 60 Then 'à modifier si necessaire
lstresult.Items.Add(TempStr)
End If
Else
'MessageBox.Show("Item non trouvé")
End If
Next i/code

Je vais pouvoir faire une mise à jour de mon programme:

http://www.vbfrance.com/codes/DETECTER-FICHIERS-CACHES_55265.aspx

Merci à vous 2

@+ Le Pivert
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
23 juil. 2013 à 14:36
Bonjour,
l'item ayant la plus grande différence.

nécessite une explication parfaitement claire sur la manière d'apprécier la valeur de la "différence".


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
23 juil. 2013 à 14:40
Bonjour ucfoutu.

Tu as parfaitement raison. Cela n'a de sens que pour les valeurs absolues des items.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
cs_Le Pivert Messages postés 7823 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 30 septembre 2022 134
23 juil. 2013 à 15:12
Merci à tous les 2 pour vos réponses

ucfoutu, la différence on ne la connait pas. C'est la plus grande différence entre 2 items se trouvant sur le même index dans les 2 listBox

zermelo, jai suivi ton conseil, cela réduit la liste, mais je ne dois pas avoit fait ma boucle correctement car il ne devrait me rester q'un item

[code=vb] For i = lsttaille.Items.Count - 1 To 0 Step -1
If Not lsttaillecopy.Items.Contains(lsttaille.Items(i)) Then
'MessageBox.Show("Item trouvé")
Dim TempStr As String
Dim item As String
TempStr = CStr(lsttaille.Items.Item(i))
If item < TempStr Then
lstresult.Items.Add(TempStr)
End If
item = TempStr
lsttaille.SetSelected(i, True)
Else
' MessageBox.Show("Item non trouvé")
End If
Next i/code
If item < TempStr Then
item est souligné car pas de valeur, comment faire pour le garder en mémoire pour la prochaine boucle?

Encore merci

@+ Le Pivert
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 235
23 juil. 2013 à 15:24
Bonjour, Le Pivert,
ucfoutu, la différence on ne la connait pas

Et ?
Ca, c'était évident ! Et ça ne me dit toujours pas comment elle est appréciée !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_Le Pivert Messages postés 7823 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 30 septembre 2022 134
23 juil. 2013 à 15:36
La boucle fonctionne très bien si tous les items sont égaux, elle me renvoie les items inégaux. C'est là le problème je ne veux conserver que l'item le plus grand des 2 items situés sur la même ligne ayant la plus forte différence.

- or, "110" est par exemple plus petit que "21" alors que 110 est plus grand que 21

suivant cela, je pense que ça va poser problème!

@+ Le Pivert
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
23 juil. 2013 à 16:34
Les items des ListeBox doivent être préalablement convertis en nombres, par exemple par CLng. Par ailleurs le item qui est dans la boucle (et qui devra donc être aussi un nombre) doit être défini hors de la boucle, par une déclaration du genre
[code=vb]Private Item As Long = 0/code

Bon courage.


Étant illettré, je signe d'une croix : ×
0
cs_Le Pivert Messages postés 7823 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 30 septembre 2022 134
23 juil. 2013 à 17:18
Merci zermelo,

Cela fonctionne. Pour n'avoir que le dernier item, il faut nettoyer la listBox à chaque passage. Maintenant suivant les conseils de ucfoutu, je vais vérifier si c'est bien le bon item!

voici le code:

[code=vb]Dim item As Long = 0
For i = lsttaille.Items.Count - 1 To 0 Step -1
If Not lsttaillecopy.Items.Contains(lsttaille.Items(i)) Then
'MessageBox.Show("Item trouvé")
Dim TempStr As Long
TempStr = CLng(lsttaille.Items.Item(i))
If item < CLng(TempStr) Then
lstresult.Items.Clear()
lstresult.Items.Add(TempStr)
End If
item = CLng(TempStr)
lsttaille.SetSelected(i, True)
Else
' MessageBox.Show("Item non trouvé")
End If
Next i/code

Vous avez certainement deviné que c'était pour ma dernière source, afin d'éviter de faire une recherche manuelle.

Merci à tous les 2


@+ Le Pivert
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
23 juil. 2013 à 17:38
Bonsoir Le Pivert.
Voici un petit programme qui pourra peut-être vous aider.
[code=vb]Imports System.Math
Public Class Accueil
Private Item As Double = 0

Private Sub Accueil_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
lBox1.Items.Add(127.5)
lBox1.Items.Add(22.7)
lBox1.Items.Add(61.05)
lBox2.Items.Add(187.6)
lBox2.Items.Add(322.8)
lBox2.Items.Add(21.05)
End Sub

Private Sub bClc_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bClc.Click
CalculerDifférenceMax()
End Sub

Private Sub CalculerDifférenceMax()
Dim Item1 As Double, Item2 As Double, Diff As Double, i As Integer
For i = 0 To 2
Item1 = CDbl(lBox1.Items(i))
Item2 = CDbl(lBox2.Items(i))
Diff = Abs(Item1 - Item2)
If i = 0 Then
Item = Diff
Else
If Diff > Item Then Item = Diff
End If
Next
MessageBox.Show("La différence maximale est " & Item.ToString)
End Sub

End Class/code

lBox1 et lBox2 sont des ListBox et bClc est un bouton de commande.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
cs_Le Pivert Messages postés 7823 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 30 septembre 2022 134
23 juil. 2013 à 18:11
Merci Zermelo, cela fonctionne, mais ne me donne pas l'index de l'item. J'ai fait des essais avec mon code, cela ne me sort pas l'item concerné.
Ce n'est pas grave, je vais continer à chercher.
Merci à vous 2.
Bonne soirée


@+ Le Pivert
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
23 juil. 2013 à 18:58
Juste une petite modification.
[code=vb]Private Sub CalculerDifférenceMax()
Dim Item1 As Double, Item2 As Double, Diff As Double, i As Integer, Index As Integer
For i = 0 To 2
Item1 = CDbl(lBox1.Items(i))
Item2 = CDbl(lBox2.Items(i))
Diff = Abs(Item1 - Item2)
If i = 0 Then
Item Diff : Index i
Else
If Diff > Item Then Item Diff : Index i
End If
Next
MessageBox.Show("La différence maximale est " & Item.ToString)
MessageBox.Show("L'index de la différence maximale est " & Index.ToString)
End Sub/code


Étant illettré, je signe d'une croix : ×
0
cs_Le Pivert Messages postés 7823 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 30 septembre 2022 134
23 juil. 2013 à 19:20
Merci Zermelo, ça fonctionne impeccable.

@+ Le Pivert
0