gooドクター有料プランが1ヶ月間無料!

タイトルの通りです。VBで、Windowsのエクスプローラのような物を作り、それでファイルを選択したいのですがその作り方が分かりません。

任意の場所から、その最下層までのファイル名やフォルダ名を取得し、それをツリービューに表示させてエクスプローラのようなものを作りたいのです。

どなたか分かる方がおりましたら、お教えください。

gooドクター

A 回答 (3件)

今(結構時間が掛かりましたが)、作ったばかりなのでバグがあるかもしれません。

参考程度にして下さい。
[TreeView]コントロールと[ImageList]コントロールを作成し(この部分の操作説明はいいですね?)

以下のコードを貼り付けて「編集」→「置換」で
[完全に一致する単語だけを検索する]をチェックして
全角[_]を[半角スペース]に置換して下さい。(1963個の文字を置換しています)
(せっかく入れ子にしているのに、スペースがつまってしまうため[_]に変換しました)

Option Explicit

Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE =_-1
Private Const ERROR_NO_MORE_FILES = 18&

Private Type FILETIME
_______ dwLowDateTime As Long
_______ dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
_______ dwFileAttributes As Long
_______ ftCreationTime As FILETIME
_______ ftLastAccessTime As FILETIME
_______ ftLastWriteTime As FILETIME
_______ nFileSizeHigh As Long
_______ nFileSizeLow As Long
_______ dwReserved0 As Long
_______ dwReserved1 As Long
_______ cFileName As String * MAX_PATH
_______ cAlternate As String * 14
End Type
Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA"_(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Declare Function FindClose Lib "kernel32"_(ByVal hFindFile As Long) As Long
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA"_(ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA"_(ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long

Private Usr_Path As String _______'任意のフォルダ #Ver2
Private Sub Form_Load()
___ Dim s As String
___ Dim t As String
___ Dim n&
___ Dim key As Integer
____
____'イメージリストコントロールにアイコンを割り付ける
___ With ImageList1
________.ImageHeight = 16
________.ImageWidth = 16
_______ With .ListImages
____________.Add 1,_"Open", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Win95\Openfold.ico")
____________.Add 1,_"Close", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Win95\Clsdfold.ico")
____________.Add 1,_"Drive", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Win95\Drive.ico")
____________.Add 1,_"CD", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Win95\Cddrive.ico")
____________.Add 1,_"FD", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Win95\35floppy.ico")
____________.Add 1,_"525FD", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Win95\525flop1.ico")
____________.Add 1,_"Rec", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Win95\Waste.ico")
____________.Add 1,_"Desk", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Win95\Desktop.ico")
_______ End With
___ End With
___ TreeView1.ImageList = ImageList1

____'TreeViewコントロールにドライブを表示
'#2 __ key = 0
'#2 __ TreeView1.Nodes.Add ,_,_"rt",_"デスクトップ",_"Desk"
____
'#2 __ s$ = String$(2048, 0)
'#2 __ Call GetLogicalDriveStrings(2047, s$)__'ドライブを取得
'#2 __ Do
'#2 ______ n = InStr(s$, Chr$(0))
'#2 ______ If n > 1 Then
________
'#2 __________ key = key + 1
'#2 __________ TreeView1.Nodes.Add "rt", tvwChild,_"a-" & CStr(key),_"(" & Left$(s$, n - 2) & ")",_"Drive"
'#2 __________ TreeView1.Nodes.Item("a-" & CStr(key)).Sorted = True
____________'全てのフォルダを取得すると表示までに時間が掛かるので却下
____________'Folder_Serch Left$(s$, n - 2),_"a-" & CStr(key)

'#2 __________ s$ = Mid$(s$, n + 1)
'#2 ______ End If
'#2 __ Loop Until n <= 1
___ Usr_Path =_"c:\Windows"_____'#2
___ TreeView1.Nodes.Add ,_,_"a", Usr_Path,_"Close"
___ TreeView1.Nodes.Item("a").Sorted = True
___ Folder_Serch Usr_Path,_"a"__'#2
____
___ TreeView1.BorderStyle = ccNone
End Sub

Private Sub TreeView1_Collapse(ByVal Node As MSComctlLib.Node)
____'TreeView1の開いたフォルダのイメージを変更
___ If (Node.Image =_"Open") Then _'Drive等のイメージを変更しないように
_______ Node.Image =_"Close"
___ End If
End Sub

Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
____'TreeView1の閉じたフォルダのイメージを変更
___ If (Node.Image =_"Close") Then 'Drive等のイメージを変更しないように
_______ Node.Image =_"Open"
___ End If
____'下位フォルダの取得
___ Folder_Next_Search Node
End Sub
Sub Folder_Serch(fo, key1)
___ Dim hFF _ As Long
___ Dim FData As WIN32_FIND_DATA
___ Dim key _ As Integer
___ Dim ret _ As Long
___ Dim n ___ As Integer
___ Dim t ___ As String
____
___ key = 0
________
___ hFF = FindFirstFile(fo & "\*.*", FData)___'下位ファイル(フォルダ)検索(エラーでない場合検索ハンドルが返る)
______________________________________________'___________ この関数はファイルも取得する
___ If (hFF <> INVALID_HANDLE_VALUE) Then ____'エラーでない場合
_______ ret = 1
_______ Do While (ret <> 0)
___________ If (FData.dwFileAttributes = 16) Then _'フォルダならば
________________'フォルダ名は260文字分の領域があり、名前の後ろにChr(0)をつけて返すので
________________'________________________________ Chr(0)までの文字を取得
_______________ n = InStr(FData.cFileName, Chr$(0))
_______________ If n > 1 Then
___________________ t = Left$(FData.cFileName, n - 1)
_______________ Else
___________________ t = FData.cFileName
_______________ End If
_______________ If (t <>_"." And t <>_"..") Then
___________________ key = key + 1
____________________'カレントフォルダと親フォルダでなければ(表現が違うかも)
____________________'__________ TreeViewに追加
___________________ TreeView1.Nodes.Add key1, tvwChild, key1 & "-" & CStr(key), t,_"Close"
___________________ TreeView1.Nodes.Item(key1 & "-" & CStr(key)).Sorted = True
____________________'全てのフォルダを取得すると表示までに時間が掛かるので却下
____________________'Folder_Serch fo & "\" & t, key1 & "-" & CStr(key)
_______________ End If
___________ End If
___________ ret = FindNextFile(hFF, FData)___'次のファイル(フォルダ)を検索
_______ Loop
___ End If
___ ret = FindClose(hFF)
End Sub

Sub Folder_Next_Search(Nd As Node)
___ Dim s _ As String
___ Dim K() As String
___ Dim ki As String
___ Dim pa As String
___ Dim n _ As Integer
___ Dim i _ As Integer
____
____'With TreeView1.SelectedItem
___ With Nd
_______ If (.Children > 0) Then _'1つ下のフォルダがあれば
___________ n =_.Child.Index
___________ Do
_______________ If (TreeView1.Nodes(n).Children = 0) Then '2つ下のフォルダがなければ
____________________'Key:a?-?-?(?:は数字で連番)
____________________'(a:) a-1
____________________'(c:) a-2
____________________'_ ┗ Windows a-2-1
____________________'のように下位フォルダのキーは[上位フォルダ]_+_"-"_+_[連番]
____________________'に設定してあるのでKeyを元に下位フォルダのフルパスを取得
___________________ s = TreeView1.Nodes(n).key
___________________ K = Split(s,_"-")___________________'[-]で分けてK配列へ格納
'#2 __________________ ki = K(0) & "-" & K(1)______________'a-?はドライブ
'#2 ___________________'ドライブ情報の()を削除
'#2 __________________ pa = Replace(TreeView1.Nodes.Item(ki).Text,_"(",_"")
'#2 __________________ pa = Replace(pa,_")",_"")
'#2 __________________ For i = 2 To UBound(K)
'#2 ______________________ ki = ki & "-" & K(i)
___________________ pa =_""______________________'#2
___________________ For i = 0 To UBound(K)_______'#2
_______________________ If (i = 0) Then _________'#2
___________________________ ki = K(i)____________'#2
_______________________ Else ____________________'#2
___________________________ ki = ki & "-" & K(i)_'#2
___________________________ pa = pa & "\"________'#2
_______________________ End If
'#2 ______________________ pa = pa & "\" & TreeView1.Nodes.Item(ki).Text
_______________________ pa = pa & TreeView1.Nodes.Item(ki).Text _'#2
___________________ Next i
___________________ Folder_Serch pa, s _________________'2つ下のフォルダ取得
____________________'変数 N が子ノードの末尾の項目のインデックスになるまで、次の項目の文字列を取得
___________________ If (n =_.Child.LastSibling.Index) Then
_______________________ Exit Do
___________________ End If
____________________'変数 N を次の項目のインデックスに再設定
___________________ n = TreeView1.Nodes(n).Next.Index
_______________ Else _____________________________________'ある場合には、取得済みなので処理を終了
___________________ Exit Do
_______________ End If
___________ Loop
_______ End If
___ End With
End Sub

*******************************************************
ソースの中になるべく説明を書きましたが、表示に時間が掛かるので、一度にすべて登録せず、
フォルダを開いてから、次の検索をしています。
#2と書かれているコメントの部分は、最初見た時に、エクスプローラを作るという部分で作り始めてしまった為、
任意の場所を見落としてしまい、デスクトップから表示にしてしまいました。
・・・ということで#2の部分で訂正してあります。
(消すのがもったいなくて・・でもこの辺はかなり強引)

私も初めて作りましたので、おかしな所もあると思いますが、あくまで参考程度でお願いします。
何かおかしかったら補足してください。
あと、ListImageのアイコンは私のパソコンではそこに入っていましたが、無いかもしれませんし、
違う場所かもしれません。(探してみてください)
右側のファイル名表示の方は、どのコントロールで表示するかわかりませんでしので、
作っていません。また、質問があれば作ってみようと思います。
かなり長くなってすみません。お役に立てればと思います。
    • good
    • 0
この回答へのお礼

無茶苦茶参考になりました。

これで、あとはファイル名を表示すれば良いだけとなりました。頑張ります。ありがとうございました。

お礼日時:2002/10/04 11:25

コントロールでは、駄目ですか。

。。
では、以下のページより自分に合ったサンプルソースを
探してみては如何でしょうか。
いろいろなやり方での、TreeView表示があります。
(コントロールを使用するのと使用しないのと有ります。)

どのように使用するかはあなた次第です。
ガンバって下さい。

参考URL:http://www.vbdiamond.com/Sources/ViewCategory.as …
    • good
    • 0
この回答へのお礼

なかなか良さそうなソースがありますね。
ありがとうございます。まだまだ完成ではないので、詰まったときに参考にさせていただきます。

お礼日時:2002/10/04 11:27

以下のようなActiveXコントロールがあります。


自分でやった事ないので、回答になりえないかもしれませんが
外部コントロールを使用するがOKなら参考に如何でしょうか。

参考URL:http://www.a1vbcode.com/app.asp?ID=118
    • good
    • 0
この回答へのお礼

ありがとうございます。しかし、ActiveXではなく何とか普通に出来るようにしたいので……

お手数かけてすみません。

お礼日時:2002/10/03 18:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング