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

10 réponses

1 2
Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut,

En fait, vu le nombre d'entrées, je te conseille d'utiliser une collection
d'objets. Il te suffira ensuite de créer une méthode par type de tri.

Ca donnera

Maliste.TriAlpha
MaListe.TriValeurs

Ces méthode pourraient vider la lite et la rempliraient avec le contenu dans
le bon ordre. Il te sera donc innutile d'avoir plusieurs listes...

Si tu ne sais pas créer une collection je te conseille d'utiliser
l'assistant de création des classes qui fait partie des compléments VB et
qui est très bien fait...

@+

LJ

"F. David" a écrit dans le message de
news:%23EhlWz$
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






Avatar
le_troll
Bonjour,

Je ne comprends pas la finalité de ce que tu veux faire en pratique ???

Pour les listes, ce serait plutôt:

If List1.List(i) = List2.List(j) Then: ...

j=0
for i = 0 to list1.listcount-1
if list1.list(i) = list2.list(j) then
...
end if
j = j + 1
next i


Si les deux listes ont la propriété "Sorted"=true, et contiennent les mêmes
éléments, tu pointeras avec le pointeur de la première liste sur la seconde
qui aura le même contenu, soit:
x = Lis2.List(List1.ListIndex)

Donc, si c'est le même contenu, les indexs seront identiques (si Sorted true), sinon, il faut rechercher le contenu de la list1 pui le comparer à la
List2, et quand list1=list2, tu as l'index de la list2 de facto...

Pour synchroniser les 2 lists en affichage:
list2.TopIndex = list1.listIndex


Tu peux même repositionner les éléments d'une list par rapport à une autre,
mais ça complique (en fixant l'index de la list qui n'est pas celui de son
enregistrement (AddItem)), soit:

list2.ItemData(list2.NewIndex) = index


--
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:%23EhlWz$
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






Avatar
F. David
Merci à Laurent pour l'idée mais je doute que j'arrive à quelque chose
d'aussi performant qu'en utilisant la propriété "sorted" d'une listbox.
J'ai fait un essai sur 1000 entrées et le tri est quasi instantanné. Je
ne dis pas que ce n'est pas possible mais cela reviendrait à ce que je
mette en place la routine de tri non ?

Je ne comprends pas la finalité de ce que tu veux faire en
pratique ???



C'est simple. J'ai une liste d'items qui peut atteindre 2000-3000
entrées
(ce n'est pas des pays comme l'exemple) et je souhaiterais que
l'utilisateur puisse les trier par ordre alphabétique.
Donc j'avais pensé à ces deux listes :
- List1 : visible si tri par ordre d'entrée dans la liste
- List2 : visible si tri alphabétique.

J'ai testé et ça marche très bien. On a vraiment l'impression de ne voir
qu'une seule liste. Le problème qui se pose est que l'utilisateur peut
sélectionner un enregistrement pour soit le modifier ou le supprimer.
Et j'aimerais que ces choix soient dispos dans les deux modes de tris.
Je me suis donc dit : il faut que les listes aient un contenu identique
en permanence. Si un item est supprimé dans la liste 1, il faut le
retrouver dans la liste 2 (qui est alors masquée) pour le supprimer
également. Et inversement.
Donc voila en fait, le problème revient à retrouver dans la seconde
liste l'item sélectionné dans la première pour soit le supprimer ou
remplacer son contenu.
En fait, ce n'est pas si compliqué et je pense y être arrivé. En tout
cas, ça fonctionne dans mon appli. J'essaie si j'ai le temps de donner
le code en exemple, un peu plus tard.

Pour connaître le contenu d'un item, c'est vrai que c'est list(i) en
principe qu'il convient d'utiliser mais la propriété Text a l'air de
fonctionner tout aussi bien, non ?

Merci à vous deux.

--
Franck
Avatar
le_troll
Ah, 2, 3000 enregistrements, sauf si la longueur est importante, ça se trie
en moins d'une seconde... Tu peux aussi utiliser une variable indicée, ou
encore un fichier.tmp, y a aucun problème :o)
Heu, idée, tu peux présenter deux listes, l'une trié alpha et l'autre dans
l'ordre de sortie, avec des label indiquant "quoi que c'est"...

--
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:%23qq%
Merci à Laurent pour l'idée mais je doute que j'arrive à quelque chose
d'aussi performant qu'en utilisant la propriété "sorted" d'une listbox.
J'ai fait un essai sur 1000 entrées et le tri est quasi instantanné. Je
ne dis pas que ce n'est pas possible mais cela reviendrait à ce que je
mette en place la routine de tri non ?

> Je ne comprends pas la finalité de ce que tu veux faire en
> pratique ???

