以前、"ComboBoxでのキー設定は可能?" でお世話になりました。
ComboBoxには、
井川 (29)
藪 (4)
伊良部 (41)
という項目を追加しました。
(括弧内は、AddObjectメソッドにて追加した
Integer型データ:非表示)
今回は更に拡張し、先頭に
指定しない (-1)
という項目を追加しました。
アプリケーション起動時に、任意の項目を選択しようと思い、
with ComboBox1 do begin
ItemIndex := Items.IndexOfObject(TObject(29)); // L1 (for Test)
ItemIndex := Items.IndexOfObject(TObject(-1)); // L2
end;
と記述すると、L2 にて実行時エラーが発生してしまいます。
-1 を 0 に変更するとエラーは発生しませんでした。
何故 -1 にしてはいけないのでしょうか。
よろしくお願いいたします。
TObjectは、メモリ上のオブジェクトのありかを示しているだけなので、
数値を指定するというのは、想定外なんでしょうね。
-1はアドレスとして見ると、不正になるので、そこで問題が発生しているのかもしれません。
別に関数を用意するなどして、-1だったときにはIndexOfObjectを通らないようにする必要があると思います。
TComboBoxに格納してあるObjectを取得する際、CB_GETITEMDATAというメッセージを使用しています。
この戻り値がAddObjectしたオブジェクトに当たるのですが、戻り値がCB_ERR(=-1)の時、SListIndexErrorを発生させています。
TObject(-1)は、実質使用不可ということです。
> 別に関数を用意するなどして、-1だったときにはIndexOfObjectを通らないようにする必要があると思います。
IndexOfObjectがエラーを起こしているのでなく、GetObjectが起こしているので、AddObjectや、Items.Objectsなどで-1を入れてはいけないようです。
# TStrings自体はOKです。TStringsの派生クラスで、問題を含む場合があります
たかみちえさん、にしのさん、ありがとうございます。
> 別に関数を用意するなどして、-1だったときにはIndexOfObjectを通らないようにする必要があると思います。
Items.AddObject()では -1 が使用できましたので、
この方向でやってみたいと思います。
ご教授、ありがとうございました。
・・・と思いましたが、にしのさんの仰るとおり、
Items.Objects[ItemIndex]
でもエラーが発生しますので、-1 の使用をあきらめることにいたします。
ありがとうございました。m(_ _)m
ツイート | ![]() |