複数のファイルを表示させたい

タグの編集
投稿者 kent  (社会人) 投稿日時 2009/9/15 19:55:46
penFileDialogクラスを使って複数のファイルを選択表示させたいと思ってます。

MultiselectプロパティをTrueにしていますが、5つのファイルを選択しても
最後のファイル名しか表示されません。


        If OpenFileDialog1.ShowDialog( ) = Windows.Forms.DialogResult.OK Then
            Dim fname As String
            For Each fname In OpenFileDialog1.FileNames
                TextBox1.Text = fname
               
            Next
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/9/15 20:13:33
TextBox1.Text ではなく、ListBox1.Items.Add や、
TextBox1.AppendText を使ってみてください。

For Each fname In OpenFileDialog1.FileNames
   TextBox1.Text = fname
Next
これだと、ループのたびに Text を「置き換え」ているので、
最終的に残るのは、最後のループ結果のみになってしまいますよ。
投稿者 kent  (社会人) 投稿日時 2009/9/15 20:29:30
有り難うございます。下記のコードでもいいんですよね。
 If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Dim fname As String
            For Each fname In OpenFileDialog1.FileNames
                TextBox1.Text += fname & vbCrLf
            next

たいへん厚かましいのですが、画像ファイルを複数読み込んで、自動的に複数のPictureBoxに
読み込ませることは可能でしょうか?
一度に読み込んだ画像ファイルを配列に格納してからPictureBoxに表示するというやり方なのでしょうか?
投稿者 よねKEN  (社会人) 投稿日時 2009/9/15 21:52:32
> 下記のコードでもいいんですよね。

追加する方法としてはOKです。
ただし、追記を繰り返す形に変わったので、
For文の前でTextBox1をクリアするといった処理が必要かもしれません。

> 画像ファイルを複数読み込んで、自動的に複数のPictureBoxに
読み込ませることは可能でしょうか?

「TextBox1.Text += fname & vbCrLf」
この処理の場所で同様にfnameを使って、PictureBoxに読み込ませるコードを書けばよいでしょう。
投稿者 kent  (社会人) 投稿日時 2009/9/15 22:08:29
>「TextBox1.Text += fname & vbCrLf」
>この処理の場所で同様にfnameを使って、PictureBoxに読み込ませるコードを書けばよいでしょう


有り難うございます。
しかし、これでは同じ画像が並んでしまうのですが

If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Dim fname As String
            TextBox1.Text = ""
            
            For Each fname In OpenFileDialog1.FileNames
                TextBox1.Text += fname & vbCrLf



                PictureBox1.Image = Image.FromFile(fname)
                
                PictureBox2.Image = Image.FromFile(fname)
                
                PictureBox3.Image = Image.FromFile(fname)


                PictureBox4.Image = Image.FromFile(fname)
                
                PictureBox5.Image = Image.FromFile(fname)


                

               
            Next
投稿者 YuO  (社会人) 投稿日時 2009/9/15 22:23:20
最初と同じ間違いをしていますよ。

PictureBox1.ImageにはOpenFileDialog1.FileNames(0)のイメージを,
PictureBox2.ImageにはOpenFileDialog1.FileNames(1)のイメージを,
etc...
というように,それぞれ別々のイメージをロードしなければいけません。
投稿者 kent  (社会人) 投稿日時 2009/9/15 22:41:39
有り難うございます。
このワザは知りませんでした。(あちらこちら調べまわったのですが、なかなかみつけられませんでした)
しかし、このような冗長なコードでいいのですか?

If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Dim fname As String
            Dim fname1 As String
            Dim fname2 As String
            Dim fname3 As String
            Dim fname4 As String
            
            

            fname = OpenFileDialog1.FileNames(0)
            fname1 = OpenFileDialog1.FileNames(1)
            fname2 = OpenFileDialog1.FileNames(2)
            fname3 = OpenFileDialog1.FileNames(3)
            fname4 = OpenFileDialog1.FileNames(4)

            PictureBox1.Image = Image.FromFile(fname)

            PictureBox2.Image = Image.FromFile(fname1)

            PictureBox3.Image = Image.FromFile(fname2)


            PictureBox4.Image = Image.FromFile(fname3)

            PictureBox5.Image = Image.FromFile(fname4)

投稿者 ?-?  (その他) 投稿日時 2009/9/15 23:02:33
> しかし、このような冗長なコードでいいのですか?
気になるなら、繰り返し処理で処理してみたらどうでしょう?
投稿者 よねKEN  (社会人) 投稿日時 2009/9/15 23:21:31
> しかし、このような冗長なコードでいいのですか?

よいかどうかを決めるのはkentさん次第です。
仕様(期待する動作)を満たしているなら、まずはOKでしょう。
満たしていないなら、そちらを解決するのが先だと思います。
その上で、より綺麗なコードにならないかを考えるのはよいことです。

で、問題がないかどうかについてですが、例えば、
選択されるファイル数が5つ以外だった場合にエラーになりますね。

私だったらどうするかという一例を以下に示します。
--
'前提:選択する画像の数は配置しているPictureBoxの数と同じにしてもらう、という仕様としています。

If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    Dim pictureBoxes() As PictureBox = New PictureBox(){ _
        PictureBox1, PictureBox2, PictureBox3, PictureBox4, PictureBox5 }
    If OpenFileDialog1.FileNames.Length = pictureBoxes.Length Then
        TextBox1.Text = ""

        For fileIndex As Integer = 0 To pictureBoxes.Length - 1
            Dim fname As String = OpenFileDialog1.FileNames(fileIndex)

            TextBox1.Text &= fname & vbCrLf

            Using fs As Stream = New FileStream(fname)
                pictureBoxes(fileIndex).Image = Image.FromStream(fs, FileMode.Open)
            End Using
        Next
    Else
        MessageBox.Show("ファイルは" & pictureBoxes.Length.ToString() & "つ選択してください。")
    End If
End If
--
このコードではPictureBox1~PitucreBox5への画像の設定をループ処理で行うために、
PictureBox1~PitucreBox5をPictureBoxの配列に予め設定するようしている
ところがポイントです。
#Using句を使っていたり、Image.FromFileの代わりにImage.FromStreamを使うように修正
#していますが、この辺りは、ご質問の本題とは無関係ですので、あまり気になさらずに・・・
投稿者 あにす  (社会人) 投稿日時 2009/9/16 01:04:08
読み込む画像の数が不定ならその場で必要なだけ作るのもいいと思います。
If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    For Each file As String In OpenFileDialog1.FileNames()
        Dim pictureBox As New PictureBox()
        pictureBox.Image = Image.FromFile(file)
        pictureBox.Size = pictureBox.Image.Size
        Me.FlowLayoutPanel1.Controls.Add(pictureBox)
        pictureBox.Show()
    Next
End If
投稿者 kent  (社会人) 投稿日時 2009/9/16 04:21:50
奥が深いですね。おもわずため息がでました。
道は遠いですが、一歩ずつ階段をのぼるように学びを深めていきたいと思っています。
みなさん、ありがとうございます。