OVH Cloud OVH Cloud

synchroniser 2 listbox

16 réponses
Avatar
F. David
Bonjour,

J'ai dans mon appli une listbox et je souhaiterais que l'utilisateur
puisse trier son contenu si nécessaire à l'aide d'un checkbox.
Le problème c'est la propriété "sorted" de la listbox qui est en lecture
seule donc j'avais pensé me servir de deux listbox qui auraient en
permanence un contenu identique, puis de les rendre visible ou non
suivant la position du checkbox.
Est-ce une bonne solution ?

Admettons que oui ;-) maintenant, j'aimerais bien réussir à synchroniser
des deux listes. C'est à dire que l'item sélectionné soit le même en
permanence des deux côtés pour pouvoir faire des modifications (addItem,
removeItem) d'un seul coup.

Donc voici ce que j'ai fait :
Placez tout d'abord deux listbox sur une feuille.

Option Explicit

Private Sub Form_Load()
List1.AddItem "France"
List1.AddItem "Belgique"
List1.AddItem "Luxembourg"
List1.AddItem "Suède"
List1.AddItem "Paxs Bas"
List2.AddItem "France"
List2.AddItem "Belgique"
List2.AddItem "Luxembourg"
List2.AddItem "Suède"
List2.AddItem "Paxs Bas"
End Sub


Private Sub List1_Click()
Dim i As Integer
For i = 0 To List2.ListCount - 1
List2.ListIndex = i
If List1.Text = List2.Text Then
Exit Sub
End If
Next i
End Sub

Ca fonctionne mais si je rajoute le bout de code (symétrique si l'on
peut dire) dans la seconde listbox, ça cafouille :

Private Sub List2_Click()
Dim j As Integer
For j = 0 To List1.ListCount - 1
List1.ListIndex = i
If List2.Text = List1.Text Then
Exit Sub
End If
Next j
End Sub

Quelqu'un a une idée ?
Merci de votre aide

--
Franck

6 réponses

1 2
Avatar
le_troll
Bonjour,

Si on reste sur le principe de la liste à enregistrer n°3 = doublon en
vrac:
'------------------------
Dim fid As Integer
fid = FreeFile
Open path For Output As #fid
For z = 0 To releve.ListCount - 1
Print #fid, releve.list(z)
Next z
Close fid
'------------------------
Ça sert à quoi ça ?.??
releve.ListIndex = z

T'es à combien de secondes en faisant ça, et avec quelle Ram et quelle
cadence CPU ???

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"F. David" a écrit dans le message de
news:
le_troll wrote:
> Salut, si je peux t'aider :o) ...

Bon ben je peux peut-être continuer ici. Voila le problème est simple :
Les enregistrements sont donc dans une listbox.
Je viens de faire un test sur 1350 lignes et il me faut 11 secondes pour
que le tout s'enregistre dans un fichier texte avec le code suivant dans
la procédure d'enregistrement.

La variable path est le chemin d'accès au fichier

Dim fid, z As Integer

fid = FreeFile

Open path For Output As #fid

For z = 0 To releve.ListCount - 1
releve.ListIndex = z
Print #fid, releve.Text
Next z

Close #fid

Y a t-il moyen d'améliorer cette procédure dans ce bout de code ou n'y a
t-il pas moyen d'arriver à quelque chose de performant avec les API que
je connais encore mal ? Merci

--
Franck



Avatar
le_troll
Au fait, j'y pense, il y a une solution plus rapide:

A la base tu charges des datas de je ne sais où, ben il faudrait gérer
parallèlement le fichier en même temps que les listes, mais dans ce cas, il
faut que tu utilises comme base les éléments en vrac et un fichier binaire,
et que tu formates en mettant préalablement à la création, dans un variable
de taille fixe (dim variable as string * 16), comme ça, en binaire, tu
pointeras directement sur l'élément à modifier (car ton système n'est que de
la modif, remplacer l'un par l'autre), alors après par exemple:

List_en_vrac, l'élément 17 (listIndex) est modifié
Tu fais pointeur_fichier = ((longueur * 16) + 1) = écrit
list_vrac.list(listIndex) dans fichier à cet endroit...
Ok ???
---------------

J'ai oublié hier, j'ai vu un truc, tu avais fait:

for....
if x = y then goto label
next
label:

Ben non, il faut faire (il y a une instruction):
Exit for

soit:

for....
if x = y then exit for
next

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"F. David" a écrit dans le message de
news:
le_troll wrote:
> Salut, si je peux t'aider :o) ...

Bon ben je peux peut-être continuer ici. Voila le problème est simple :
Les enregistrements sont donc dans une listbox.
Je viens de faire un test sur 1350 lignes et il me faut 11 secondes pour
que le tout s'enregistre dans un fichier texte avec le code suivant dans
la procédure d'enregistrement.

La variable path est le chemin d'accès au fichier

Dim fid, z As Integer

