TreeViewの初期表示を設定するには?

解決


ふくろー  2004-01-26 21:43:40  No: 111638  IP: [192.*.*.*]

お世話になっております。
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

編集 削除
ねろ  2004-02-03 17:20:03  No: 111639  IP: [192.*.*.*]

もう見てないかな。
DirListBoxやFileListBoxを使ってフォルダーをTreeに展開することは
可能では有ると思いますが、沢山ファイルがありそうな、たとえば'
Documents and Settings'なんてフォルダーを展開しようと思ったら、
時間が掛かってやっていられないかも知れません。(実際にはやってません)
やはり、'FindFirstFile','FindNextFile'なんかを使用して作るのが
一般的かなと。(こちらは実際に作ってます。)

編集 削除
oku  URL  2004-02-03 23:14:29  No: 111640  IP: [192.*.*.*]

>また、そのフォルダ以下を全て展開した状態で初期表示したいのです。
再帰処理を使えば簡単に出来ますよ。

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

コマンドボタンを押せば全て展開した状態になります。

編集 削除
ねろ  2004-02-04 07:59:35  No: 111641  IP: [192.*.*.*]

ノードの展開だけなら
>指定したフォルダ以下のみが表示されます。
ということなので
For n = 1 To TreeView1.Nodes.Count
    TreeView1.Nodes.Item(n).Expanded = True
Next 
だけでいいかと。

編集 削除
ふくろー  2004-02-04 09:34:06  No: 111642  IP: [192.*.*.*]

ねろさん、okuさんありがとうございます!
あれから自分で色々探したり考えたりしてみたんですが、
今は、Dir(Path, vbDirectory)で渡されたパスの下のディレクトリ名を
順番にとってきて、パスとくっつけてコレクションに格納してます。
そのコレクション内のディレクトリ以下に更にディレクトリがないか、
再帰でまた同じループをくぐってます。
フォルダかファイルか区別して、
フォルダならディレクトリ用コレクション、
ファイルならファイル用コレクションにそれぞれ格納します。
そこまでやって、ここからどうやってツリーに表示させようかと、
考えていたとこなんです。
やっぱりこれだと時間がかかるのでしょうか...
表示させたい階層は恐らく、ファイル数が多いので…
全て展開した状態で表示させるのは、
お二人が教えて下さった方法でできそうです!
ねろさんの言われている、'FindFirstFile','FindNextFile'
というのは、APIで調べたら使い方とかわかるのでしょうか?
ちょっと調べてみます!!

編集 削除
ふくろー  2004-02-04 16:25:13  No: 111643  IP: [192.*.*.*]

書き忘れたのですが、
ユーザがテキストボックスなどに、パスを入力するとします。
その入力されたパスというのは、あるディレクトリのパスです。
そのパスからフォルダ名を取り出すことって可能でしょうか?
これができれば、その指定されたパスのディレクトリを親Nodeにして、
それ以下を子Nodeとして展開できるかなと考えたのですが…

編集 削除
特攻隊長まるるう  2004-02-04 17:13:04  No: 111644  IP: [192.*.*.*]

>ユーザがテキストボックスなどに、パスを入力するとします。
>その入力されたパスというのは、あるディレクトリのパスです。
>そのパスからフォルダ名を取り出すことって可能でしょうか?
…それこそ Dir 関数なのでは?(汗)

編集 削除
ふくろー  2004-02-04 17:47:56  No: 111645  IP: [192.*.*.*]

まるるうさんお世話になってます。
Dir(Path, vbDirectory)で指定されたパスの下の
フォルダ名を順番にとってきます。
この時、自分自身の名前の部分には"."が入っているようなのです。
"."ではなく、フォルダの名前が欲しいのですが…
この後のループの条件で、とってきたフォルダ名が"."か".."だったらループをくぐりません。
これは、自分自身と親は無視ってことです。
そこを、無視ではなく、自分自身だった場合、自分の名前(フォルダの)が取りたいのですが…

編集 削除
ふくろー  2004-02-04 17:55:43  No: 111646  IP: [192.*.*.*]

まるるうサンすみません。。
さっきDirのサンプルを作って試してみたところ、
自分のソースでは渡すパスが"c:\aaa\"となっていました…
どうやら"c:\aaa"を渡すと最初の名前は"aaa"が返ってくるのですが、
"c:\aaa\"と渡すと"."が返ってくるようです…
よく確認せず、すみませんでした。。

編集 削除
ふくろー  2004-02-04 21:54:03  No: 111647  IP: [192.*.*.*]

できましたー!!!
色々と教えてもらった方法や、調べて考えた結果、
思い通りの使用のものができました!
上手く説明できず、質問の意図がわかりにくい事もあったかと思いますが、
丁寧に説明してくださった方々には本当に感謝です!
ありがとうございましたー☆

編集 削除