C'est simple. J'ai une liste d'items qui peut atteindre 2000-3000
entrées
(ce n'est pas des pays comme l'exemple) et je souhaiterais que
l'utilisateur puisse les trier par ordre alphabétique.
Donc j'avais pensé à ces deux listes :
- List1 : visible si tri par ordre d'entrée dans la liste
- List2 : visible si tri alphabétique.

J'ai testé et ça marche très bien. On a vraiment l'impression de ne voir
qu'une seule liste. Le problème qui se pose est que l'utilisateur peut
sélectionner un enregistrement pour soit le modifier ou le supprimer.
Et j'aimerais que ces choix soient dispos dans les deux modes de tris.
Je me suis donc dit : il faut que les listes aient un contenu identique
en permanence. Si un item est supprimé dans la liste 1, il faut le
retrouver dans la liste 2 (qui est alors masquée) pour le supprimer
également. Et inversement.
Donc voila en fait, le problème revient à retrouver dans la seconde
liste l'item sélectionné dans la première pour soit le supprimer ou
remplacer son contenu.
En fait, ce n'est pas si compliqué et je pense y être arrivé. En tout
cas, ça fonctionne dans mon appli. J'essaie si j'ai le temps de donner
le code en exemple, un peu plus tard.

Pour connaître le contenu d'un item, c'est vrai que c'est list(i) en
principe qu'il convient d'utiliser mais la propriété Text a l'air de
fonctionner tout aussi bien, non ?

Merci à vous deux.

--
Franck



Avatar
F. David
le_troll wrote:
Ah, 2, 3000 enregistrements, sauf si la longueur est importante, ça
se trie en moins d'une seconde... Tu peux aussi utiliser une variable
indicée, ou encore un fichier.tmp, y a aucun problème :o)
Heu, idée, tu peux présenter deux listes, l'une trié alpha et l'autre
dans l'ordre de sortie, avec des label indiquant "quoi que c'est"...



Voila à peu près à quoi ressemble mon code. Sauf que pas de chance, il y
a un petit problème dans l'ordre alpha car l'élément ajouté conserve la
place de l'ancien élément remplacé. Bizarrement, tout ce passe bien au
niveau de mon appli pourtant et je n'arrive pas à trouver d'où ça vient
dans le bout de code que je donne ici :

Sur une form mettre 5 contrôles :

- 1 TextBox nommé : Text1
- 1 litbox nommée : releve
- 1 listbox nommée : releve2
- 1 checkbox nommé Check1
- 1 bouton nommé save2

Option Explicit

Private Sub Check1_Click()
If Check1.Value = 1 Then
releve2.Visible = True
releve.Visible = False
Else
releve2.Visible = False
releve.Visible = True
End If
End Sub

Private Sub Form_Load()
releve.AddItem "France"
releve.AddItem "Belgique"
releve.AddItem "Luxembourg"
releve.AddItem "Suède"
releve.AddItem "Paxs Bas"
releve2.AddItem "France"
releve2.AddItem "Belgique"
releve2.AddItem "Luxembourg"
releve2.AddItem "Suède"
releve2.AddItem "Paxs Bas"
releve2.Visible = False
releve.Left = 840
releve.Top = 1080
releve.Height = 1620
releve.Width = 3135
releve2.Left = 840
releve2.Top = 1080
releve2.Height = 1620
releve2.Width = 3135
Check1.Caption = "Tri alphabétique"
Text1.Text = "Italie"


End Sub

Private Sub save2_Click()

Dim strLigne As String
Dim p As Integer
strLigne = Text1.Text


'Modification d'enregistrement
If releve.Visible = True Then

For p = 0 To releve2.ListCount - 1
releve2.ListIndex = p

If releve.Text = releve2.Text Then
releve2.AddItem strLigne, releve2.ListIndex
releve2.RemoveItem releve2.ListIndex
GoTo suite1
End If
Next p
suite1:
releve.AddItem strLigne, releve.ListIndex
releve.RemoveItem releve.ListIndex

Else
For p = 0 To releve.ListCount - 1
releve.ListIndex = p

If releve2.Text = releve.Text Then
releve.AddItem strLigne, releve.ListIndex
releve.RemoveItem releve.ListIndex
GoTo suite2
End If
Next p
suite2:
releve2.AddItem strLigne, releve2.ListIndex
releve2.RemoveItem releve2.ListIndex
End If
End Sub

Ce qu'il faut faire :

