OVH Cloud OVH Cloud

Limite de Listbox

2 réponses
Avatar
Rosalie Mignon
Bonjour

J'ai constate qu'il y a une limite dans une listbox ¨¤ ListIndex . elle
vaut 32650 environ.
Y aura t il un moyen de d¨¦passer cette limite ?
J'importe dans une listbox un fichier txt
l'utilisateur selectionne par l'evenement click, Listindex ¨¤ partir duquel
il souhaite voir op¨¦rer une manipulation du fichier.Le probl¨¨me c'est que
pour des gros fichiers avec plus de 32650 lignes , Listindex vaudra toujours
32650 quelque soit la ligne choisit au dela.
comment faire ?

merci d'avance.

2 réponses

Avatar
Picalausa François
"Rosalie Mignon" a écrit dans le message de news:
44c26a84$0$18848$
J'ai constate qu'il y a une limite dans une listbox à ListIndex . elle
vaut 32650 environ.
Y aura t il un moyen de dépasser cette limite ?
J'importe dans une listbox un fichier txt
l'utilisateur selectionne par l'evenement click, Listindex à partir duquel
il souhaite voir opérer une manipulation du fichier.Le problème c'est que
pour des gros fichiers avec plus de 32650 lignes , Listindex vaudra
toujours 32650 quelque soit la ligne choisit au dela.
comment faire ?



Hello,

La première question a se poser est celle de savoir si le design de
l'interface est correct?
Est-ce qu'un utilisateur pourra réellement parcourir 32767 lignes d'un
listbox dans l'interface?
Dans 90% des cas, la réponse est non. On peut evisager différent cas en
fonction des données à afficher...
Groupement hiérarchisé dans un treeview. Groupement "plat" au travers
d'onglet. Filtrage au travers d'une combobox. Découpage en différentes
boites de dialogues. Beaucoup de solution existent, mais il est rarement
acceptable d'avoir autant de lignes dans un listbox (ne fût ce que pour la
gestion mémoire).

A noter que le nombre d'items est de toutes façons limité sous Win9x à 32767
lignes et que donc pour des raisons de compatibilité il n'est pas conseillé
de dépasser cette limite. Néanmoins, les messages LB_ADDSTRING, LB_GETSEL,
LB_SETSEL, LB_GETTEXTLEN, LB_GETTEXT devraient le permettre.
Le contrôle ListView n'a lui, me semble-t-il, pas cette limitation.

--
Picalausa François
Avatar
Picalausa François
Hello,

Note: fait suite à un mail privé
Rmq: ce serait sympa de m'écrire avec une addresse de réponse ;-)

Pour utiliser le Listview, voici une implémentation des méthodes
classiquement disponibles pour un listbox. J'espère que cela pourra te
permettre de mieux comprendre comment utiliser un tel contrôle:
'Remarque : Ce code n'est pas à utiliser tel quel en production mais sert
juste à illustrer
'la correspondance entre un listbox et un listview
Option Explicit

Private Sub Form_Load()
Dim i As Long

'------------------------------
'Modifie l'aspect de la liste pour ressebler au listbox

'Crée un en-tête de colonne
ListView1.ColumnHeaders.Add , , "Colonne 1"

'Les lignes sont sélectionnées complètement
ListView1.FullRowSelect = True

'Même présentation que pour une listbox
ListView1.View = lvwReport

'------------------------------
'Utilise la listview modifiée

'La liste occupe l'entièreté du contrôle
ListView1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight

'Ajoute les items
For i = 1 To 40000
AddItem "Item " & i
Next i
End Sub

Private Sub Form_Resize()
ListView1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
End Sub

'---------------------------------------------------------
'Méthodes ressemblant à celles présentes pour une listbox
'---------------------------------------------------------

Public Sub AddItem(Text As String, _
Optional Index As Long = -1)

'Si l'index est valide
If Index > -1 And Index < ListCount Then
'Ajoute l'élément avant l'index donné
ListView1.ListItems.Add Index + 1, , Text
Else
'Ajoute l'élement à la fin
ListView1.ListItems.Add , , Text
End If
End Sub

Public Sub RemoveItem(Index As Long)
'Attention, contrairement à une Listbox, les index sont basés sur 1
plutôt que 0
ListView1.ListItems.Remove Index + 1
End Sub

Public Function ListCount() As Long
ListCount = ListView1.ListItems.Count
End Function

Public Function ListIndex() As Long
ListIndex = -1

If Not ListView1.SelectedItem Is Nothing Then
'Attention, contrairement à une Listbox,
'les index sont basés sur 1 plutôt que 0
ListIndex = ListView1.SelectedItem.Index - 1
End If
End Function

'Remarque : des accesseurs de propriétés seraient plus appropriés
'(Property Get/Let)
Public Sub SetItemData(Index As Long, Value As Long)
ListView1.ListItems(Index + 1).Tag = Value
End Sub

Public Function GetItemData(Index As Long) As Long
GetItemData = ListView1.ListItems(Index + 1).Tag
End Function

Public Function Text() As String
Text = vbNullString

'Teste si un élément est effectivement sélectionné
If Not ListView1.SelectedItem Is Nothing Then
'Attention, contrairement à une Listbox,
'les index sont basés sur 1 plutôt que 0
Text = ListView1.SelectedItem.Text
End If
End Function

'NewIndex n'a pas été implémenté! Les items sont ajoutés en fin de liste
sauf si l'index est
'spécifié, auquel cas on peut se baser sur cet index pour retrouver l'item

--
Picalausa François