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

Golderack 5 Messages postés mardi 18 novembre 2003Date d'inscription 17 décembre 2004 Dernière intervention - 17 déc. 2004 à 01:31 - Dernière réponse : JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention
- 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 

12 réponses

Répondre au sujet
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 18 déc. 2004 à 10:40
+3
Utile
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 ! ;)

-------------------------------------------
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de JulioDelphi
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 17 déc. 2004 à 08:14
0
Utile
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
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 17 déc. 2004 à 08:47
0
Utile
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
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 17 déc. 2004 à 09:06
0
Utile
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
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 17 déc. 2004 à 10:42
0
Utile
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
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 17 déc. 2004 à 10:53
0
Utile
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
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 17 déc. 2004 à 11:00
0
Utile
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
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 17 déc. 2004 à 11:08
0
Utile
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
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 17 déc. 2004 à 11:21
0
Utile
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
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 17 déc. 2004 à 12:02
0
Utile
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
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 17 déc. 2004 à 13:01
0
Utile
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
Golderack 5 Messages postés mardi 18 novembre 2003Date d'inscription 17 décembre 2004 Dernière intervention - 17 déc. 2004 à 23:16
0
Utile
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.