fid = FreeFile

Open path For Output As #fid

For z = 0 To releve.ListCount - 1
releve.ListIndex = z
Print #fid, releve.Text
Next z

Close #fid

Y a t-il moyen d'améliorer cette procédure dans ce bout de code ou n'y a
t-il pas moyen d'arriver à quelque chose de performant avec les API que
je connais encore mal ? Merci

--
Franck



Avatar
F. David
le_troll wrote:

Ça sert à quoi ça ?.??
releve.ListIndex = z



Euh ... oui effectivement, ça sert à faire défiler la sélection donc ça
ne sert à rien :-) Ca va beaucoup mieux en l'enlevant ;-)
Ca se sauvegarde en un clin d'oeil Ouf !!
Merci

T'es à combien de secondes en faisant ça, et avec quelle Ram et quelle
cadence CPU ???



Je suis obligé de répondre ? ;-)

--
Franck
Avatar
F. David
le_troll wrote:
Au fait, j'y pense, il y a une solution plus rapide:

A la base tu charges des datas de je ne sais où, ben il faudrait
gérer parallèlement le fichier en même temps que les listes, mais
dans ce cas, il faut que tu utilises comme base les éléments en vrac
et un fichier binaire, et que tu formates en mettant préalablement à
la création, dans un variable de taille fixe (dim variable as string
* 16), comme ça, en binaire, tu pointeras directement sur l'élément à
modifier (car ton système n'est que de la modif, remplacer l'un par
l'autre), alors après par exemple:

List_en_vrac, l'élément 17 (listIndex) est modifié
Tu fais pointeur_fichier = ((longueur * 16) + 1) = écrit
list_vrac.list(listIndex) dans fichier à cet endroit...
Ok ???



ok je prends note mais maintenant c'est bon, je ne suis pas à 1/10 de
secondes là ;-)
Mais 11s pour 1350 lignes, ça faisait quand même un peu long !
Maintenant, c'est moins d'une seconde donc plutôt satisfaisant.

J'ai oublié hier, j'ai vu un truc, tu avais fait:

for....
if x = y then goto label
next
label:

Ben non, il faut faire (il y a une instruction):
Exit for



Exact. Merci, c'est bien ce qui me semblait ;-)

--
Franck
Avatar
le_troll
OK, si tu reposes d'autres questions, veux-tu bien formuler à nouveau ta
question, car là elle commence à baisser sérieusement :o)

Sinon, tu vas je présume sauvegarder tes données saisies ensuite, alors le
binaire sera le bon mode d'accès, car il permet de pointer pile et de
modifier...

--
Merci, @+, bye, Joe
troll75 AROBASE iFrance POINT com
------------------------------------------
Le_Troll, éleveur de Trolls depuis César, qui disait:
Avec une hache, celui qui tient le manche a toujours raison !


"F. David" a écrit dans le message de
news:%
le_troll wrote:
> Au fait, j'y pense, il y a une solution plus rapide:
>
> A la base tu charges des datas de je ne sais où, ben il faudrait
> gérer parallèlement le fichier en même temps que les listes, mais
> dans ce cas, il faut que tu utilises comme base les éléments en vrac
> et un fichier binaire, et que tu formates en mettant préalablement à
> la création, dans un variable de taille fixe (dim variable as string
> * 16), comme ça, en binaire, tu pointeras directement sur l'élément à
> modifier (car ton système n'est que de la modif, remplacer l'un par
> l'autre), alors après par exemple:
>
> List_en_vrac, l'élément 17 (listIndex) est modifié
> Tu fais pointeur_fichier = ((longueur * 16) + 1) = écrit
> list_vrac.list(listIndex) dans fichier à cet endroit...
> Ok ???

ok je prends note mais maintenant c'est bon, je ne suis pas à 1/10 de
secondes là ;-)
Mais 11s pour 1350 lignes, ça faisait quand même un peu long !
Maintenant, c'est moins d'une seconde donc plutôt satisfaisant.

> J'ai oublié hier, j'ai vu un truc, tu avais fait:
>
> for....
> if x = y then goto label
> next
> label:
>
> Ben non, il faut faire (il y a une instruction):
> Exit for

Exact. Merci, c'est bien ce qui me semblait ;-)

--
Franck




Avatar
F. David
le_troll wrote:
OK, si tu reposes d'autres questions, veux-tu bien formuler à nouveau
ta question, car là elle commence à baisser sérieusement :o)



Ah bon, chez moi, il est bien haut ;-) ok pas de problème.

Sinon, tu vas je présume sauvegarder tes données saisies ensuite,
alors le binaire sera le bon mode d'accès, car il permet de pointer
pile et de modifier...



Pour pointer pile, j'utilise la classe CFile qui est très pratique je
trouve. C'est un des intervenants de ce ng qui l'a mise au point mais je
ne sais plus qui. Tu dois connaître, je suppose.

--
Franck
1 2