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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"Rosalie Mignon" <personne@microsoft.com> a écrit dans le message de news:
44c26a84$0$18848$626a54ce@news.free.fr...
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.
"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
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
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
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