お世話になっております。
TreeViewでディレクトリを展開しているのですが、
現在は開いたとき、自分のマシン内の全てのドライブが表示されています。
これを、特定したフォルダが初期表示で表示されるようにしたいのです。
なので、ドライブは表示されないことになります。
指定したフォルダ以下のみが表示されます。
また、そのフォルダ以下を全て展開した状態で初期表示したいのです。
どなたか御教授下さい。。
OS:WinNT VB:6.0
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
--------------------------------------------------------------
'下層のフォルダを検索してノードを作成します
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
もう見てないかな。
DirListBoxやFileListBoxを使ってフォルダーをTreeに展開することは
可能では有ると思いますが、沢山ファイルがありそうな、たとえば'
Documents and Settings'なんてフォルダーを展開しようと思ったら、
時間が掛かってやっていられないかも知れません。(実際にはやってません)
やはり、'FindFirstFile','FindNextFile'なんかを使用して作るのが
一般的かなと。(こちらは実際に作ってます。)
>また、そのフォルダ以下を全て展開した状態で初期表示したいのです。
再帰処理を使えば簡単に出来ますよ。
Private Sub Command1_Click()
ExpandedSubNodes(TreeView1.Nodes.Item(1)) = True
End Sub
Private Property Let ExpandedSubNodes(ByVal BaseNode As Node, ByVal Expanded As Boolean)
If Not BaseNode Is Nothing Then
Dim objNode As Node
If BaseNode.Children > 0 Then
BaseNode.Expanded = True
End If
Set objNode = BaseNode.Child
Do Until objNode Is Nothing
ExpandedSubNodes(objNode) = True
Set objNode = objNode.Next
Loop
End If
End Property
コマンドボタンを押せば全て展開した状態になります。
ノードの展開だけなら
>指定したフォルダ以下のみが表示されます。
ということなので
For n = 1 To TreeView1.Nodes.Count
TreeView1.Nodes.Item(n).Expanded = True
Next
だけでいいかと。
ねろさん、okuさんありがとうございます!
あれから自分で色々探したり考えたりしてみたんですが、
今は、Dir(Path, vbDirectory)で渡されたパスの下のディレクトリ名を
順番にとってきて、パスとくっつけてコレクションに格納してます。
そのコレクション内のディレクトリ以下に更にディレクトリがないか、
再帰でまた同じループをくぐってます。
フォルダかファイルか区別して、
フォルダならディレクトリ用コレクション、
ファイルならファイル用コレクションにそれぞれ格納します。
そこまでやって、ここからどうやってツリーに表示させようかと、
考えていたとこなんです。
やっぱりこれだと時間がかかるのでしょうか...
表示させたい階層は恐らく、ファイル数が多いので…
全て展開した状態で表示させるのは、
お二人が教えて下さった方法でできそうです!
ねろさんの言われている、'FindFirstFile','FindNextFile'
というのは、APIで調べたら使い方とかわかるのでしょうか?
ちょっと調べてみます!!
書き忘れたのですが、
ユーザがテキストボックスなどに、パスを入力するとします。
その入力されたパスというのは、あるディレクトリのパスです。
そのパスからフォルダ名を取り出すことって可能でしょうか?
これができれば、その指定されたパスのディレクトリを親Nodeにして、
それ以下を子Nodeとして展開できるかなと考えたのですが…
>ユーザがテキストボックスなどに、パスを入力するとします。
>その入力されたパスというのは、あるディレクトリのパスです。
>そのパスからフォルダ名を取り出すことって可能でしょうか?
…それこそ Dir 関数なのでは?(汗)
まるるうさんお世話になってます。
Dir(Path, vbDirectory)で指定されたパスの下の
フォルダ名を順番にとってきます。
この時、自分自身の名前の部分には"."が入っているようなのです。
"."ではなく、フォルダの名前が欲しいのですが…
この後のループの条件で、とってきたフォルダ名が"."か".."だったらループをくぐりません。
これは、自分自身と親は無視ってことです。
そこを、無視ではなく、自分自身だった場合、自分の名前(フォルダの)が取りたいのですが…
まるるうサンすみません。。
さっきDirのサンプルを作って試してみたところ、
自分のソースでは渡すパスが"c:\aaa\"となっていました…
どうやら"c:\aaa"を渡すと最初の名前は"aaa"が返ってくるのですが、
"c:\aaa\"と渡すと"."が返ってくるようです…
よく確認せず、すみませんでした。。
できましたー!!!
色々と教えてもらった方法や、調べて考えた結果、
思い通りの使用のものができました!
上手く説明できず、質問の意図がわかりにくい事もあったかと思いますが、
丁寧に説明してくださった方々には本当に感謝です!
ありがとうございましたー☆