- ベストアンサー
ツリービューを使って、エクスプローラのようなものを作りたい。
タイトルの通りです。VBで、Windowsのエクスプローラのような物を作り、それでファイルを選択したいのですがその作り方が分かりません。 任意の場所から、その最下層までのファイル名やフォルダ名を取得し、それをツリービューに表示させてエクスプローラのようなものを作りたいのです。 どなたか分かる方がおりましたら、お教えください。
- みんなの回答 (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のアイコンは私のパソコンではそこに入っていましたが、無いかもしれませんし、 違う場所かもしれません。(探してみてください) 右側のファイル名表示の方は、どのコントロールで表示するかわかりませんでしので、 作っていません。また、質問があれば作ってみようと思います。 かなり長くなってすみません。お役に立てればと思います。
その他の回答 (2)
- BlueRay
- ベストアンサー率45% (204/453)
コントロールでは、駄目ですか。。。 では、以下のページより自分に合ったサンプルソースを 探してみては如何でしょうか。 いろいろなやり方での、TreeView表示があります。 (コントロールを使用するのと使用しないのと有ります。) どのように使用するかはあなた次第です。 ガンバって下さい。
お礼
なかなか良さそうなソースがありますね。 ありがとうございます。まだまだ完成ではないので、詰まったときに参考にさせていただきます。
- BlueRay
- ベストアンサー率45% (204/453)
以下のようなActiveXコントロールがあります。 自分でやった事ないので、回答になりえないかもしれませんが 外部コントロールを使用するがOKなら参考に如何でしょうか。
お礼
ありがとうございます。しかし、ActiveXではなく何とか普通に出来るようにしたいので…… お手数かけてすみません。
お礼
無茶苦茶参考になりました。 これで、あとはファイル名を表示すれば良いだけとなりました。頑張ります。ありがとうございました。