none
サムネイルで選んだ画像を表示することについて RRS feed

  • 質問

  • こんにちは美流久です

    今回もちゃんとつたえられるか分かりませんが、投稿させて頂きます。

    form1にはサムネイルがあり、印刷ボタンが有ります。form2にはpictureboxがあります。

    今、共有モジュールでhttp://support.microsoft.com/kb/311319/jaこのような感じで、form1の物をform2へ情報を持って行こうとしています。

    コード的にはこうしました。

    form1に記入してあります。

    Module mainmodule
        Public main As String = (System.IO.Path.GetFullPath("path"))
        Public main2 As String = (System.IO.Path.GetFullPath("a"))
        Public main3 As String = (System.IO.Path.GetFullPath("b"))
        Public main4 As String = (System.IO.Path.GetFullPath("c"))
    End Module

    form2には・・・

    TextBox1.Text = (main)
            TextBox2.Text = (main2)
            TextBox3.Text = (main3)
            TextBox4.Text = (main4)

    とパスを絶対パスにした場合でデバックすると、起動しているVBの保存先が

    c:¥vb¥
    の場所だったりすると、サムネイルの画像のパスの情報が欲しいのに

    c:¥vb¥path

    c:¥vb¥a

    などになってしまいます。これは何ででしょうか??サイトでぐぐってみたりしましたが解決できませんでした。ご伝授おねがいします。

     

    2007年1月29日 1:24

回答

  • こんにちはお久しぶりです。

    '’’’’’’’’サムネイル’’’’’’’’’
            'folder内の全てのディレクトリ
            '必要な変数宣言
            Dim stprompt As String = String.Empty
            'ディレクトリ列挙
            For Each stdirpath As String In System.IO.Directory.GetFiles("C:\\", "*.jpg")
                stprompt &= stdirpath & System.Environment.NewLine
            Next stdirpath
            ''初期クリア''
            ListView1.Clear()
            'フォルダを開く
            Dim fbd As New FolderBrowserDialog
            'テキスト指定
            fbd.Description = "フォルダを指定して下さい"
            'ルートフォルダ指定
            fbd.RootFolder = Environment.SpecialFolder.Desktop
            '一番初めのフォルダ指定
            fbd.SelectedPath = "C:windows"
            'dialog表示'
            '選択されたフォルダを表示する
            Console.Write(fbd.SelectedPath)
            Dim imagedir As String
            If fbd.ShowDialog(Me) = DialogResult.OK Then

    #ダイアログokおしたあと、そのあとの処理記述しlistviewに画像(サムネイル)表示

    コレはコードの一部ですが、サムネイル表示の部分を記述しました。

    パスのやりとりがなかなか出来ないため、ちょっとずつやっていこうと思い、clipboardを使ってみようかと思いましたが・・・

    setdataobject()などでクリップボードにコピーやpictureboxに貼り付けるためのコードをしてみました。

    しかし、埋め込んだ画像pictureboxから(コピーをし)picturebox(貼り付け)ではコピー・貼り付けが出来るのに

    listviewでは出来ません。もともとlistviewではコピー(clipboard)自体無理なのでしょうか?

    どなたかご教授お願いします。

    2007年2月20日 2:20
  • trapemiyaさん

    じーぷさんお久しぶりですコンニチハ☆

    あのあと、サムネイルではなく、largeimagelistでlistviewに表示させ、form2へ反映出来ました。

    回答済みにしていなかったので報告しました。

     

    迷惑かけてすみませんorz

     

    以下コードでlargeimagelistにしました。

    dim fbd as new  folderbrowserdialog

    dim path as string

           

                 If fbd.ShowDialog = Windows.Forms.DialogResult.OK Then
              path = System.IO.Directory.GetFiles(fbd.SelectedPath, "*.jpg")

                 ImageList1.ImageSize = New Size(60, 60)
                 ListView1.LargeImageList = ImageList1
                 For i As Integer = 0 To path.Length - 1
                   img = Bitmap.FromFile(path(i))
                   ImageList1.Images.Add(img)
                   ListView1.Items.Add(path(i), i)

               Next
            End If

    ------

    dim i as integer=0

    dim f2 as new form2

    f2.show()

     

    img=bitmap.fromfile(path(i))

    f2.picturebox1.image=img

     

    -----

    コード一部です。

    あと、悩んでたパス取得が取れるようになりました。

    どうもありがとうございます☆

     


     

    2007年5月22日 1:46

