1

フォームに 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は、ローカル文字列および整数変数です。

プロジェクト ### で例外クラス EStringListError が発生し、「リスト インデックスが範囲外 (1)」というメッセージが表示されました

4

2 に答える 2

1

ばかげた間違い: 私はgrp := -1デフォルトのグループとして使用していましAddObjectObjects[index]

于 2010-09-28T01:08:56.193 に答える
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)]);

についてのこのチュートリアルAddObjectも参照してください。

于 2010-09-28T00:51:55.307 に答える