• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エラー:インデックスが配列の境界外です)

VB.NET2003でDLLの開発時のエラー:インデックスが配列の境界外です

このQ&Aのポイント
  • VB.NET2003でDLLの開発をしている際に、リストボックスから不要なアイテムを削除する際に「インデックスが配列の境界外です」というエラーが発生しています。アイテムの削除は正常に行われていますが、なぜエラーが発生するのか原因が分かりません。
  • エラーの発生する一文は「Me.lst_DoubleEntryFeature.Items.RemoveAt(lListIndex)」で、lListIndexには正しいインデックス値が入っています。これでアイテムの削除が行われているのですが、なぜエラーが発生するのか分かりません。
  • エラーの原因としては、削除するインデックスが配列の範囲外だということが考えられます。lListIndexの値が本当に存在するインデックスを示しているか確認してみてください。それ以外の原因については今のところ分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>結果、メッセージボックス「check1」が出て、OKを押すと、落ちます。 むむっ >エラーログに、件名に書いたメッセージが出ます。 >つまり、この処理自体は、1回しか動いていません。 なるほど でもデバッグしないとわかりませんね。 ところで >(DLLのプログラムなので、デバッグモードが使えないんです) とありましたが、DLLをデバッグすることは出来ますよ。 ヤブヘビかもしれませんが、一応簡単な説明を書いておきます まずDLLのソリューションを開きます。 ※実行から行う方法 ソリューションエクスプローラでプロジェクトファイルを選択した状態にして、メニューバーより ・「プロジェクト」→「プロパティ」でプロパティページを表示 ・「構成プロパティ」の「デバッグ」を選択 ・アプリ系なら  「外部プログラムの開始」を選択し、DLLを呼び出すための、最初のEXEを記述 ・WEB系なら  「URLの開始」を選択し、DLLを呼び出すための、URLを記述  さらにASP.NET絡みなら「有効にするデバッグ」で「ASP.NET デバッグ」を有効にする ※既に実行しているアプリケーションをアタッチする方法 あらかじめ、DLLを呼ぶEXEもしくはURLを起動しておきます。 メニューバーより ・「デバッグ」→「プロセス」を選択 ・アタッチしたいプロセスを選択してアタッチ

kiyama_t
質問者

お礼

うわ、ホントですか。 知りませんでした。 ありがとうございます。早速デバッグしてみます!

kiyama_t
質問者

補足

結果としては、解決を諦め、別の方法(リストボックスを空にして不要なものを除いて再設定する)をとることにしました。 といいますのは、教えていただいた方法でデバッグしてみたところ、やっぱり予想したところで予想したとおりにエラーが発生したのですが、このステップを無理やり戻して再度実行したところ、正常に通ってしまったのです。 もちろん、リストボックスに元々2件以上のアイテムがあったからで、2件とも消えてしまいましたが。 なので、ロジック上に問題があるわけではなく、前後関係でどこかがおかしいらしい、という結論に落ち着きました。 これを回避するより、再設定したほうが時間が早く済みそうなので、そちらの方法を取ります。 アドバイスをありがとうございました。

その他の回答 (2)

回答No.2

完全推測です。 >この一文でエラーが発生しているのですが、指示したアイテムは正常にリムーブされています。 エラーが発生しているのに「正常にリムーブ」されているのですね? (1)Dim lListIndex As Long (2)lListIndex = Me.lst_DoubleEntryFeature.SelectedIndex (3)Me.lst_DoubleEntryFeature.Items.RemoveAt(lListIndex) (2)と(3)は、同じ処理の一連に無いのではないですか? リスト選択時に(2) 削除ボタンが押されたときに(3) とか、処理を分けていませんか? 一見、 [エラーが発生]→でも[正常にリムーブ] のように見えて、 リムーブ処理が2回働いているように思えますが、いかがでしょう? (3)の処理の前に Debug.WriteLine(lListIndex & "削除") とかして、何回処理が通るかを教えてもらえませんか?

kiyama_t
質問者

お礼

回答ありがとうございます。 そうなんですよね。同じ処理を何度も通っているのではないか、とは、私も疑いましたので、 msgbox("check1") Me.lst_DoubleEntryFeature.Items.RemoveAt(lListIndex) msgbox("check2") この状態にして実行してみました。 (DLLのプログラムなので、デバッグモードが使えないんです) 結果、メッセージボックス「check1」が出て、OKを押すと、落ちます。 エラーログに、件名に書いたメッセージが出ます。 つまり、この処理自体は、1回しか動いていません。 こんな状態です。 いかがでしょうか?

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

削除するとIndexが変わるんだな。 昇順ではなく降順で削除するのが定石。

kiyama_t
質問者

お礼

早速のご回答ありがとうございます。 昇順、降順の問題でしょうか…? カレント行を1行削除するだけなのですが。