特定のフォルダとtreeviewの構成を合わせるには?

解決


れん  2004-07-07 05:19:12  No: 9796

treeviewの使い方がなかなか理解できないので教えてください。
やりたいことは、フォームを開いた時点で
「C:\test」フォルダ以下すべてのサブフォルダの構成を調べ、
treeviewも同じ構成にしたいのです。
「C:\test」フォルダ内だけであればなんとかできたのですが、
階層が一段、二段と深くなるとわかりません。

どなたか宜しくお願いします。

//testフォルダ内のみ出来た物
procedure TForm2.view;
var
  SR: TSearchRec;
  Res: integer;
begin
  Res := FindFirst('C\:test' + '\*',faDirectory,SR);
  while res = 0 do
  begin
    treeview1.Items.Add(nil,SR.Name);
    res := findnext(SR);
  end;
  findclose(SR);
end;


にしの  2004-07-07 10:30:46  No: 9797

たまたまそんなのを作ってました。
まだ途中ですが・・・。
http://www.overs.jp/software/comps/FolderTreeTest.zip
なお、この場所は後で消すので、過去ログで知ったがファイルがないという場合は、
http://www.overs.jp/software/
にて確認してください。
時間があれば、TipsかCompsに移しますので。

解っている問題として、子フォルダが多い場合に固まったようになります。
もしかしたら、深すぎるとメモリ確保できなくてエラーになるかも。


れん  2004-07-07 16:45:43  No: 9798

早いレスありがとうございます!まさにやりたかった事です!

でも難しくて移行できない・・・。
constructorとかpropertyとかヘルプ見ても???
理解するのに時間がかかりそうなので、解決チェックは
もうしばらく保留にさせてください。

引き続き情報もお待ちしていますので、お願い致します。


にしの  2004-07-07 19:37:18  No: 9799

フォルダの中のフォルダを一覧し、その一覧中のフォルダの中のフォルダを一覧し、・・・と続きますよね。
再帰処理でなくてもよいのですが、簡単なので再帰で提示します。

procedure RebuildFolderTree(FullPath: String; View: TTreeView; SelfNode: TTreeNode);
var
  sr: TSearchRec;
  Node: TTreeNode; // 各子ディレクトリ用のノード
begin
  // faDirectoryでもいいけれど。
  if FindFirst(FullPath + '\*.*', faAnyFile, sr) = 0 then
  begin
    repeat
      if sr.Attr = faDirectory then
      begin
        // .や..は相対パスの自分/親なのでパス
        if (sr.Name = '.') or (sr.Name = '..') then Continue;
        // 自分のディレクトリの中の、各子ディレクトリ用のNodeを作成
        Node := View.Items.AddChild(SelfNode, sr.Name);
        // 子ディレクトリ内のディレクトリを検索(再帰処理)
        RebuildFolderTree(FullPath + '\' + sr.Name, View, Node);
      end
      else
      begin
        Continue;
      end;
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
end;

こんな感じになります。
使い方は、

RebuildFolderTree(検索ディレクトリのルートパス, TreeViewオブジェクト, nil);
となります。
最後がnilであれば、TreeViewの最初の子として登録されます。


れん  2004-07-07 21:16:47  No: 9800

出来ました!
わざわざ初心者でも出来るように作っていただき
ありがとうございます!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加