投稿者 over50  (社会人) 投稿日時 2009/11/26 08:55:07
葉月さん、度々丁寧なRES.有難うございます。
もう少し早くアップしたかったのですが、動作確認に時間がかかって遅くなりました。

今回は、自分のPCの環境に合わせてTextChangedイベントに拘りました。
マルチブートとドライブが多く、自分では使いやすい物になったように思います。

デザインは、ドライブリストボックス、ディレクトリリストボックス、テキストボックス、ステータスバーとステータスストリップに、ラベルとプログレスバーを各1つづつ張り付けたものです。

特にコードの中のTextChangedイベントで、キー入力のイベント発生を遅らせる処理での 
”System.Threading.Thread.Sleep(1000)
        Application.DoEvents()”と、

ファイルが無い時のメッセージの処理は何とか出来たもののこれでいいのかよく解っていません。
その他を含め、皆さんから何かアドバイスをいただければ幸いです。


Public Class Form1

    Dim SlctDirect As String '対象のディレクトリを宣言

  Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        'キー入力でのイベントを遅らせて、スムーズにする。
        System.Threading.Thread.Sleep(1000)
        Application.DoEvents()
        '表示を初期化
        ToolStripProgressBar1.Value = 0
        ToolStripStatusLabel1.Text = Nothing
        Me.Text = ("簡易ファイル検索")
        Me.ListBox1.Items.Clear()
        Me.filesearch()

    End Sub
    Private Sub filesearch()
        Const short_count_up As Short = 1

        ' 選択ディレクトリ 
        Dim strSelectDir As String = Me.SlctDirect
        '何も入力されていない場合は何もしない。
        If TextBox1.Text.Length = 0 Then
            Return
        End If

        ' 作業ディレクトリ
        Dim selectDirectory As New System.IO.DirectoryInfo(strSelectDir)
        ' 作業ファイル 
        Dim file As System.IO.FileInfo
        ' 一時的にファイルを格納
        Dim arFiles As New ArrayList()
        ' 探すファイル 
        Dim strSearch As String = Me.TextBox1.Text
        Dim strFile As String = String.Empty

        ' カウント変数 
        ' 宣言はFor文の前で行うのがいいです。
        Dim sCount As Short = 0
        Try
            For Each file In selectDirectory.GetFiles(strSearch & "*", IO.SearchOption.AllDirectories)
                strFile = file.FullName

                If System.IO.File.Exists(strFile) Then
                    sCount += short_count_up
                    strFile = file.FullName
                    arFiles.Add(strFile)
                    ' プログレスバーの処理
                    ToolStripProgressBar1.Value = sCount / sCount * 100
                    ToolStripStatusLabel1.Text = String.Concat(+sCount.ToString() & "項目")
                End If
            Next
            If strFile = String.Empty Then
                Me.Text = "ファイルが見つかりません!"
            End If
            'エラー処理
        Catch ex As System.UnauthorizedAccessException
            MsgBox(ex.Message, MsgBoxStyle.Exclamation)
        End Try
        Me.ListBox1.BeginUpdate()
        Me.ListBox1.Items.AddRange(arFiles.ToArray())
        Me.ListBox1.EndUpdate()

    End Sub

    Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
        Dim path As String

        Try
            '選択ファイルの起動
            path = ListBox1.SelectedItem
            Process.Start(path)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation)
        End Try

    End Sub

    Private Sub DriveListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DriveListBox1.SelectedIndexChanged
        DirListBox1.Path = DriveListBox1.Drive
        Call DirListBox1_SelectedIndexChanged(sender, Nothing)


    End Sub

    Private Sub DirListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DirListBox1.SelectedIndexChanged
        '対象のディレクトリの選択
        SlctDirect = DirListBox1.DirList(DirListBox1.DirListIndex)
        StatusBar1.Text = SlctDirect
    End Sub
End Class