すべての返信

  • http://msdn2.microsoft.com/ja-jp/library/system.io.path.getfullpath(VS.80).aspx

    > このメソッドは、現在のディレクトリと現在のボリュームの情報を使用して、path を完全に限定します。
    > path にファイル名だけを指定すると、GetFullPath は、現在のディレクトリの絶対パスを返します。

    保存先を指定するとそこが「現在のディレクトリ(System.Environment.CurrentDirectory)」になってしまったと思います。
    http://msdn2.microsoft.com/ja-jp/library/system.environment.currentdirectory(VS.80).aspx

    画像が入っているフォルダのパスは別に取得しておいて、Path.Combine()等を使って画像へのパスを作成するのがよいかと思います。
    http://msdn2.microsoft.com/ja-jp/library/system.io.path.combine(VS.80).aspx

    2007年1月29日 1:43
  • どっとねっとふぁんさん

    こんにちは★返事が遅くなりすみません、

     どっとねっとふぁん さんからの引用

    画像が入っているフォルダのパスは別に取得しておいて、Path.Combine()等を使って画像へのパスを作成するのがよいかと思います。
    http://msdn2.microsoft.com/ja-jp/library/system.io.path.combine(VS.80).aspx

    もともとあったサムネイル画像からpictureboxへ画像を・・・というような感じにしたいんですが

    path.combineを使うのですか?元々のパスをpublic使ってform1からform2へ取得という感じでは無理でしょうか?

    画像へのパスをまた作成したほうがいいんでしょうか

    path.combineの事も調べてやってみます♪

    2007年1月31日 2:57
  • (・∀・)ノ こんにちは!

     

    画像へのフルパスは、前のスレでもう取れてるんですよね…?

    (「C:\画像\画像1.jpg」みたいな感じ)

     

    今回の投稿をみてると、Form1のModule内のメンバはちゃんとForm2で見れてるようなので、

    Module内のメンバに、画像のフルパスをそのまま保持させれば、Form2でフルパスとして認識できないですか?

    System~でやってる意味がよくわからないのですが、何か意図したところでもあるのでしょうか?

    (・ω・`)

     

    2007年1月31日 4:10
  • ジープさんこんにちは~

     ジープ さんからの引用
    画像へのフルパスは、前のスレでもう取れてるんですよね…?

    (「C:\画像\画像1.jpg」みたいな感じ)

    ハイ。取れています。 

     ジープ さんからの引用
    今回の投稿をみてると、Form1のModule内のメンバはちゃんとForm2で見れてるようなので、

    Module内のメンバに、画像のフルパスをそのまま保持させれば、Form2でフルパスとして認識できないですか?

    System~でやってる意味がよくわからないのですが、何か意図したところでもあるのでしょうか?

    (・ω・`)

    はい、、、見れていています。でも、フルパスすると、二個くらい前に書きましたけど・・・ローカルの全然関係の無いパスが出てきますw

    多分。。。画像へのフルパスが間違ってるかもしれませんorz

    system.io~とやっているのはサンプルを参考にしているからです。どれを見てもsystemとかいているので、試しにやっています★

    じゃんぬさんのHP参考http://jeanne.wankuma.com/tips/path/getfullpath.html

    2007年1月31日 5:13
  • とりあえず、今現在どんなパスが取れてきているのかを式ウォッチなどで確認するのが先でしょうか。
    どこが間違っているかを自分で探していく必要があります。いわゆる 「問題の切り分け」 というやつですね。

    2007年1月31日 5:19
  •  こんにちは★

    遅くなりました

     じゃんぬねっと さんからの引用
    とりあえず、今現在どんなパスが取れてきているのかを式ウォッチなどで確認するのが先でしょうか。
    どこが間違っているかを自分で探していく必要があります。いわゆる 「問題の切り分け」 というやつですね。

    現在サムネイルで取れているパスですが、directory.getfiles()でした^^;

    これをモジュールに

    module mainmodule

    public f2 as string=(ここにサムネイルで取得したパスを指定)

    end module

    別formではmoduleで指定したパスを

    textbox1.text(f2)

    という風にして試しています。

    今はpictureboxで表示させるというよりも、textboxでパスを表示させる所までやっていますが、サムネイルで取得したパスが別のformでは取得出来ません。

    やはり、

     どっとねっとふぁん さんからの引用
    画像が入っているフォルダのパスは別に取得しておいて、Path.Combine()等を使って画像へのパスを作成するのがよいかと思います。
    http://msdn2.microsoft.com/ja-jp/library/system.io.path.combine(VS.80).aspx

    という風にしないと無理でしょうか?

    2007年2月9日 2:26
  • 美流久さん、こんにちは。

     美流久 さんからの引用
    別formではmoduleで指定したパスをtextbox1.text(f2)という風にして試しています。
    今はpictureboxで表示させるというよりも、textboxでパスを表示させる所までやっていますが、サムネイルで取得したパスが別のformでは取得出来ません。

    これは変ですね。

    取得したパスは f2 に格納されているわけですよね。
    そして、f2 は標準モジュールのメンバです。
    どの位置から参照しても、期待した f2 の中身が取得できるハズです。

    それとも、"サムネイルで取得したパス" とは別の意味を指していますか?
    日本語的な問題ですが、「サムネイルからパスは取得できない」 ですよね。

    2007年2月9日 3:16
  • すみません、内容が誤っておりましたので撤回させていただきます。m(_ _)m

     

    2007年2月9日 5:47
  • (・∀・)ノ こにちわー

     

     

    >現在サムネイルで取れているパスですが、directory.getfiles()でした^^;

    >これをモジュールに

    >    module mainmodule

    >    public f2 as string=(ここにサムネイルで取得したパスを指定

    >    end module

     

    System.Io.path.GetFullpath と Directory.getfiles の実行時の違いはわかりました?

    あたしは今テストプログラム作ってみたんですが、

    System.Io.path.GetFullpath( "aaa.txt") では 「現在実行ファイルがおいてあるパス+aaa.txt」 がとれました。

    Directory.getfiles("C:\", "a*") では 第一因数のディレクトリ内にある、aで始まるファイルへのフルパスが全てとれました。

    #実際使ったことないメソッドだったので…(ノ∀`)

     

    わるさをしているとすれば、そのファイルパスを取得する部分だと思います。

    現在のexeがあるパス、取得したいファイルがあるパスを手元に控えて、ブレークポイント張りながら実行することをオススメします。

    (ノ・ω・)ノ ふぁいとー

     

    2007年2月9日 6:18
  •  じゃんぬねっと さんからの引用
    それとも、"サムネイルで取得したパス" とは別の意味を指していますか?
    日本語的な問題ですが、「サムネイルからパスは取得できない」 ですよね。

    すみませんまちがえてますよねw実際のパスはファイルのパスです。んー。folderbrowserdialogから取得したパスです^^;

     ジープ さんからの引用
    System.Io.path.GetFullpath と Directory.getfiles の実行時の違いはわかりました?

    あたしは今テストプログラム作ってみたんですが、

    System.Io.path.GetFullpath( "aaa.txt") では 「現在実行ファイルがおいてあるパス+aaa.txt」 がとれました。

    わざわざテストしてくれてありがとうございます。

    ハイ。フルパスが良くわからなかったんですが、デバックしたら実行ファイル名が出ちゃうので疑問に思っていましたが。フルパスはそうゆうものなんですよね?

     ジープ さんからの引用
    取得したいファイルがあるパスを手元に控えて、ブレークポイント張りながら実行することをオススメします。

    今さっきブレークポイントしてみながらやっています。初めてブレークポイント使っていますw便利ですね♪少し手探りでやってみてまた出来なかったらコード書いて質問します;;

    2007年2月9日 7:49
  • >フルパスが良くわからなかったんですが、デバックしたら実行ファイル名が出ちゃうので疑問に思っていましたが。フルパスはそうゆうものなんですよね?

    Σ(´Д`;)

    フルパスはFullPath…よーするにハードディスクとか根本のところから、そのファイルまでのPathです…。

    フルパスはドライブからファイル名までが表示されたものであって、プログラムで取れたからフルパスというものではありません。(c:\Microsoft\Microsoft.net\Project\実行ファイル名.exeのよーな感じ)

    実行ファイルまでのフルパスもフルパスですが、サムネイルに表示しているであろうファイルへのフルパスもフルパスです(何言ってるかわからなくなってきたwww)

    なんかCドライブから始まってるパスだからフルパス?ではなく、キチンとフルパスの単語の意味を調べてみましょう。(・ω・`)

    2007年2月9日 9:03
  • ちょっと整理してでなおしてきます 

    2007年2月9日 9:15
  •  ジープ さんからの引用
    >フルパスが良くわからなかったんですが、デバックしたら実行ファイル名が出ちゃうので疑問に思っていましたが。フルパスはそうゆうものなんですよね?

    Σ(´Д`;)

    フルパスはFullPath…よーするにハードディスクとか根本のところから、そのファイルまでのPathです…。

    フルパスはドライブからファイル名までが表示されたものであって、プログラムで取れたからフルパスというものではありません。(c:\Microsoft\Microsoft.net\Project\実行ファイル名.exeのよーな感じ)

    実行ファイルまでのフルパスもフルパスですが、サムネイルに表示しているであろうファイルへのフルパスもフルパスです(何言ってるかわからなくなってきたwww)

    なんかCドライブから始まってるパスだからフルパス?ではなく、キチンとフルパスの単語の意味を調べてみましょう。(・ω・`)

    ですよね(悲

    わけわかんなくなるまで考えさせてしまって申し訳ないです;;

    何個か前に書きましたが、現在取れているパスがフルパスではないので、フルパスは指定するのを辞めたんですが、

    でもフルパスが楽だと言うぅ事がだんだん分かってきました。

    自分も意味分かんない質問ばっかでごめんなさい;;

     

    2007年2月9日 9:23
  • こんにちはお久しぶりです。

    '’’’’’’’’サムネイル’’’’’’’’’
            'folder内の全てのディレクトリ
            '必要な変数宣言
            Dim stprompt As String = String.Empty
            'ディレクトリ列挙
            For Each stdirpath As String In System.IO.Directory.GetFiles("C:\\", "*.jpg")
                stprompt &= stdirpath & System.Environment.NewLine
            Next stdirpath
            ''初期クリア''
            ListView1.Clear()
            'フォルダを開く
            Dim fbd As New FolderBrowserDialog
            'テキスト指定
            fbd.Description = "フォルダを指定して下さい"
            'ルートフォルダ指定
            fbd.RootFolder = Environment.SpecialFolder.Desktop
            '一番初めのフォルダ指定
            fbd.SelectedPath = "C:windows"
            'dialog表示'
            '選択されたフォルダを表示する
            Console.Write(fbd.SelectedPath)
            Dim imagedir As String
            If fbd.ShowDialog(Me) = DialogResult.OK Then

    #ダイアログokおしたあと、そのあとの処理記述しlistviewに画像(サムネイル)表示

    コレはコードの一部ですが、サムネイル表示の部分を記述しました。

    パスのやりとりがなかなか出来ないため、ちょっとずつやっていこうと思い、clipboardを使ってみようかと思いましたが・・・

    setdataobject()などでクリップボードにコピーやpictureboxに貼り付けるためのコードをしてみました。

    しかし、埋め込んだ画像pictureboxから(コピーをし)picturebox(貼り付け)ではコピー・貼り付けが出来るのに

    listviewでは出来ません。もともとlistviewではコピー(clipboard)自体無理なのでしょうか?

    どなたかご教授お願いします。

    2007年2月20日 2:20
  •  美流久 さんからの引用

    しかし、埋め込んだ画像pictureboxから(コピーをし)picturebox(貼り付け)ではコピー・貼り付けが出来るのに

    listviewでは出来ません。もともとlistviewではコピー(clipboard)自体無理なのでしょうか?


    ListViewの項目に画像の貼り付けは無理でしょう。文字列であれば、LabelEditプロパティをTrueにすることにより可能です。

    ところで、パスの取得をがんばってみましょう。ここであきらめるのはもったい無いと思います。
    うまく行かないのであれば、どう考えて、どうやったらできなかったのか、できるだけわかりやすく質問して下さい。
    わからないところがちゃんと質問できるというのは、実はそれだけプログラムに対して理解が深まっているという事です。それだけ力が付いてきているという事です。
    もし、うまく質問ができなければ、うまく行かない部分のコードを出しましょう。質問者も回答者も、今は問題点がはっきりと見えてない状態のような感じを受けます。

    2007年2月20日 4:51
    モデレータ
  •  trapemiya さんからの引用
    ListViewの項目に画像の貼り付けは無理でしょう。文字列であれば、LabelEditプロパティをTrueにすることにより可能です。

    あ!Σ(・д・;)いや・・・あの・・・ちゃんと書いていなくてすみません・・・

    画像を貼り付けるのはpictureboxです。listviewの画像は選んだサムネイルをクリップぼーどにコピーする。

    という意味です。。

     trapemiya さんからの引用
    ところで、パスの取得をがんばってみましょう。ここであきらめるのはもったい無いと思います。
    うまく行かないのであれば、どう考えて、どうやったらできなかったのか、できるだけわかりやすく質問して下さい。
    わからないところがちゃんと質問できるというのは、実はそれだけプログラムに対して理解が深まっているという事です。それだけ力が付いてきているという事です。
    もし、うまく質問ができなければ、うまく行かない部分のコードを出しましょう。質問者も回答者も、今は問題点がはっきりと見えてない状態のような感じを受けます。

    ですよね・・・パス取得、今後避けられない問題になってきますよね~・・・・

    後回しにしちゃうのよくないですよね(´・c_・` )ウーン・・

    publicメソッドがいまいちよく分からないんです;;まだまだ勉強不足です

    trapemiyaさんアドバイスいつもありがとうございます;;

     

    2007年2月20日 5:56
  • 【壁】・ω・)ノ こぬぬつは!

    クリップボードですか…実際使ったことないのでわかりませんが、同じオブジェクトにしか貼り付けられないことはわかりますw

    ListViewはListViewアイテムなので、どーにかしてPictureboxに反映できるモノに変換してあげないとどーすることも出来ないと思います。

     

    パス…そこまで出来てるのにうまくいきませんか…

    以下のプログラムを追加して、ブレークポイントつかってみてください。

    =========================================================

     Dim l_strPathList() as String

       '↓のfdbはミルクさんのフォルダーブラウザの変数です。

       l_strPathList = system.io.Directory.GetFiles( fbd.SelectedPath, "*.jpg")

       Dim l_iDataNum as Integer = l_strPathList.Length()

    =========================================================

    これで、l_strPathListには、サムネイル画像全てのフルパスが入ってると思います。

    フルパスの個数はl_iDataNumに取得されているはずです。

     

    たぶんこれと同じ方法でサムネイル画像表示してません?(そこのプログラムは表示されてないもので適当ですが…)

    ListViewのItemにAddで登録する際に、戻り値としてListViewItemをとり、

    ListViewItemのメンバのTagに、今回取得したパスを入れときます。

    ListViewでSelectedItemから、ListViewItemのTagを参照すれば、

    選択している分だけのパスが取れると思うのですが…

    ちょっとためしてみてください(U・ω・)ノ

    2007年2月20日 6:33
  •  美流久 さんからの引用

    画像を貼り付けるのはpictureboxです。listviewの画像は選んだサムネイルをクリップぼーどにコピーする。

    という意味です。。


    たいそう失礼いたしました。確かにこのスレの文脈から行けば、そのように理解すべきでした。

    ところで、そういうことであれば、ListViewからでもコピーすることは可能です。ListViewにサムネイルを表示する際に、一度ImageListに画像を格納していると思うのですが、その画像をクリップボードに入れてあげればOKです。
    例えば、こんな感じです。

       Dim imageIndex As Integer = ListView1.SelectedItems(0).ImageIndex

       Clipboard.SetDataObject(ImageList1.Images(imageIndex), False)

     美流久 さんからの引用

    ですよね・・・パス取得、今後避けられない問題になってきますよね~・・・・

    GetFilesでフルパスが取れているのであれば、それをForm2に渡してあげて、Form2でそのフルパスで渡された画像を表示するだけです。

    ListViewで選択したサムネイルから毎回Form2を開いて表示するのであれば(つまりForm2が複数開かれる)、フルパスはForm2を開く時のコンストラクタの引数として渡してあげれば良いでしょう。

    そうではなく、Form2は一度開いたら開きっぱなしにしておいて、ListViewでサムネイルを選択する度に同じForm2に表示するのであれば、Form2に画像を表示するメソッドを用意しておいて、それをForm1から実行してあげれば良いです。そのメソッドの引数は、画像へのフルパスです。
    例えば、
    Form2のインスタンス.画像を表示して(画像のフルパス)
    のようになります。

     美流久 さんからの引用

    publicメソッドがいまいちよく分からないんです;;まだまだ勉強不足です

    前述したForm2にある「画像を表示して(画像のフルパス)」メソッドは、Form1から呼ばなければなりません。なので、Form2はそのメソッドを公開しなければなりません。公開しないとForm1から見えないからです。この公開するためにpublicを使います。

    #ImageListの画像を直接渡して、「画像を表示して(ImageListに入っている画像)」メソッドでもいいかもしれません。前述で画像をクリップボードに送ったように、画像をForm2に取り込んで表示してもらうのです。(Form2へ画像を送り込むイメージ)

    2007年2月20日 7:13
    モデレータ
  • ジープさんこんにちは

     ジープ さんからの引用
    パス…そこまで出来てるのにうまくいきませんか…

    以下のプログラムを追加して、ブレークポイントつかってみてください。

    =========================================================

     Dim l_strPathList() as String

       '↓のfdbはミルクさんのフォルダーブラウザの変数です。

       l_strPathList = system.io.Directory.GetFiles( fbd.SelectedPath, "*.jpg")

       Dim l_iDataNum as Integer = l_strPathList.Length()

    =========================================================

    これで、l_strPathListには、サムネイル画像全てのフルパスが入ってると思います。

    フルパスの個数はl_iDataNumに取得されているはずです。

    多分このやり方でも出来ると思うんですが、今回http://www.atmarkit.co.jp/fdotnet/dotnettips/336listviewimage/listviewimage.htmlこんな感じにしています。

     ジープ さんからの引用
    ListViewのItemにAddで登録する際に、戻り値としてListViewItemをとり、

    ListViewItemのメンバのTagに、今回取得したパスを入れときます。

    ListViewでSelectedItemから、ListViewItemのTagを参照すれば、

    選択している分だけのパスが取れると思うのですが…

    これって、tagに入れるパスって言うのはココで言うとl_idatanumになるんでしょうか?

    tagに入れる事によって選択分のパスが取れるんですね☆これも初めて知りました

    trapemiyaさんこんにちは

     trapemiya さんからの引用
    前述したForm2にある「画像を表示して(画像のフルパス)」メソッドは、Form1から呼ばなければなりません。なので、Form2はそのメソッドを公開しなければなりません。公開しないとForm1から見えないからです。この公開するためにpublicを使います。

    form1の画像をform2で表示したい場合はpublicメソッドの追加ををform1で記述すればいいんでしょうか?私ずっとform2に記述していました;;

     trapemiya さんからの引用
    #ImageListの画像を直接渡して、「画像を表示して(ImageListに入っている画像)」メソッドでもいいかもしれません。前述で画像をクリップボードに送ったように、画像をForm2に取り込んで表示してもらうのです。(Form2へ画像を送り込むイメージ)

    imagelistには画像をいれていません。フォルダブラウザダイアログから選んだjpg画像をサムネイルで表し、その選んだサムネイルをform2で表示したいのです。

     

    2007年2月23日 0:56
  • (・∀・)ノ こにちわー

     

     美流久 さんからの引用

    '’’’’’’’’サムネイル’’’’’’’’’
            'folder内の全てのディレクトリ
            '必要な変数宣言
            Dim stprompt As String = String.Empty
            'ディレクトリ列挙
            For Each stdirpath As String In System.IO.Directory.GetFiles("C:\\", "*.jpg")
                stprompt &= stdirpath & System.Environment.NewLine
            Next stdirpath
            ''初期クリア''
            ListView1.Clear()
            'フォルダを開く
            Dim fbd As New FolderBrowserDialog
            'テキスト指定
            fbd.Description = "フォルダを指定して下さい"
            'ルートフォルダ指定
            fbd.RootFolder = Environment.SpecialFolder.Desktop
            '一番初めのフォルダ指定
            fbd.SelectedPath = "C:windows"
            'dialog表示'
            '選択されたフォルダを表示する
            Console.Write(fbd.SelectedPath)
            Dim imagedir As String
            If fbd.ShowDialog(Me) = DialogResult.OK Then

       これみるくさんのプログラムの引用なのですが、フォルダ選択ダイアログから選択したダイアログ内のjpgを、サムネイル画像として表示しているんですよね?多分…

       OKのあとにフォルダの中の全てのjpgファイルのフルパス取得して、そのフルパスをつかってイメージをつくり、ListViewに表示しているものとばかり思っていたのですが(;´Д`)チガウノカナ…

       私が実際言いたかったものを、みるくさんの参考にしたHPのプログラムを引用してたとえると、

      =======================================================

      <http://www.atmarkit.co.jp/fdotnet/dotnettips/336listviewimage/listviewimage.html>の引用です

     For i As Integer = 0 To jpgFiles.Length - 1
        Dim original As Image = Bitmap.FromFile(jpgFiles(i))
        Dim thumbnail As Image = createThumbnail(original, width, height)

        ImageList1.Images.Add(thumbnail)

        ①Dim l_ListViewItem as ListViewItem
        ②l_ListViewItem = ListView1.Items.Add(jpgFiles(i), i)

        ③l_ListVIewItem.tag = jpgFiles(i) 

        original.Dispose()
        thumbnail.Dispose()
      Next

     =======================================================

     ①、②、③の項目を追加、変更することにより、LitViewItemのTagメンバに、ファイルのフルパスが入るのです。

     このあと、ダイアログを表示して、アイテムを複数選択してからForm2の表示ボタンを押すときに

      ListView1.SelectItemsを参照するとおもうのですが、

     このときにListView1.SelectItems.Item(数値).Tagをみると、簡単にフルパスがとれるとゆーものでした。

     でもファイル名にフルパスつかってるならファイル名でも平気でしたね…(ノ∀`)ごめんなさい

     

     美流久 さんからの引用

    form1の画像をform2で表示したい場合はpublicメソッドの追加ををform1で記述すればいいんでしょうか?私ずっとform2に記述していました;;

    んー自分が頭悪いのかもしれませんが…解釈がいまいち…

    Form1からForm2に「フルパスを引数で渡す」のであれば、Form2にPublicメソッドがいります。

    しかし「module」にメンバ変数を用意し、その中にフルパスを入れるのであれば、Form2にはPublicメソッドはいらないと思います。

    前者の場合は

     ・Form2に「Public sub DataSet(Bybal str() as String)」っぽいのをつくり、Form1からはダイアログを表示する前に、From2.DataSet(画像のパスが入ったStringのリスト)を呼んであげればいいでしょう。

    後者の場合は

     ・Form2の表示ボタンを押したとき(ややこしいですがForm1の記述で)、Moduleに記述したメンバ変数にフルパスをセットしてあげてから、Form2_Lord関数内で、実際にPictureBoxに画像を表示するメソッドを入れてあげればいいです。

     

    またそこはかとなく間違ってたらごめんなさい(・Д・`)

     

    2007年2月23日 2:57
  •  美流久 さんからの引用
    多分このやり方でも出来ると思うんですが、今回http://www.atmarkit.co.jp/fdotnet/dotnettips/336listviewimage/listviewimage.htmlこんな感じにしています。

    えっと、示されたURLのコードを元にサンプルコードを書いてみます。

    Public Class ListViewSamnail

        Dim jpgFiles As String()

     

        Private Sub cbtn_hyouji_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbtn_hyouji.Click

            Dim imageDir As String = "c:\work\images" ' とりあえずjpegのあるフォルダ

     

            jpgFiles = System.IO.Directory.GetFiles(imageDir, "*.jpg")

     

            Dim width As Integer = 100

            Dim height As Integer = 80

     

            ImageList1.ImageSize = New Size(width, height)

            ListView1.LargeImageList = ImageList1

     

            For i As Integer = 0 To jpgFiles.Length - 1

                Dim original As Image = Bitmap.FromFile(jpgFiles(i))

                Dim thumbnail As Image = createThumbnail(original, width, height)

     

                ImageList1.Images.Add(thumbnail)

                ListView1.Items.Add(jpgFiles(i), i)

     

                original.Dispose()

                thumbnail.Dispose()

            Next

     

        End Sub

     

        Function createThumbnail(ByVal image As Image, ByVal w As Integer, ByVal h As Integer) As Image

            Dim canvas As New Bitmap(w, h)

     

            Dim g As Graphics = Graphics.FromImage(canvas)

            g.FillRectangle(New SolidBrush(Color.White), 0, 0, w, h)

     

            Dim fw As Double = CDbl(w) / CDbl(image.Width)

            Dim fh As Double = CDbl(h) / CDbl(image.Height)

            Dim scale As Double = Math.Min(fw, fh)

     

            Dim w2 As Integer = CInt(image.Width * scale)

            Dim h2 As Integer = CInt(image.Height * scale)

     

            g.DrawImage(image, (w - w2) \ 2, (h - h2) \ 2, w2, h2)

            g.Dispose()

     

            Return canvas

        End Function

      

        Private Sub ListView1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.Click

            Dim imageIndex As Integer = ListView1.SelectedItems(0).ImageIndex

     

            Dim form As New ListViewSamnailForm2

     

            form.ShowImage(jpgFiles(imageIndex))

     

            form.Show()

        End Sub

    End Class



    以下、Form2のコード

    Public Class ListViewSamnailForm2

        Public Sub ShowImage(ByVal imagePath As String)

     

            Using fs As New System.IO.FileStream(imagePath, System.IO.FileMode.Open)

                Me.PictureBox1.Image = Image.FromStream(fs)

            End Using

     

        End Sub

    End Class

    2007年2月23日 5:17
    モデレータ
  • trapemiyaさん

    じーぷさんお久しぶりですコンニチハ☆

    あのあと、サムネイルではなく、largeimagelistでlistviewに表示させ、form2へ反映出来ました。

    回答済みにしていなかったので報告しました。

     

    迷惑かけてすみませんorz

     

    以下コードでlargeimagelistにしました。

    dim fbd as new  folderbrowserdialog

    dim path as string

           

                 If fbd.ShowDialog = Windows.Forms.DialogResult.OK Then
              path = System.IO.Directory.GetFiles(fbd.SelectedPath, "*.jpg")

                 ImageList1.ImageSize = New Size(60, 60)
                 ListView1.LargeImageList = ImageList1
                 For i As Integer = 0 To path.Length - 1
                   img = Bitmap.FromFile(path(i))
                   ImageList1.Images.Add(img)
                   ListView1.Items.Add(path(i), i)

               Next
            End If

    ------

    dim i as integer=0

    dim f2 as new form2

    f2.show()

     

    img=bitmap.fromfile(path(i))

    f2.picturebox1.image=img

     

    -----

    コード一部です。

    あと、悩んでたパス取得が取れるようになりました。

    どうもありがとうございます☆

     


     

    2007年5月22日 1:46