ListView SubItem ... index out of bound [Résolu]

Messages postés
5
Date d'inscription
mardi 18 novembre 2003
Dernière intervention
17 décembre 2004
- 17 déc. 2004 à 01:31 - Dernière réponse :
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
- 18 déc. 2004 à 10:40
Bonjour j'ai un petit problème avec le composant ListView. Je dois parcourir des éléments dans le ListView. Pour les trois première colonne ca marche très bien mais lorsque mon indice tombe sur la 4e colonne je reçoit un message d'erreur me disant "Index out of bound". Pourtant le code est identique pour chacune de procedure.

if Lsv.Items.Count > 0 then
begin
liNombre := length(psContenu);
For liIndice := Lsv.Items.Count - 1 downto 0 do
begin
lsItem := AnsiLowerCase(Lsv.Items[liIndice].SubItems[piPosition]);
lsItem := copy(lsItem, 1, liNombre);
if (lsItem <> psContenu) then
begin
LsvMp3.Items[liIndice].Delete;
end;
end;
end;
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
- 18 déc. 2004 à 10:40
3
Merci
ok super :)
effectivement si tu veux assigner une valeur a un subitem, il faut kil existe :p
bien joué

N'oubliez pas de cliquer sur Réponse acceptée lorsque ma réponse vous convient ! ;)

-------------------------------------------

Merci JulioDelphi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

Commenter la réponse de JulioDelphi
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 17 déc. 2004 à 08:14
0
Merci
Salut,

Quand tu fais
LsvMp3.Items[liIndice].Delete;


les références indices de ton LsvMp3 ne sont plus les mêmes

par exemple si tu as :

LsvMp3[1]
LsvMp3[2]
LsvMp3[3] etc...

si tu "delete" LsvMp3[2], alors LsvMp3[3] va s'appeler et devenir LsvMp3[2]

(je pense que LsvMp est une liste de strings ou TStringlist ou something like that...)

ce que je propose : au lieu de faire
LsvMp3.Items[liIndice].Delete;


tu fais :
LsvMp3.Items[liIndice]='XXXXXXXX';//ou la valeur que tu veux


don tu laisse ta boucle, quand elle est finie tu "delete" dans LsvMp3 tout ce qui a pour valeur 'XXXXXXXX', ce qui donne :
if Lsv.Items.Count > 0 then
begin
liNombre := length(psContenu);
For liIndice := Lsv.Items.Count - 1 downto 0 do
begin
lsItem := AnsiLowerCase(Lsv.Items[liIndice].SubItems[piPosition]);
lsItem := copy(lsItem, 1, liNombre);
if (lsItem <> psContenu) then
begin
LsvMp3.Items[liIndice]:='XXXXXXXX';//ou une autre valeur de ton choix
end;
end;
end;
end;

For liIndice := 0 to Lsv.Items.Count - 1 do
if LsvMp3.Items[liIndice]='XXXXXXXX' then LsvMp3.Items[liIndice].Delete;


Tu as compris le principe, il y a d'autres méthodes bien sûr...

PS: Si j'ai pas compris ta question, n'hésite pas à donner des compléments

N'oubliez pas de cliquer sur Réponse acceptée si c'est OK

Bonne prog :shy)

DrJerome
Commenter la réponse de DRJEROME
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 17 déc. 2004 à 08:47
0
Merci
Attends, j'ai une autre solution car les 3 dernières lignes de mon source ne marcheront pas du fait que le count est modifié par les delete, je reviens

DrJerome
Commenter la réponse de DRJEROME
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 17 déc. 2004 à 09:06
0
Merci
if Lsv.Items.Count > 0 then
begin
liNombre := length(psContenu);
For liIndice := Lsv.Items.Count - 1 downto 0 do
begin
lsItem := AnsiLowerCase(Lsv.Items[liIndice].SubItems[piPosition]);
lsItem := copy(lsItem, 1, liNombre);
if (lsItem <> psContenu) then
begin
LsvMp3.Items[liIndice]:='XXXXXXXX';//ou une autre valeur de ton choix
end;
end;
end;
end;

liIndice:=LsvMp3.Count-1;
repeat
if LsvMp3[liIndice]='XXXXXXXX' then LsvMp3[liIndice].Delete;
dec(liIndice);
until liIndice=0;



ça devrait marcher...

N'oubliez pas de cliquer sur Réponse acceptée si c'est OK

DrJerome
Commenter la réponse de DRJEROME
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
- 17 déc. 2004 à 10:42
0
Merci
drjerome > dommage que cette personne n'ai pas de problemes avec l'effacement de lignes, sinon tu l'aurais aidé :D lol
elle a un pb de colonne, sa boucle d'effacement d'items dans la listview est bonne car il fait un "downto 0" ce qui est parfait.
la soluce de barbare de remplacer par des XXX puis reboucler dessus ensuite c crade.

sinon pour ton probleme de colonne, on parle donc ici de tes SubItems. l'index ki est "out of bound" semble etre piPosition mais nul part je ne le vois incrementer ou decrementer. peut etre tu nous donne ici k'un morceau.
Tes colonnes (subitems) sont elles toutes bien remplies ?

peux tu donner plus de code merci :)

N'oubliez pas de cliquer sur Réponse acceptée lorsque ma réponse vous convient ! ;)