1 - Mettre du texte dans le champ texte. J'ai mis par exemple Italie par
défaut. C'est le texte qui va remplacer celui choisi dans la liste
2 - Sélectionner dans la liste un pays (peu importe lequel) Ne pas
oublier de sélectionner une ligne sinon erreur (c'est pas le pb)
3 - Cliquer sur le bouton

Normalement ce qui doit se passer :

Le pays sélectionné est remplacé par "Italie" dans la liste.
Et si l'on trie par ordre alpha, Italie doit aussi apparaître. Le pb,
c'est qu'avec ce bout de code, il garde la place de l'ancien item. Je
n'ai plus le temps de regarder ce qui cloche mais sans doute pas grand
chose.

A+
--
Franck
Avatar
le_troll
' programme ??? : form 1
'

' Remplace un objet sélectionné d'une liste par une saisie de texte
' en présentant la liste, soit en vrac, soit tiée alphanumériquement
'

' OBJETS
' form1.Activate() '''à cause du setfocus(text1)
' list1 visible=true, sortedúlse : liste de choix
' list2 visibleúlse, sorted=true : double trié
' list3 visibleúlse, sortedúlse : double non trié
' check1 caption = "tri" : choix trié/vrac
' commandbutton1 caption = "ok" : validation
'

Option Explicit
Dim i As Integer
'


Sub Form_Activate()
List1.Clear
List1.AddItem UCase("france")
List1.AddItem UCase("belgique")
List1.AddItem UCase("luxembourg")
List1.AddItem UCase("suède")
List1.AddItem UCase("pays Bas")
Call charge_listes
End Sub


Sub charge_listes()
If List1.ListCount < 1 Then Exit Sub
List2.Clear
List3.Clear
For i = 0 To List1.ListCount - 1 ' copie non triée L1->L3
List3.AddItem List1.List(i)
List2.AddItem List1.List(i)
Next i
Call Check1_Click
Text1 = ""
End Sub


Sub Command1_Click() 'ok
Text1 = Trim(Text1)
If Len(Text1) < 2 Or List1.ListIndex < 0 Or List1.ListCount < 1 Then
Text1.SetFocus
Exit Sub
End If
'
Text1 = UCase(Text1)
i = List1.ListIndex
List1.AddItem Text1, i
List1.Refresh
List1.RemoveItem i + 1
List1.Refresh
Call charge_listes
End Sub


Sub Check1_Click()
If List1.ListCount < 1 Then Exit Sub
If Check1.Value = 0 Then
List1.Clear
For i = 0 To List3.ListCount - 1
List1.AddItem List3.List(i)
Next i
Text1.SetFocus
Exit Sub
End If
'
If Check1.Value = 1 Then
List1.Clear
For i = 0 To List2.ListCount - 1
List1.AddItem List2.List(i)
Next i
Text1.SetFocus
Exit Sub
End If
End Sub

****************
****************
****************
--
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:
> Ah, 2, 3000 enregistrements, sauf si la longueur est importante, ça
> se trie en moins d'une seconde... Tu peux aussi utiliser une variable
> indicée, ou encore un fichier.tmp, y a aucun problème :o)
> Heu, idée, tu peux présenter deux listes, l'une trié alpha et l'autre
> dans l'ordre de sortie, avec des label indiquant "quoi que c'est"...

Voila à peu près à quoi ressemble mon code. Sauf que pas de chance, il y
a un petit problème dans l'ordre alpha car l'élément ajouté conserve la
place de l'ancien élément remplacé. Bizarrement, tout ce passe bien au
niveau de mon appli pourtant et je n'arrive pas à trouver d'où ça vient
dans le bout de code que je donne ici :

Sur une form mettre 5 contrôles :

- 1 TextBox nommé : Text1
- 1 litbox nommée : releve
- 1 listbox nommée : releve2
- 1 checkbox nommé Check1
- 1 bouton nommé save2

Option Explicit

Private Sub Check1_Click()
If Check1.Value = 1 Then
releve2.Visible = True
releve.Visible = False
Else
releve2.Visible = False
releve.Visible = True
End If
End Sub

Private Sub Form_Load()
releve.AddItem "France"
releve.AddItem "Belgique"
releve.AddItem "Luxembourg"
releve.AddItem "Suède"
releve.AddItem "Paxs Bas"
releve2.AddItem "France"
releve2.AddItem "Belgique"
releve2.AddItem "Luxembourg"
releve2.AddItem "Suède"
releve2.AddItem "Paxs Bas"
releve2.Visible = False
releve.Left = 840
releve.Top = 1080
releve.Height = 1620
releve.Width = 3135
releve2.Left = 840
releve2.Top = 1080
releve2.Height = 1620
releve2.Width = 3135
Check1.Caption = "Tri alphabétique"
Text1.Text = "Italie"


End Sub

Private Sub save2_Click()

Dim strLigne As String
Dim p As Integer
strLigne = Text1.Text


'Modification d'enregistrement
If releve.Visible = True Then

For p = 0 To releve2.ListCount - 1
releve2.ListIndex = p

