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)'

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top