-------------------------------------------
Commenter la réponse de JulioDelphi
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 17 déc. 2004 à 10:53
0
Merci
je ne savais pas de quel composant s'agissait-il pour LsvMp3 à priori oui maintenant à réfléchir sur son nom, il est possible que ce soit un Listview, je pensais que seul Lsv en était..

désolé il vaut mieux citer les var

DrJerome
Commenter la réponse de DRJEROME
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
- 17 déc. 2004 à 11:00
0
Merci
tout a fait, vaux mieux donner trop d'infos ke devoir en reclamer

N'oubliez pas de cliquer sur Réponse acceptée lorsque ma réponse vous convient ! ;)

-------------------------------------------
Commenter la réponse de JulioDelphi
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 17 déc. 2004 à 11:08
0
Merci
mais je crois quand même que le problème vient de se que j'ai dit plus haut :

par exemple si tu as :

LsvMp3[1]
LsvMp3[2]
LsvMp3[3] etc...

si tu "delete" LsvMp3[2], alors LsvMp3[3] va s'appeler et devenir LsvMp3[2] 


à vérifier, bien sûr...

DrJerome
Commenter la réponse de DRJEROME
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
- 17 déc. 2004 à 11:21
0
Merci
oui mais osef de ça car il boucle en downto, j'explike avec un exemple concret :
nous avons :

LsvMp3.Items[0]
LsvMp3.Items[1]
LsvMp3.Items[2]
LsvMp3.Items[3]
LsvMp3.Items[4]
LsvMp3.Items[5]
LsvMp3.Items[6]
LsvMp3.Items[7]
LsvMp3.Items[8]
LsvMp3.Items[9]

je fais une boucle for avec downto, ça donne :

for i:=7 DOWNTO 0 do // je mets 7 volontairement pour l'exemple
LsvMp3.Items[i].Delete;

comme tu dis drjerome ça va faire :

LsvMp3.Items[7] est supprimé et LsvMp3.Items[8] devient le nouveau LsvMp3.Items[7]

MAIS la boucle continue en DESCENDANT donc elle prends LsvMp3.Items[6] et le supprime ... donc osef que le 8 devienne le 7, ke le 9 devienne le 8 et kil mank un index ! puisque la boucle descends, oublions ce kil y a au dessus :)

j'utilise assez la listview et les list en general pour connaitre le system de deletion

voila pour l'info !

N'oubliez pas de cliquer sur Réponse acceptée lorsque ma réponse vous convient ! ;)

-------------------------------------------
Commenter la réponse de JulioDelphi
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 17 déc. 2004 à 12:02
0
Merci
bien vu,exact, le liIndice n'interfère donc pas...puisqu'il delete des indices de LsvMp3 qui existent encore

Il va falloir que Golderack donne plus de code, le problème est bien ailleurs...

DrJerome
Commenter la réponse de DRJEROME
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 17 déc. 2004 à 13:01
0
Merci
En fait je pense que Golderack veut éliminer des subitems d'un Listview en ayant créé un autre Listview jumeau...

si c'est le cas, il devraitremplacer "LsvMp3.Items[liIndice].Delete;" par :

LsvMp3.Items[liIndice].SubItems.Delete(piPosition);


(car sinon il fusille rapidement son LsvMp3...)

N'oubliez pas de cliquer sur Réponse acceptée si c'est OK

DrJerome
Commenter la réponse de DRJEROME
Messages postés
5
Date d'inscription
mardi 18 novembre 2003
Dernière intervention
17 décembre 2004
- 17 déc. 2004 à 23:16
0
Merci
Après mainte et mainte reprise j'ai fini pas régler mon problème. J'avais besoin de supprimer certaine ligne en parcourant les subitems. La seule chose étais que j'avais créer 4 subitems plus ma colonne de départ. il me fallait simplement créer un subitems supplémentaire au démarrage lorsque je remplissais ma table afin de pouvoir entré dans le dernier indice. Je sais c'est un peu compliqué comme ça mais bon. Ça ressemble à ca :D

    if (TblPlayList.FieldByName ('Genre').AsInteger >= 0) then
       begin
       liGenre := TblPlayList.FieldByName ('Genre').AsInteger;
       TblGenres.FindKey ([liGenre]);
       lsGenre := TblGenres.FieldByName ('Genre').AsString;
       paList.Items[liIndice].SubItems.Add (lsGenre);
       end;
    lsArtiste := TblPlayList.FieldByName ('Artiste').AsString;
    lsAlbum := TblPlayList.FieldByName ('Album').AsString;
    lsTitre := TblPlayList.FieldByName ('Titre').AsString;
    paList.Items[liIndice].SubItems.Add ('');
    paList.Items[liIndice].SubItems.Add ('');
    paList.Items[liIndice].SubItems.Add ('');
    paList.Items[liIndice].SubItems.Add ('');
    paList.Items[liIndice].SubItems[1] := lsArtiste;
    paList.Items[liIndice].SubItems[2] := lsAlbum;
    paList.Items[liIndice].SubItems[3] := lsTitre;
    TblPlayList.Next;
    end;


Merci quand même à tout le monde. Dsl de vous avoir fait fouiller pour rien.
Commenter la réponse de Golderack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.