If releve.Text = releve2.Text Then
releve2.AddItem strLigne, releve2.ListIndex
releve2.RemoveItem releve2.ListIndex
GoTo suite1
End If
Next p
suite1:
releve.AddItem strLigne, releve.ListIndex
releve.RemoveItem releve.ListIndex

Else
For p = 0 To releve.ListCount - 1
releve.ListIndex = p

If releve2.Text = releve.Text Then
releve.AddItem strLigne, releve.ListIndex
releve.RemoveItem releve.ListIndex
GoTo suite2
End If
Next p
suite2:
releve2.AddItem strLigne, releve2.ListIndex
releve2.RemoveItem releve2.ListIndex
End If
End Sub

Ce qu'il faut faire :

1 - Mettre du texte dans le champ texte. J'ai mis par exemple Italie par
défaut. C'est le texte qui va remplacer celui choisi dans la liste
2 - Sélectionner dans la liste un pays (peu importe lequel) Ne pas
oublier de sélectionner une ligne sinon erreur (c'est pas le pb)
3 - Cliquer sur le bouton

Normalement ce qui doit se passer :

Le pays sélectionné est remplacé par "Italie" dans la liste.
Et si l'on trie par ordre alpha, Italie doit aussi apparaître. Le pb,
c'est qu'avec ce bout de code, il garde la place de l'ancien item. Je
n'ai plus le temps de regarder ce qui cloche mais sans doute pas grand
chose.

A+
--
Franck







begin 666 Projet1.vbp
M5'EP93U%>&4-"D9O<FT]1F]R;3$N9G)M#0I2969E<F5N8V4]*EQ'>S P,#(P
M-#,P+3 P,# M,# P,"U#,# P+3 P,# P,# P,# T-GTC,BXP(S C+BY<+BY<
M+BY<5TE.1$]74UQ3>7-T96TS,EQS=&1O;&4R+G1L8B-/3$;VUA=&EO
M;@T*4W1A<G1U<#TB1F]R;3$B#0I#;VUM86YD,S(](B(-"DYA;64](E!R;VIE
M=#$B#0I(96QP0V]N=&5X=$E$/2(P(@T*0V]M<&%T:6)L94UO9&4](C B#0I-
M86IO<E9E<CTQ#0I-:6YO<E9E<CTP#0I2979I<VEO;E9E<CTP#0I!qO26YC
M<F5M96YT5F5R/3 -"E-E<G9E<E-U<'!O<G1&:6QE<STP#0I697)S:6]N0V]M
M<&%N>4YA;64](E!E<G-O(@T*0V]M<&EL871I;VY4>7!E/3 -"D]P=&EM:7IA
M=&EO;E1Y<&4], T*1F%V;W)096YT:75M4')O*'1M*3TP#0I#;V1E5FEE=T1E
M8G5G26YF;STP#0I.;T%L:6%S:6YG/3 -"D)O=6YD<T-H96-K/3 -"D]V97)F
M;&]W0VAE8VL], T*1FQ0;VEN=$-H96-K/3 -"D9$259#:&5C:STP#0I5;G)O
M=6YD961&4#TP#0I3=&%R=$UO9&4], T*56YA='1E;F1E9#TP#0I2971A:6YE
M9#TP#0I4:')E861097)/8FIE8W0], T*36%X3G5M8F5R3V94:')E861S/3$-
!"@``
`
end

begin 666 Form1.frm
M5D524TE/3B U+C P#0I"96=I;B!60BY&;W)M($9O<FTQ( T*(" @0V%P=&EO
M;B @(" @(" @(#T@(" B1F]R;3$B#0H@("!#;&EE;G1(96EG:'0@(" @/2 @
M(#,R-34-"B @($-L:65N=$QE9G0@(" @(" ](" @-C -"B @($-L:65N=%1O
M<" @(" @(" ](" @-#4P#0H@("!#;&EE;G17:61T:" @(" @/2 @(#8V,34-
M"B @($QI;FM4;W!I8R @(" @(" ](" @(D9O<FTQ(@T*(" @4V-A;&5(96EG
M:'0@(" @(#T@(" S,C4U#0H@("!38V%L95=I9'1H(" @(" @/2 @(#8V,34-
M"B @(%-T87)T57!0;W-I=&EO;B ](" @,R @)U=I;F1O=W,@1&5F875L= T*
M(" @0F5G:(N3&ES=$)O>"!,:7-T,R -"B @(" @($AE:6=H=" @(" @
M(" @(" ](" @,C0P, T*(" @(" @3&5F=" @(" @(" @(" @(#T@(" T-#0P
M#0H@(" @("!486));F1E>" @(" @(" @/2 @(#4-"B @(" @(%1O<" @(" @
M(" @(" @(" ](" @-S(P#0H@(" @("!7:61T:" @(" @(" @(" @/2 @(#(P
M-34-"B @($5N9 T*(" @0F5G:(N0V]M;6%N9$)U='1O;B!#;VUM86YD
M,2 -"B @(" @($-A<'1I;VX@(" @(" @(" ](" @(F]K(@T*(" @(" @2&5I
M9VAT(" @(" @(" @(#T@(" T.34-"B @(" @($QE9G0@(" @(" @(" @(" ]
M(" @,S(T, T*(" @(" @5&%B26YD97@@(" @(" @(#T@(" T#0H@(" @("!4
M;W @(" @(" @(" @(" @/2 @(#$R, T*(" @(" @5VED=&@@(" @(" @(" @
M(#T@(" S,C4U#0H@("!%;F0-"B @($)E9VEN(%9"+E1E>'1";W@@5&5X=#$@
M#0H@(" @("!(96EG:'0@(" @(" @(" @/2 @(#(X-0T*(" @(" @3&5F=" @
M(" @(" @(" @(#T@(" Q,C -"B @(" @(%1A8DEN9&5X(" @(" @(" ](" @
M, T*(" @(" @5&5X=" @(" @(" @(" @(#T@(" B5&5X=#$B#0H@(" @("!4
M;W @(" @(" @(" @(" @/2 @(#(T, T*(" @(" @5VED=&@@(" @(" @(" @
M(#T@(" R,#4U#0H@("!%;F0-"B @($)E9VEN(%9"+D-H96-K0F]X($-H96-K
M,2 -"B @(" @($-A<'1I;VX@(" @(" @(" ](" @(E1R:2(-"B @(" @($AE
M:6=H=" @(" @(" @(" ](" @,S<U#0H@(" @("!,969T(" @(" @(" @(" @
M/2 @(#(R.# -"B @(" @(%1A8DEN9&5X(" @(" @(" ](" @,0T*(" @(" @
M5&]P(" @(" @(" @(" @(#T@(" R-# -"B @(" @(%=I9'1H(" @(" @(" @
M(" ](" @-S,U#0H@("!%;F0-"B @($)E9VEN(%9"+DQI<W1";W@@3&ES=#$@
M#0H@(" @("!(96EG:'0@(" @(" @(" @/2 @(#(T,# -"B @(" @($QE9G0@
M(" @(" @(" @(" ](" @,3(P#0H@(" @("!486));F1E>" @(" @(" @/2 @
M(#(-"B @(" @(%1O<" @(" @(" @(" @(" ](" @-S(P#0H@(" @("!7:61T
M:" @(" @(" @(" @/2 @(#(P-34-"B @($5N9 T*(" @0F5G:(N3&ES
M=$)O>"!,:7-T,B -"B @(" @($AE:6=H=" @(" @(" @(" ](" @,C0P, T*
M(" @(" @3&5F=" @(" @(" @(" @(#T@(" R,#0H@(" @("!3;W)T960@
M(" @(" @(" @/2 @("TQ(" G5')U90T*(" @(" @5&%B26YD97@@(" @(" @
M(#T@(" S#0H@(" @("!4;W @(" @(" @(" @(" @/2 @(#<R, T*(" @(" @
M5VED=&@@(" @(" @(" @(#T@(" R,#4U#0H@("!%;F0-"D5N9 T*071T<FEB
MqE(%9"7TYA;64@/2 B1F]R;3$B#0I!='1R:6)U=&)?1VQO8F%L3F%M
M95-P86-E(#%L<V4-"D%T=')I8G5T92!60E]#<F5A=&%B;&4@/2!&86QS
M90T*071T<FEBqE(%9"7U!R961E8VQA<F5D260@/2!4<G5E#0I!='1R:6)U
M=&)?17AP;W-E9" ]($9A;'-E#0H-"B @)R!P<F]G<F%M;64@/S_(#H@
M9F]R;2 Q#0H@(" @)PT*(" @( T*(" G(%)E;7!L86-E('5N(&]B:F5T('/I
M;&5C=&EO;F[I(&0G=6YE(&QI<W1E('!A<B!U;F4@<V%I<VEE(&1E('1E>'1E
M#0H@("<@96X@<'+I<V5N=&%N="!L82!L:7-T92P@<V]I="!E;B!V<F%C+"!S
M;VET(':&%N=6WI<FEQeM96YT#0H@(" @)PT*(" @( T*(" G
M($]"2D544PT*(" @("<@9F]R;3$N06-T:79A=&4H*2 G)R?@(&-A=7-E(&1U
M('-E=&9O8W5S*'1E>'0Q*0T*(" @("<@;&ES=#$@þS:6)L93UT<G5E+"!S
M;W)T960]9F%L!L:7-T92!D92!C:&]I> T*(" @("<@;&ES=#(@þS
M:6)L93UF86QS92P@<V]R=&5D/!D;W5B;&4@=')IZ0T*(" @("<@
M;&ES=#,@þS:6)L93UF86QS92P@<V]R=&5D/69A;'-E(#&]U8FQE(&YO
M;B!T<FGI#0H@(" @)R!C:&5C:S$@8V%P=&EO;B ](")T<FDB(#:7@@
M=')IZ2]V<F%C#0H@(" @)R!C;VUM86YD8G5T=&]N,2!C87!T:6]N(#T@(F]K
M(B Z('9A;&ED871I;VX-"B @(" @("<-"B @(" @( T*("!/<'1I;
M;&EC:70-"B @1&EM(&,@26YT96=E<@T*(" G#0H-"@T*4W5B($9O<FU?
M06-T:79A=&4H*0T*("!,:7-T,2Y#;&5A<@T*("!,:7-T,2Y!9&1)=&5M(%5#
M87-E*")F<F%N8V4B*0T*("!,:7-T,2Y!9&1)=&5M(%5#87-E*")B96QG:7%U
M92(I#0H@($QI<W0Q+D%D9$<V4H(FQU>&5M8F]U<F<B*0T*("!,
M:7-T,2Y!9&1)=&5M(%5#87-E*")S=>AD92(I#0H@($QI<W0Q+D%D9$ET96T@
M54-A<V4H(G!A>7,@0F%S(BD-"B @0V%L;"!C:&%R9V5?;&ES=&5S#0I%;F0@
M4W5B#0H-"@T*4W5B(&-H87)G95]L:7-T97,H*0T*("!)9B!,:7-T,2Y,:7-T
M0V]U;G0@/" Q(%="!3=6(-"B @3&ES=#(N0VQE87(-"B @3&ES
M=#,N0VQE87(-"B @1F]R(&D@/2 P(%1O($QI<W0Q+DQI<W1#;W5N=" M(#$@
M)R!C;W!I92!N;VX@=')#$M/DPS#0H@(" @3&ES=#,N061D271E;2!,
M:7-T,2Y,:7-T*&DI#0H@(" @3&ES=#(N061D271E;2!,:7-T,2Y,:7-T*&DI
M#0H@($YE>'0@:0T*("!#86QL($-H96-K,5]#;&EC:PT*("!497AT,2 ]("(B
M#0I%;#0H-"@T*4W5B($-O;6UA;F0Q7T-L:6-K*"D@)V]K#0H@(%1E
M>'0Q(#')I;2A497AT,2D-"B @&5N*%1E>'0Q*2 (#(@3W(@3&ES
M=#$N3&ES=$EN9&5X(#P@,"!/<B!,:7-T,2Y,:7-T0V]U;G0@/" Q(%1H96X-
M"B @("!497AT,2Y3971&;V-U<PT*(" @($5X:#0H@($5N9"!)*
M(" G#0H@(%1E>'0Q(#<V4H5&5X=#$I#0H@(&D@/2!,:7-T,2Y,:7-T
"B @3&ES=#$N061D271E;2!497AT,2P@:0T*("!,:7-T,2Y2969R
M97-H#0H@($QI<W0Q+E)E;6]V94ET96T@:2 K(#$-"B @3&ES=#$N4F5F<F5S
M: T*("!#86QL(&-H87)G95]L:7-T97,-"D5N9"!3=6(-"@T*#0I3=6(@0VAE
M8VLQ7T-L:6-K*"D-"B @&ES=#$N3&ES=$-O=6YT(#P@,2!4:&5N($5X
M:#0H@($EF($-H96-K,2Y686QU92 ](# @5&AE;@T*(" @($QI<W0Q
M+D-L96%R#0H@(" @1F]R(&D@/2 P(%1O($QI<W0S+DQI<W1#;W5N=" M(#$-
M"B @(" @($QI<W0Q+D%D9$&ES=#,N3&ES="AI*0T*(" @($YE>'0@
M:0T*(" @(%1E>'0Q+E-E=$9O8W5S#0H@(" @17AI="!3=6(-"B @16YD($EF
M#0H@("<-"B @+E9A;'5E(#T@,2!4:&5N#0H@(" @3&ES=#$N
M0VQE87(-"B @("!&;W(@:2 ](# @5&@3&ES=#(N3&ES=$-O=6YT("T@,0T*
M(" @(" @3&ES=#$N061D271E;2!,:7-T,BY,:7-T*&DI#0H@(" @3F5X="!I
M#0H@(" @5&5X=#$N4V5T1F]C=7,-"B @("!%>&ET(%*("!%;
*"D5N9"!3=6(-"@``
`
end
Avatar
Laurent Jordi \(www.ezlogic.mc\)
Il est tard, je regarderais ça demain matin...
"F. David" a écrit dans le message de
news:
le_troll wrote:
> Ah, 2, 3000 enregistrements, sauf si la longueur est importante, ça
> se trie en moins d'une seconde... Tu peux aussi utiliser une variable
> indicée, ou encore un fichier.tmp, y a aucun problème :o)
> Heu, idée, tu peux présenter deux listes, l'une trié alpha et l'autre
> dans l'ordre de sortie, avec des label indiquant "quoi que c'est"...

