Lotusnut >> Soft >> Visual Basic >> TreeView
Visual Basic 6.0 - TreeView -
- Option Explicit
- ’ノード用変数
- Private nodX As Node
- '構造体配列変数 for sfGetFolderList
- Private Type udtDFname
- ’フォルダ名
- Name As String
- ’パス名
- Path As String
- ’ListImageに格納されイメージのIndex
- Image As Integer
- ’フォルダー・ファイルの更新日時
- Date As Date
- ’ファイル容量
- Size As Long
- End Type
- Private Function sfTreeviewShow(ByRef tvwctrl As Variant, _
Optional ByVal strpath As Variant)As String - ' 作 者(Writer):lotusnut
- ' 目 的(Aim): ツリービューコントロールにDrive&Folderを結びつける
- ' 入 力(Input) : ノードクリックしたパス
- ' 受け渡し(Delivery): ツリービューコントロール
- ' 戻 値(Return): 安全なエラーメッセージ
- ' 出 力(Output): なし
- ' 注 釈(Notes): このプロシャはツリービューコントロール専用です
- ' 使用方法(Usage): sf = sfTreeviewShow(userCtrl,option path)
- ' 履 歴(History): Ver 0.0.0 2002/1/22 Original
- On Error GoTo ErrTrap
- ’ローカル変数の宣言
- Dim i As Integer
- Dim j As Integer
- Dim count As Integer
- Dim subcount As Integer
- 'フォルダー格納用一時変数
- Dim Folderinfo() As udtDFname
- Dim SubFolderinfo() As udtDFname
- 'ドライブの .Name .Path .Imageが格納されたuser変数
- Dim Driveinfo() As udtDFname
- 'ディスクトップ等のIconImage
- Const CLOSEIMG As Integer = 6
- Const OPENIMG As Integer = 7
- Const DISKIMG As Integer = 8
- '引数の検証&判別
- If Not TypeOf tvwctrl Is TreeView Then
- sfTreeviewShow = dfSemCreate("sfDriveShow", -1, _
"ツリビューコントロールが不正です") - Exit Function
- End If
- '引数の検証&変換
- strpath = dfVntToTrimStr(strpath)
- 'DiskTopをノードの先頭にする
- If strpath = "" Then
- 'App立上げ当初は、サブディレクトリまで一気にNodeを作る(Roadで)
- sfTreeviewShow = sfNodeAdd(tvwctrl, "ディスクトップ", , , "Top",
DISKIMG)
count = dfGetDriveList(Driveinfo)
For i = 0 To count - 1
With Driveinfo(i)
sfTreeviewShow = sfNodeAdd(tvwctrl, _
.Name, "Top", tvwChild, _
.Path & "\", _
.Image)
If .Path <> "A:" Then 'サブディレクトリの取得
strpath = .Path & "\"
subcount = dfGetFolderList(strpath, Folderinfo)
For j = 0 To subcount - 1
With Folderinfo(j)
sfTreeviewShow = sfNodeAdd(tvwctrl, .Name, strpath, _
tvwChild, .Path & "\", _
CLOSEIMG, OPENIMG)
End With
Next j
End If
End With
Next i
- ’ノードクリックの場面で
- Else
count = dfGetFolderList(strpath, Folderinfo)
For i = 0 To count - 1
With Folderinfo(i)
If .Path <> "" Then
strpath = .Path & "\"
subcount = dfGetFolderList(strpath, SubFolderinfo)
For j = 0 To subcount - 1
With SubFolderinfo(j)
If .Path <> "" Then
sfTreeviewShow = sfNodeAdd(tvwctrl, .Name, strpath, _
tvwChild, .Path & "\", _
CLOSEIMG, OPENIMG)
End If
End With
Next j
End If
End With
Next i
End If
- ’正常終了
- Exit Function
- ErrTrap:
- sfTreeviewShow = dfSemCreate("sfTreeviewShow", Err.Number,
Err.Description)
On Error GoTo 0 - End Function
感想;
BVを始めて1ヶ月。とりあえず既存のアプリケーションを真似して、何かを作りながら学ぶことにした。「Windowsのエクスプローラ」の動きを知りたくて、ドライブ・フォルダーをデータベース風に変数に格納するやり方をトライすることに。グローバル変数はなるべく使用しない。引数か戻り値で配列変数をローカルなプロシージャ内で解決できる方法を模索した。ツリービューのノードは、階層化処理なので、再帰を試みるが、あまりに処理速度に問題があり、(「エクスプローラ」や「卓駆」などの動きを観察しても・・本当は自分を納得させている?)全部を一度に読み込むのではなく、サブディレクトリまでを取り敢えず変数に格納して表示しているように見えるので、そのパターンでプロシージャを考えることにした。最初の勉強としては、ちょっと難しかったようで、時間が思ったよりかかってしまったが、色々な部分で勉強になったと思う。
でも本当は違うんだろうなぁ! APIのSHBrowseForFolder( )なんか見てみると速さが桁違いだもんな
まあいいか、あせらず・・・迷わず・・・
1年後の感想;
なんとまあ!拙いコードだこと・・・わかり辛いと言うことは、有用なロジックではないと言うことです。精進。精進・・・