我在表单上有一个TListBox,并且项目添加了
listbox1.ItemIndex := listbox1.Items.AddObject('msg', TObject(grp));
grp
是一个整数。列表框设置为lbOwnerDrawFixed
。
在onDrawItem
事件中,我在标记的行上引发了异常EStringListError
:
msg := (control as Tlistbox).Items.Strings[index]; // this line works
grp := integer((control as Tlistbox).Items.Objects[index]); // exception here
msg
和grp
是本地字符串和整数变量。
Project ###引发异常类EStringListError,消息'List index out of bounds(1)'
答案 0 :(得分:1)
愚蠢的错误:我使用grp := -1
作为默认组,AddObject
或Objects[index]
一定不喜欢。
答案 1 :(得分:0)
您只想存储一个整数,因此您应该将代码更改为
listbox1.ItemIndex := listbox1.Items.Add(IntToStr(grp));
[...]
grp := StrToInt((control as TListBox).Items[index]);
不需要在这里存储对象,这使得整个事情变得更容易和更易读。
您现在获得的异常是因为您无法使用索引检索对象,但必须使用与其关联的字符串(AddObject
的第一个参数)。正确的方法是这样的:
msg := (control as Tlistbox).Items.Strings[index];
grp := integer((control as Tlistbox).Items.Objects[(control as Tlistbox).Items.IndexOf(msg)]);