Voila à peu près à quoi ressemble mon code. Sauf que pas de chance, il y
a un petit problème dans l'ordre alpha car l'élément ajouté conserve la
place de l'ancien élément remplacé. Bizarrement, tout ce passe bien au
niveau de mon appli pourtant et je n'arrive pas à trouver d'où ça vient
dans le bout de code que je donne ici :

Sur une form mettre 5 contrôles :

- 1 TextBox nommé : Text1
- 1 litbox nommée : releve
- 1 listbox nommée : releve2
- 1 checkbox nommé Check1
- 1 bouton nommé save2

Option Explicit

Private Sub Check1_Click()
If Check1.Value = 1 Then
releve2.Visible = True
releve.Visible = False
Else
releve2.Visible = False
releve.Visible = True
End If
End Sub

Private Sub Form_Load()
releve.AddItem "France"
releve.AddItem "Belgique"
releve.AddItem "Luxembourg"
releve.AddItem "Suède"
releve.AddItem "Paxs Bas"
releve2.AddItem "France"
releve2.AddItem "Belgique"
releve2.AddItem "Luxembourg"
releve2.AddItem "Suède"
releve2.AddItem "Paxs Bas"
releve2.Visible = False
releve.Left = 840
releve.Top = 1080
releve.Height = 1620
releve.Width = 3135
releve2.Left = 840
releve2.Top = 1080
releve2.Height = 1620
releve2.Width = 3135
Check1.Caption = "Tri alphabétique"
Text1.Text = "Italie"


