ListView SubItem ... index out of bound

Résolu
Golderack Messages postés 5 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 17 décembre 2004 - 17 déc. 2004 à 01:31
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre 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;
A voir également:

12 réponses

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
18 déc. 2004 à 10:40
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 ! ;)

-------------------------------------------
3
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
17 déc. 2004 à 08:14
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
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
17 déc. 2004 à 08:47
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
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
17 déc. 2004 à 09:06
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
17 déc. 2004 à 10:42
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 ! ;)

-------------------------------------------
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
17 déc. 2004 à 10:53
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
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
17 déc. 2004 à 11:00
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 ! ;)

-------------------------------------------
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
17 déc. 2004 à 11:08
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
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
17 déc. 2004 à 11:21
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 ! ;)

-------------------------------------------
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
17 déc. 2004 à 12:02
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
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
17 déc. 2004 à 13:01
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
0
Golderack Messages postés 5 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 17 décembre 2004
17 déc. 2004 à 23:16
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.
0
Rejoignez-nous