ComboBoxにおけるIndexOfObjectについて

解決


だい  2003-09-17 19:11:35  No: 4860

以前、"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 にしてはいけないのでしょうか。
よろしくお願いいたします。


たかみちえ  URL  2003-09-17 19:45:54  No: 4861

TObjectは、メモリ上のオブジェクトのありかを示しているだけなので、
数値を指定するというのは、想定外なんでしょうね。
-1はアドレスとして見ると、不正になるので、そこで問題が発生しているのかもしれません。

  別に関数を用意するなどして、-1だったときにはIndexOfObjectを通らないようにする必要があると思います。


にしの  2003-09-17 19:52:59  No: 4862

TComboBoxに格納してあるObjectを取得する際、CB_GETITEMDATAというメッセージを使用しています。
この戻り値がAddObjectしたオブジェクトに当たるのですが、戻り値がCB_ERR(=-1)の時、SListIndexErrorを発生させています。
TObject(-1)は、実質使用不可ということです。


にしの  2003-09-17 19:56:37  No: 4863

> 別に関数を用意するなどして、-1だったときにはIndexOfObjectを通らないようにする必要があると思います。

IndexOfObjectがエラーを起こしているのでなく、GetObjectが起こしているので、AddObjectや、Items.Objectsなどで-1を入れてはいけないようです。
# TStrings自体はOKです。TStringsの派生クラスで、問題を含む場合があります


だい  2003-09-17 20:07:28  No: 4864

たかみちえさん、にしのさん、ありがとうございます。

>  別に関数を用意するなどして、-1だったときにはIndexOfObjectを通らないようにする必要があると思います。

Items.AddObject()では -1 が使用できましたので、
この方向でやってみたいと思います。
ご教授、ありがとうございました。


だい  2003-09-17 20:31:55  No: 4865

・・・と思いましたが、にしのさんの仰るとおり、
  Items.Objects[ItemIndex]
でもエラーが発生しますので、-1 の使用をあきらめることにいたします。

ありがとうございました。m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加