2010-09-28 6 views
1

J'ai un TListBox sur un formulaire, et les articles sont ajoutés avec« index de la liste hors limites » sur TListBox

listbox1.ItemIndex := listbox1.Items.AddObject('msg', TObject(grp)); 

grp est un entier. La zone de liste est définie sur lbOwnerDrawFixed.

En cas onDrawItem je reçois l'exception EStringListError élevée sur la ligne marquée:

msg := (control as Tlistbox).Items.Strings[index];   // this line works 
grp := integer((control as Tlistbox).Items.Objects[index]); // exception here 

msg et grp sont des variables de chaîne locale et entier.

Projet

### élevé EStringListError de classe d'exception avec le message 'Liste index hors des limites (1)'

Répondre

1

Erreur stupide: J'utilisais grp := -1 comme groupe par défaut, que AddObject ou Objects[index] ne doit pas aimer.

+0

+ 1 Intéressant .. Vous avez vous-même un bogue OS je pense. LB_GETITEMDATA renvoie -1 (LB_ERR) en cas d'erreur. Il n'y a donc aucun moyen de savoir si l'API réussit -1 ou une erreur. Il ne devrait pas permettre de définir les données de l'élément à -1 en premier lieu. Eh bien, la VCL ne vérifie pas le retour de LB_SETITEMDATA de toute façon, mais ce n'est pas le problème dans ce cas. –

+1

Ce n'est pas un bogue du système d'exploitation. Il est clairement documenté qu'il renvoie "LB_ERR" en cas d'erreur, donc si vous voulez être capable de distinguer entre les erreurs et les valeurs valides, vous devez vous assurer que vous ne stockez pas "LB_ERR" en premier lieu. En outre, Delphi s'attend à stocker des valeurs 'TObject', et -1 n'est jamais une valeur valide de ce type. D'une certaine manière, il s'agit d'un bug d'application pour le moulage de type où ce n'est pas approprié. –

+0

@Rob - Ce que Delphi fait avec les données d'article est tout à fait hors de propos, le système d'exploitation définit un entier. Je comprends l'opinion que ce n'est pas un bogue, mais si je devais le concevoir, je retournerais un LB_ERR si quelqu'un essayait de stocker LB_ERR dans les données d'un objet. –

0

Vous voulez juste stocker un nombre entier, de sorte que vous devez changer votre code pour

listbox1.ItemIndex := listbox1.Items.Add(IntToStr(grp)); 
[...] 
grp := StrToInt((control as TListBox).Items[index]); 

Pas besoin de stocker des objets ici, ce qui rend l'ensemble plus facile et plus lisible. L'exception que vous obtenez maintenant est parce que vous ne pouvez pas récupérer les objets à l'aide de l'index, mais devez utiliser la chaîne avec laquelle vous les avez associés (le premier paramètre AddObject). La manière correcte serait quelque chose comme ceci:

msg := (control as Tlistbox).Items.Strings[index]; 
grp := integer((control as Tlistbox).Items.Objects[(control as Tlistbox).Items.IndexOf(msg)]); 

Voir aussi ce tutorial about AddObject.

+0

Merci la réponse, la chaîne msg est nécessaire aussi, –

Questions connexes