none
ListViewへの画像の登録について RRS feed

  • 質問

  • 先日「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

    のようになります。
    説明が下手で誠に申し訳ありませんが、よろしくお願いします。

    2009年1月31日 7:55

回答

  • まどかさん
    Michael-Kさん

    お返事ありがとうございます。
    教えて頂いた通り、

    ・変数の内容の見た目の文字列と"変数.Length"が異なっているかの確認
    ・配列に何か問題あるかの確認

    を行ってみたのですが、特に異常は見当たりませんでした。

    しかし、何度か試し色々なところを修正していたら無事に実行できるようになりました。
    どこが問題だったのか、その原因は掴めず仕舞いですが、
    これ以上悩んでいても無駄に時間を費やしてしまうし、皆様にもご迷惑をお掛けしてしまうので、
    これでひとまず終了にしたいと思います。

    私のために色々と考え、アドバイスを下さって本当にありがとうございました。
    また他の所で疑問点等が出てきましたら、よろしくお願いします。
    ありがとうございました。
    • 回答としてマーク Kana_San 2009年2月3日 4:42
    2009年2月3日 4:42

すべての返信

  • Kana_San さん の発言:

        Dim anImage As System.Drawing.Image = _
            Image.FromFile(phtPath & "\Resized\" & phtName(i))   ← ここでエラーが出ます


    コードを見せて頂いたところで、正直なところ分かりません。
    とりあえず、Image.FromFileに連結した文字列を直接渡すのではなく、一旦文字列変数に代入して、例外が起きたときの文字列を確認してみて下さい。
    恐らく、予想と異なったファイル名になっていませんか?


    参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。
    2009年2月1日 22:30
    モデレータ
  • Azuleanさん

    ご返信ありがとうございます。

    とりあえず、Image.FromFileに連結した文字列を直接渡すのではなく、一旦文字列変数に代入して、例外が起きたときの文字列を確認してみて下さい。
    恐らく、予想と異なったファイル名になっていませんか?

    教えて頂いた通り、Image.FromFileに文字列変数へ代入した値を入れて実行してみました。

    しかし、例外が起きた時の文字列を見ましたが、正しいフルパスになっていました。

    ただ、その際色々と試したところ、

    ・ファイル数が19以下のときは例外は起きない
    ・ファイル数が20の時は例外が起きる場合と起きない場合がある
     例外が起きるときは「i=19」
    ・ファイル数が21以上のときは例外は起きる
     例外が起きるのは「i=19」or「i=20」

    と言う結果が出ました。
    そこから考えると、一度に登録できる画像の数等に制限でもあるのかな?等と考えてみたのですが、
    それ以上何をすればいいかが分かりませんでした。

    また何かアドバイスを頂けると嬉しいです。
    よろしくお願いします。
    2009年2月1日 23:49
  •  例外が発生した時、FileNotFoundExceptionのFileNameプロパティには何がセットされていますでしょうか?
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月2日 0:49
    モデレータ
  • trapemiyaさん


    お返事ありがとうございます。

     例外が発生した時、FileNotFoundExceptionのFileNameプロパティには何がセットされていますでしょうか?


    試してみたところ、「Nothing」になっていました。
    やっぱり正常に読み込めてないということでしょうか。

    例外が発生した後、そのまま続行させると正常に終了してくれるのですが・・・。

    また何か分かりましたらよろしくお願いします。
    2009年2月2日 1:19
  • ごめんない。FileNameはNothingになりますね。こちらで試したところMessageに見つからなかったファイル名がセットされているようですので、そこを確認してみて下さい。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月2日 1:50
    モデレータ
  •        
            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

    でどうなるでしょうか。

    2009年2月2日 2:51
  • 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

    早速書いて頂いたコードで実行してみたのですが、ループの途中でElseへ入り処理が止まってしまいました。
    実際にはファイルは存在してパスもあってるはずですが、この結果からはやっぱりファイルは存在しないということになっているんですよね。
    処理をやり直したらちゃんと動く場合もあるので、私の設定方法等が間違っているのでしょうか?

    何度も付き合っていただくのは大変心苦しいのですが、また何か分かりましたらアドバイスお願いします。
    2009年2月2日 4:50
  • 見た目が一緒→存在するのにおかしい、ということから
    変数の中にコントロールキャラクタが含まれていることが考えられます。

    例外が発生した時の変数の内容の見た目の文字数と"変数.Length"が異なっていないか確認してみてください。
    もし違うなら、ブレイク時に自動変数ウィンドウやクィックウォッチウィンドウに変数の値を表示させて
    右クリックメニューで16進数表示するとよいでしょう。
    2009年2月2日 11:07
  •  phtPath は、定数でしょうから、phtName(i) の配列を作るところに、何かあるのではないでしょうか。
    2009年2月3日 2:13
  • まどかさん
    Michael-Kさん

    お返事ありがとうございます。
    教えて頂いた通り、

    ・変数の内容の見た目の文字列と"変数.Length"が異なっているかの確認
    ・配列に何か問題あるかの確認

    を行ってみたのですが、特に異常は見当たりませんでした。

    しかし、何度か試し色々なところを修正していたら無事に実行できるようになりました。
    どこが問題だったのか、その原因は掴めず仕舞いですが、
    これ以上悩んでいても無駄に時間を費やしてしまうし、皆様にもご迷惑をお掛けしてしまうので、
    これでひとまず終了にしたいと思います。

    私のために色々と考え、アドバイスを下さって本当にありがとうございました。
    また他の所で疑問点等が出てきましたら、よろしくお願いします。
    ありがとうございました。
    • 回答としてマーク Kana_San 2009年2月3日 4:42
    2009年2月3日 4:42
  • Kana_San さん の発言:

    しかし、何度か試し色々なところを修正していたら無事に実行できるようになりました。
    どこが問題だったのか、その原因は掴めず仕舞いですが、
    これ以上悩んでいても無駄に時間を費やしてしまうし、皆様にもご迷惑をお掛けしてしまうので、
    これでひとまず終了にしたいと思います。

    原因が分からずに再現しなくなったという場合、その原因自体が取り除けていない可能性が残っているため、また再現するようになるかもしれません。
    そういったリスクがあることは頭に置いておいて下さい。

    チーム開発・業務開発では、自分だけで閉じず、関連するメンバーにフィードバックして、自身だけで判断しないとかそういった対策も必要です。


    参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。
    2009年2月3日 14:00
    モデレータ