簡易エクスプローラ
ここに載せてあるソースコードは、参考のために載せてあります
サンプルコードは、一番下にLZHとしてあります
Option Explicit 'フォームのロードイベントです Private Sub Form_Load() Dim j As Integer, jmax As Integer Dim cleDrive As New Collection Dim strX As String 'Driveコントロールから 'ドライブを列挙します jmax = Drive1.ListCount - 1 For j = 0 To jmax 'ドライブ名の抽出です strX = Mid(Drive1.List(j), 1, BackInstr(Drive1.List(j), ":")) 'ドライブをコレクションに格納します cleDrive.Add strX 'ノードを作成します TreeView1.Nodes.Add , , strX, strX, "Drive" Next '格納したドライブコレクションを使い '下層のフォルダを見つけ 'ノードを作成します TreeEnum cleDrive End Sub 'フォームのサイズ変更イベントです Private Sub Form_Resize() TreeView1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight End Sub '下層のフォルダを検索してノードを作成します Sub TreeEnum(ByVal cleDir As Collection) Dim vriEnum As Variant Dim j As Integer, jmax As Integer Dim strX As String, strM As String On Error Resume Next For Each vriEnum In cleDir 'Dirコントロールにパスを入れます Dir1.Path = vriEnum & "\" Select Case Err.Number Case 0 '既にノードがある場合の処理はしていません 'ノードの作成をします jmax = Dir1.ListCount - 1 For j = 0 To jmax strM = Dir1.List(j) strX = Mid(strM, BackInstr(strM, "\") + 1, Len(strM) - BackInstr(strM, "\")) TreeView1.Nodes.Add vriEnum, tvwChild, vriEnum & "\" & strX, strX, "FoldClose" Next 'エラー処理です Case Else 'デバックウィンドウ(イミディエイト)に 'エラー内容を表示します 'Debug.Printはスピードが落ちますので '削除してもかまいません Debug.Print Err.Description Err.Clear End Select Next End Sub 'ノードを閉じた時のイベントです Private Sub TreeView1_Collapse(ByVal Node As ComctlLib.Node) 'フォルダを閉じる場合だけ 'イメージを変更します If Not (InStr(1, Node.FullPath, "\") = 0) Then Node.Image = "FoldClose" End If End Sub 'ノードを展開した時のイベントです Private Sub TreeView1_Expand(ByVal Node As ComctlLib.Node) Dim cleDir As New Collection Dim j As Integer, jmax As Integer Dim strX As String 'フォルダを展開する場合だけ 'イメージを変更します If Not (InStr(1, Node.FullPath, "\") = 0) Then Node.Image = "FoldOpen" End If '展開したノードのフルパスを 'Dirコントロールに入れます Dir1.Path = Node.FullPath & "\" 'Dirコントロールからフォルダを列挙して 'コレクションに格納します jmax = Dir1.ListCount - 1 For j = 0 To jmax strX = Mid(Dir1.List(j), 1, BackInstr(Dir1.List(j), "\")) cleDir.Add Dir1.List(j) Next 'ノードを作成します TreeEnum cleDir End Sub '//////////////////////前回紹介した関数です////////////////////////// '応用が範囲が広いですね(・・)ノ 'VB6では標準でついているらいいけど・・・(未確認) '逆方向Instr関数です Public Function BackInstr(ByVal str1 As String, ByVal str2 As String) As Long Dim lngSeek As Long, lngStr2Len As Long '一番後ろの位置を得るために '文字列の長さで取得します lngSeek = Len(str1) lngStr2Len = Len(str2) '後ろから検索していって対象文字列(str2)が '見つかったら、その位置を返して関数から出ます Do If Mid(str1, lngSeek, lngStr2Len) = str2 Then BackInstr = lngSeek Exit Function End If lngSeek = lngSeek - 1 Loop Until lngSeek <= 0 '見つからなかったら0を返します BackInstr = 0 End Function |