“Índice de lista fuera de límites” en la TListBox
-
25-09-2019 - |
Pregunta
Tengo un TListBox en un formulario, y elementos se añaden con
listbox1.ItemIndex := listbox1.Items.AddObject('msg', TObject(grp));
grp
es un número entero. El cuadro de lista se establece en lbOwnerDrawFixed
.
En el caso onDrawItem
tengo la EStringListError
excepción planteada en la línea marcada:
msg := (control as Tlistbox).Items.Strings[index]; // this line works
grp := integer((control as Tlistbox).Items.Objects[index]); // exception here
msg
y grp
son variables de cadena y enteros locales.
Proyecto ### planteado clase de excepción EStringListError con el mensaje 'índice de lista fuera de límites (1)'
Solución
tonto error:. Yo estaba usando grp := -1
como el grupo por defecto, que AddObject
o Objects[index]
no debe como
Otros consejos
Lo que desea almacenar un entero, por lo que debe cambiar su código a
listbox1.ItemIndex := listbox1.Items.Add(IntToStr(grp));
[...]
grp := StrToInt((control as TListBox).Items[index]);
No hay necesidad de almacenar objetos aquí y esto hace que todo sea mucho más fácil y más fácil de leer.
La excepción se obtiene ahora es porque no se puede recuperar objetos utilizando el índice, sino que tienen que utilizar la cadena que ellos asociados con (el primer parámetro de AddObject
). La forma correcta sería algo como esto:
msg := (control as Tlistbox).Items.Strings[index];
grp := integer((control as Tlistbox).Items.Objects[(control as Tlistbox).Items.IndexOf(msg)]);
También ver este tutorial sobre AddObject
.