トップ回答者
ListViewへの画像の登録について

質問
-
先日「ListViewでの画像の表示について」質問させて頂いた者です。
教えて頂いた内容を元にListViewに画像を登録・表示等々やりたい機能を実装することが出来たと思っていたのですが、
ImageListへ画像を登録する際に「FileNotFoundException はハンドルされませんでした。」とエラーが出るようになりました。
エラーが出た際に表示される「トラブルシューティングのヒント」を見ると、
「指定された場所にファイルが存在することを確認します。」
「相対パスを使用するとき、現在のディレクトリが正しいことを確認します。」
とありましたが、指定された場所にファイルはきちんと存在し、またパスは絶対パスで指定しています。
また、今回登録する画像は複数あり、そのパスはフォルダパス+ファイル名で指定しているのですが、
最初からエラーとなるわけではなく、ループの途中でエラーとなってしまいます。
そして、全く同じようにプログラムを動かしても、エラーが出る場所(ファイル)が異なります。
一応コードを抜粋して書いてみると
Dim phtItem(arrayCount) As ListViewItem
For i = 0 To arrayCount
Dim anImage As System.Drawing.Image = _
Image.FromFile(phtPath & "\Resized\" & phtName(i)) ← ここでエラーが出ます
imgList.Images.Add(anImage)
phtItem(i) = New ListViewItem()
phtItem(i).Text = ""
phtItem(i).ImageIndex = i
phtItem(i).SubItems.Add(phtName(i))
phtItem(i).SubItems.Add(phtDate(i))
phtItem(i).SubItems.Add(phtPath)
lstView.Items.Add(phtItem(i))
Next
のようになります。
説明が下手で誠に申し訳ありませんが、よろしくお願いします。
回答
-
まどかさん
Michael-Kさん
お返事ありがとうございます。
教えて頂いた通り、
・変数の内容の見た目の文字列と"変数.Length"が異なっているかの確認
・配列に何か問題あるかの確認
を行ってみたのですが、特に異常は見当たりませんでした。
しかし、何度か試し色々なところを修正していたら無事に実行できるようになりました。
どこが問題だったのか、その原因は掴めず仕舞いですが、
これ以上悩んでいても無駄に時間を費やしてしまうし、皆様にもご迷惑をお掛けしてしまうので、
これでひとまず終了にしたいと思います。
私のために色々と考え、アドバイスを下さって本当にありがとうございました。
また他の所で疑問点等が出てきましたら、よろしくお願いします。
ありがとうございました。
- 回答としてマーク Kana_San 2009年2月3日 4:42
すべての返信
-
Kana_San さん の発言:
Dim anImage As System.Drawing.Image = _
Image.FromFile(phtPath & "\Resized\" & phtName(i)) ← ここでエラーが出ます
コードを見せて頂いたところで、正直なところ分かりません。
とりあえず、Image.FromFileに連結した文字列を直接渡すのではなく、一旦文字列変数に代入して、例外が起きたときの文字列を確認してみて下さい。
恐らく、予想と異なったファイル名になっていませんか?
参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。 -
Azuleanさん
ご返信ありがとうございます。教えて頂いた通り、Image.FromFileに文字列変数へ代入した値を入れて実行してみました。とりあえず、Image.FromFileに連結した文字列を直接渡すのではなく、一旦文字列変数に代入して、例外が起きたときの文字列を確認してみて下さい。
恐らく、予想と異なったファイル名になっていませんか?
しかし、例外が起きた時の文字列を見ましたが、正しいフルパスになっていました。
ただ、その際色々と試したところ、
・ファイル数が19以下のときは例外は起きない
・ファイル数が20の時は例外が起きる場合と起きない場合がある
例外が起きるときは「i=19」
・ファイル数が21以上のときは例外は起きる
例外が起きるのは「i=19」or「i=20」
と言う結果が出ました。
そこから考えると、一度に登録できる画像の数等に制限でもあるのかな?等と考えてみたのですが、
それ以上何をすればいいかが分かりませんでした。
また何かアドバイスを頂けると嬉しいです。
よろしくお願いします。 -
trapemiyaさん
お返事ありがとうございます。わざわざ試していただいて本当にありがとうございます。こちらで試したところMessageに見つからなかったファイル名がセットされているようですので、そこを確認してみて下さい。
仰る通り、Messageに例外が起きたファイル名(フルパス)がセットされていました。
やっぱり私の設定がおかしいのでしょうか?
Michael-Kさん
お返事ありがとうございます。Dim phtItem(arrayCount) As ListViewItem
For i = 0 To arrayCount
If My.Computer.FileSystem.FileExists(phtPath & "\Resized\" & phtName(i)) Then
Dim anImage As System.Drawing.Image = Image.FromFile(phtPath & "\Resized\" & phtName(i))
Else
Stop
End If
Next
実際にはファイルは存在してパスもあってるはずですが、この結果からはやっぱりファイルは存在しないということになっているんですよね。
処理をやり直したらちゃんと動く場合もあるので、私の設定方法等が間違っているのでしょうか?
何度も付き合っていただくのは大変心苦しいのですが、また何か分かりましたらアドバイスお願いします。
-
まどかさん
Michael-Kさん
お返事ありがとうございます。
教えて頂いた通り、
・変数の内容の見た目の文字列と"変数.Length"が異なっているかの確認
・配列に何か問題あるかの確認
を行ってみたのですが、特に異常は見当たりませんでした。
しかし、何度か試し色々なところを修正していたら無事に実行できるようになりました。
どこが問題だったのか、その原因は掴めず仕舞いですが、
これ以上悩んでいても無駄に時間を費やしてしまうし、皆様にもご迷惑をお掛けしてしまうので、
これでひとまず終了にしたいと思います。
私のために色々と考え、アドバイスを下さって本当にありがとうございました。
また他の所で疑問点等が出てきましたら、よろしくお願いします。
ありがとうございました。
- 回答としてマーク Kana_San 2009年2月3日 4:42
-
Kana_San さん の発言:
しかし、何度か試し色々なところを修正していたら無事に実行できるようになりました。
どこが問題だったのか、その原因は掴めず仕舞いですが、
これ以上悩んでいても無駄に時間を費やしてしまうし、皆様にもご迷惑をお掛けしてしまうので、
これでひとまず終了にしたいと思います。原因が分からずに再現しなくなったという場合、その原因自体が取り除けていない可能性が残っているため、また再現するようになるかもしれません。
そういったリスクがあることは頭に置いておいて下さい。
チーム開発・業務開発では、自分だけで閉じず、関連するメンバーにフィードバックして、自身だけで判断しないとかそういった対策も必要です。
参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。