Exception OutOfBound dans un Listbox

Voici un code auprès duquel je m’arrache les cheveux depuis des heures ! Alors j’ai décidé de vous le soumettre.
Il liste les “drives” dispo et filtre les sauvegardes TimeMachine (.backup) pour les afficher dans un Listbox.
Il fonctionnait bien jusqu’à ce que j’ajoute la ligne “If filename.indexOf(”.backup") > -1 then" qui filtre les lecteurs. Une exception OutofBound apparaît alors systématiquement. J’ai effectué de nombreux tests de contournement mais je n’arrive pas à entrevoir la solution (probablement toute bête…)

Var file As FolderItem
Var filename As String
For i As Integer =0 To VolumeCount-1
  file = Volume(i)
  filename  = file.Name
If filename.indexOf(".backup") > -1 then   //<--- Génère un OutOfBound exception !
  Listbox1.AddRows(filename)    //file.Name
  Listbox1.RowTagAt(i) = file.ShellPath
End
Next

D’avance, Merci.

Signifie que tu essaie d’accéder à quelque chose d’inexistant…

Que retourne IndexOf() si son argument n’existe pas dans filename ?

https://documentation.xojo.com/api/data_types/string.html#string-indexof

OH! Tu n’as pas testé:

  file = Volume(i)
  filename  = file.Name

si c’est Nil !

Et cela n’a rien à voir avec un ListBox.

Ca marche toujours pas.
IndexOf renvoie logiquement -1

Var file As FolderItem

file = Volume(i)
filename = file.Name
if file <> nil then
  //Filtrer les volumes:
  if filename.IndexOf(".backup") > -1 then
    Listbox1.AddRows(filename)    //file.Name
    Listbox1.RowTagAt(i) = file.ShellPath
  else
    //msgbox(filename.IndexOf(".backup").ToString) //renvoie -1
  end
  end

Après file = Volume(i) ajoute:

System.DebugLog file.Name

et regarde attentivement le nom du volume.

Je viens d’essayer:
For i As Integer = 0 To FolderItem.LastDriveIndex
System.DebugLog(FolderItem.DriveAt(i).Name)
Next

Je n’ai aucun élément se terminant par “.backup” (et pour cause).

Peux-tu essayer:


If filename.Right(7) = ".backup" Then

Avec 21r2.1 ton code marche bien (ne fait rien, mais ne plante pas)…

Bon appé■■■.
Il y a également EndsWidth qui peut servir.

Je te remerci pour ton aide. J’ai intégré tes remarques mais cela ne change malheureusement rien.
Si j’enlève le filename.IndexOf(".backup") comme le filename.Right(7), j’affiche bien TOUS LES VOLUMES dont les .backup qui m’intéressent (voir capture).
Sinon j’ai un OutOfBound Exception qui vient, je pense, de la différence entre Listbox.AddRows(filename) et le RowTagAt(i) qui lui est incrémenté, contrairement au premier. Je pense que c’est la liaison entre les éléments du listbox et le RowTagAt(i) dans la boucle qui provoque un dépassement de borne.

Le problème vient bien de cette ligne (tout fonctionne lorsque je la met en //)
ListBox1.RowTagAt(i) = file.DriveAt(i).NativePath
(probablement des 2 variables “i”)
Si ca saute aux yeux de quelqu’un…
Merci.

i est un index défini à l’extérieur du code présenté. Entre les deux lignes illustrées, il faudrait récupérer l’index de la dernière entrée créée par AddRows car il sera différent de i, et l’utiliser pour régler le RowTagAt()

Oui, merci. j’ai créer une 2e variable x (index) à l’interieur de la condition que j’incrémente au fur et à mesure et ca marche. Merci.

Je t invite a utiliser cette syntaxe qui sera plus pertinente:

> ListBox1.AddRow ( "Pour la col 0" )
> ListBox1.CellTextAt ( ListBox1.LastAddedRowIndex ) =  "Pour la col 1"

@Jean_Luc_Pellerin, merci pour l’astuce. Mais pour la colonne 2 par exemple ? (Idem ?)
J’utilise ListBox1.AddRow ( “col 0”, "col1, “col2”, etc. ) et ca fonctionne bien.
Quelle est la différence ?

A priori, cela veut dire que l’erreur n’était sur la ligne indiquée :
If filename.indexOf(".backup") > -1 then //<--- Génère un OutOfBound exception !

mais sur :
Listbox1.RowTagAt(i) = file.ShellPath

Et un suivi pas à pas de l’exécution du programme t’aurait permis de le voir.