End Sub

Private Sub save2_Click()

Dim strLigne As String
Dim p As Integer
strLigne = Text1.Text


'Modification d'enregistrement
If releve.Visible = True Then

For p = 0 To releve2.ListCount - 1
releve2.ListIndex = p

If releve.Text = releve2.Text Then
releve2.AddItem strLigne, releve2.ListIndex
releve2.RemoveItem releve2.ListIndex
GoTo suite1
End If
Next p
suite1:
releve.AddItem strLigne, releve.ListIndex
releve.RemoveItem releve.ListIndex

Else
For p = 0 To releve.ListCount - 1
releve.ListIndex = p

If releve2.Text = releve.Text Then
releve.AddItem strLigne, releve.ListIndex
releve.RemoveItem releve.ListIndex
GoTo suite2
End If
Next p
suite2:
releve2.AddItem strLigne, releve2.ListIndex
releve2.RemoveItem releve2.ListIndex
End If
End Sub

Ce qu'il faut faire :

1 - Mettre du texte dans le champ texte. J'ai mis par exemple Italie par
défaut. C'est le texte qui va remplacer celui choisi dans la liste
2 - Sélectionner dans la liste un pays (peu importe lequel) Ne pas
oublier de sélectionner une ligne sinon erreur (c'est pas le pb)
3 - Cliquer sur le bouton

Normalement ce qui doit se passer :

Le pays sélectionné est remplacé par "Italie" dans la liste.
Et si l'on trie par ordre alpha, Italie doit aussi apparaître. Le pb,
c'est qu'avec ce bout de code, il garde la place de l'ancien item. Je
n'ai plus le temps de regarder ce qui cloche mais sans doute pas grand
chose.

A+
--
Franck





Avatar
F. David
le_troll wrote:
' programme ??? : form 1
'

' Remplace un objet sélectionné d'une liste par une saisie de texte
' en présentant la liste, soit en vrac, soit tiée alphanumériquement
'

' OBJETS
' form1.Activate() '''à cause du setfocus(text1)
' list1 visible=true, sortedúlse : liste de choix
' list2 visibleúlse, sorted=true : double trié
' list3 visibleúlse, sortedúlse : double non trié
' check1 caption = "tri" : choix trié/vrac
' commandbutton1 caption = "ok" : validation
'

Option Explicit
Dim i As Integer
'


Sub Form_Activate()
List1.Clear
List1.AddItem UCase("france")
List1.AddItem UCase("belgique")
List1.AddItem UCase("luxembourg")
List1.AddItem UCase("suède")
List1.AddItem UCase("pays Bas")
Call charge_listes
End Sub


Sub charge_listes()
If List1.ListCount < 1 Then Exit Sub
List2.Clear
List3.Clear
For i = 0 To List1.ListCount - 1 ' copie non triée L1->L3
List3.AddItem List1.List(i)
List2.AddItem List1.List(i)
Next i
Call Check1_Click
Text1 = ""
End Sub


Sub Command1_Click() 'ok
Text1 = Trim(Text1)
If Len(Text1) < 2 Or List1.ListIndex < 0 Or List1.ListCount < 1 Then
Text1.SetFocus
Exit Sub
End If
'
Text1 = UCase(Text1)
i = List1.ListIndex
List1.AddItem Text1, i
List1.Refresh
List1.RemoveItem i + 1
List1.Refresh
Call charge_listes
End Sub


Sub Check1_Click()
If List1.ListCount < 1 Then Exit Sub
If Check1.Value = 0 Then
List1.Clear
For i = 0 To List3.ListCount - 1
List1.AddItem List3.List(i)
Next i
Text1.SetFocus
Exit Sub
End If
'
If Check1.Value = 1 Then
List1.Clear
For i = 0 To List2.ListCount - 1
List1.AddItem List2.List(i)
Next i
Text1.SetFocus
Exit Sub
End If
End Sub



Bonjour, merci beaucoup pour ces quelques lignes. C'est clair, c'est
net. J'ai testé et ça fonctionne très bien.
Vous pourrez voir ce que ça donne concrètement lorsque l'appli sera
disponible et téléchargeable sur Internet.
Mais tout n'est pas fini, j'ai un autre petit souci qui me tracasse et
je pense réouvrir un fil d'ici peu de temps .;-)

Merci à tous

--
Franck
Avatar
le_troll
Salut, si je peux t'aider :o) ...

--
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:
> ' programme ??? : form 1
> '
>
> ' Remplace un objet sélectionné d'une liste par une saisie de texte
> ' en présentant la liste, soit en vrac, soit tiée alphanumériquement
> '
>
> ' OBJETS
> ' form1.Activate() '''à cause du setfocus(text1)
> ' list1 visible=true, sortedúlse : liste de choix
> ' list2 visibleúlse, sorted=true : double trié
> ' list3 visibleúlse, sortedúlse : double non trié
> ' check1 caption = "tri" : choix trié/vrac
> ' commandbutton1 caption = "ok" : validation
> '
>
> Option Explicit
> Dim i As Integer
> '
>
>
> Sub Form_Activate()
> List1.Clear
> List1.AddItem UCase("france")
> List1.AddItem UCase("belgique")
> List1.AddItem UCase("luxembourg")
> List1.AddItem UCase("suède")
> List1.AddItem UCase("pays Bas")
> Call charge_listes
> End Sub
>
>
> Sub charge_listes()
> If List1.ListCount < 1 Then Exit Sub
> List2.Clear
> List3.Clear
> For i = 0 To List1.ListCount - 1 ' copie non triée L1->L3
> List3.AddItem List1.List(i)
> List2.AddItem List1.List(i)
> Next i
> Call Check1_Click
> Text1 = ""
> End Sub
>
>
> Sub Command1_Click() 'ok
> Text1 = Trim(Text1)
> If Len(Text1) < 2 Or List1.ListIndex < 0 Or List1.ListCount < 1 Then
> Text1.SetFocus
> Exit Sub
> End If
> '
> Text1 = UCase(Text1)
> i = List1.ListIndex
> List1.AddItem Text1, i
> List1.Refresh
> List1.RemoveItem i + 1
> List1.Refresh
> Call charge_listes
> End Sub
>
>
> Sub Check1_Click()
> If List1.ListCount < 1 Then Exit Sub
> If Check1.Value = 0 Then
> List1.Clear
> For i = 0 To List3.ListCount - 1
> List1.AddItem List3.List(i)
> Next i
> Text1.SetFocus
> Exit Sub
> End If
> '
> If Check1.Value = 1 Then
> List1.Clear
> For i = 0 To List2.ListCount - 1
> List1.AddItem List2.List(i)
> Next i
> Text1.SetFocus
> Exit Sub
> End If
> End Sub

Bonjour, merci beaucoup pour ces quelques lignes. C'est clair, c'est
net. J'ai testé et ça fonctionne très bien.
Vous pourrez voir ce que ça donne concrètement lorsque l'appli sera
disponible et téléchargeable sur Internet.
Mais tout n'est pas fini, j'ai un autre petit souci qui me tracasse et
je pense réouvrir un fil d'ici peu de temps .;-)

Merci à tous

--
Franck



Avatar
F. David
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
1 2