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)'
+ 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. –
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é. –
@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. –