サムネイルリスト内で重複しないように追加していくには?

解決


うい  2006-05-12 09:46:33  No: 131364

環境はVisual  Studio2003  WindowsXPです。
実行ファイルと同じフォルダにある画像をサムネイル表示するツールを作ってます。

http://www.atmarkit.co.jp/fdotnet/practprog/index/index.html
で紹介されてるコンポーネントをそのまま使ってます。
最初、ボタンをクリックするたびにサムネイルが表示されるようにつくったら、クリックするたび同じ画像が追加されるので
2回目からは同じ画像が追加されないように作ろうと思ってます。

 Dim globalss As String()
    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer
        ' 拡張子が .jpg のファイルを列挙する
        For Each stFilePath As String In GetFiles(Application.StartupPath, "*.jpg")
            If IsNothing(globalss).ToString() = False Then
                For i = 0 To globalss.Length - 1
                    If stFilePath = globalss(i) Then
                        Return
                    End If
                Next
                Dim test As Image = Image.FromFile(stFilePath)
                ThumbViewer1.Add(test) 'コンポーネントのサムネイルリストに画像を追加
                globalss(globalss.Length - 1) = stFilePath
            Else
                Dim test As Image = Image.FromFile(stFilePath)
                ThumbViewer1.Add(test)
                globalss(0) = stFilePath  'ここで落ちる
            End If
        Next stFilePath
    End Sub

Clickイベントの外で配列を宣言してるのがまずいのかうまく動きません。
ヒントなどを教えていただければ幸いです。
よろしくお願いします。


Hongliang  URL  2006-05-12 14:20:43  No: 131365

ここで落ちる、じゃなくて、どういう風になるのか、例外が投げられたのならそのメッセージの詳細を書いてください。
今回のは ArgumentNullException でしょうけど。
globalss が初期化されていないようです。長さを指定して初期化する必要があります。
また、配列の長さをあとから変更するには、ReDim ステートメントを使うなどする必要があります。

このような場合は、配列よりも System.Collections.Specialized.StringCollection なんかを使った方が便利です。
追加するときは配列長を気にせず ReDim することもなく Add メソッドを呼び出すだけだし、コレクション内に既に存在しているかどうかのチェックも Contains メソッドを使えば一発です。
フィールドで宣言するときに同時に初期化もしておけば一々イベントメソッド内での Null チェックもする必要がありません。

> If IsNothing(globalss).ToString() = False Then
一々 .ToString() する意味は無いと思います。


Hongliang  URL  2006-05-12 14:23:05  No: 131366

おっとうっかり。
ArgumentNullException じゃなくて NullReferenceException のほうですな。


うい  2006-05-13 03:43:37  No: 131367

System.Collections.Specialized.StringCollectionを使って作ってみました。
かなり便利にできました。

    Dim globalss As StringCollection = New StringCollection
    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer
        Dim test As Image
        ' 拡張子が .jpg のファイルを列挙する
        For Each stFilePath As String In GetFiles(Application.StartupPath, "*.jpg")
            If globalss.Count <> 0 Then
                For i = 0 To globalss.Count - 1
                    If globalss.Contains(stFilePath) Then
                        Return
                    End If
                Next i
                test = Image.FromFile(stFilePath)
                ThumbViewer1.Add(test) 'コンポーネントのサムネイルリストに画像を追加
                globalss.Add(stFilePath)
            Else
                test = Image.FromFile(stFilePath)
                ThumbViewer1.Add(test)
                globalss.Add(stFilePath)
            End If
        Next stFilePath
    End Sub

これでボタンを続けて押しても同じ画像が追加されなくなりました。
ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加