dポイントプレゼントキャンペーン実施中!

VB.NET2003でDLLの開発をしています。
どうしても原因が分からないエラーが発生し、次に進めないので、どなたか助けてください。

Windowフォーム上にリストボックスを作成し、そこに複数のアイテムがある状態です。
この時、不要になったアイテムを削除するため、以下の一文を記述しています。

Me.lst_DoubleEntryFeature.Items.RemoveAt(lListIndex)

DoubleEntryFeatureはリストボックスの名称、lListIndexはLong型で、リストボックスのインデックス値が入ります。
この時は
lListIndex = Me.lst_DoubleEntryFeature.SelectedIndex
です。
lListIndexの値が存在するインデックスを示していることは確認しました。

この一文を実行した場所で、「インデックスが配列の境界外です」というエラーが発生します。
次の行が実行されないので、この一文でエラーが発生しているのですが、指示したアイテムは正常にリムーブされています。

こんな状態なのですが、なにか思い当たるところはありませんか?
とても困っています。
よろしくお願いします。

A 回答 (3件)

>結果、メッセージボックス「check1」が出て、OKを押すと、落ちます。


むむっ

>エラーログに、件名に書いたメッセージが出ます。
>つまり、この処理自体は、1回しか動いていません。
なるほど

でもデバッグしないとわかりませんね。



ところで
>(DLLのプログラムなので、デバッグモードが使えないんです)
とありましたが、DLLをデバッグすることは出来ますよ。


ヤブヘビかもしれませんが、一応簡単な説明を書いておきます


まずDLLのソリューションを開きます。

※実行から行う方法
ソリューションエクスプローラでプロジェクトファイルを選択した状態にして、メニューバーより
・「プロジェクト」→「プロパティ」でプロパティページを表示
・「構成プロパティ」の「デバッグ」を選択

・アプリ系なら
 「外部プログラムの開始」を選択し、DLLを呼び出すための、最初のEXEを記述
・WEB系なら
 「URLの開始」を選択し、DLLを呼び出すための、URLを記述
 さらにASP.NET絡みなら「有効にするデバッグ」で「ASP.NET デバッグ」を有効にする


※既に実行しているアプリケーションをアタッチする方法
あらかじめ、DLLを呼ぶEXEもしくはURLを起動しておきます。
メニューバーより
・「デバッグ」→「プロセス」を選択
・アタッチしたいプロセスを選択してアタッチ

この回答への補足

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

アドバイスをありがとうございました。

補足日時:2005/02/14 21:23
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/02/14 20:11

完全推測です。



>この一文でエラーが発生しているのですが、指示したアイテムは正常にリムーブされています。
エラーが発生しているのに「正常にリムーブ」されているのですね?

(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 & "削除")
とかして、何回処理が通るかを教えてもらえませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

そうなんですよね。同じ処理を何度も通っているのではないか、とは、私も疑いましたので、

msgbox("check1")
Me.lst_DoubleEntryFeature.Items.RemoveAt(lListIndex)
msgbox("check2")

この状態にして実行してみました。
(DLLのプログラムなので、デバッグモードが使えないんです)

結果、メッセージボックス「check1」が出て、OKを押すと、落ちます。
エラーログに、件名に書いたメッセージが出ます。
つまり、この処理自体は、1回しか動いていません。

こんな状態です。
いかがでしょうか?

お礼日時:2005/02/14 19:47

削除するとIndexが変わるんだな。


昇順ではなく降順で削除するのが定石。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

昇順、降順の問題でしょうか…?
カレント行を1行削除するだけなのですが。

お礼日時:2005/02/14 19:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!