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;
たまたまそんなのを作ってました。
まだ途中ですが・・・。
http://www.overs.jp/software/comps/FolderTreeTest.zip
なお、この場所は後で消すので、過去ログで知ったがファイルがないという場合は、
http://www.overs.jp/software/
にて確認してください。
時間があれば、TipsかCompsに移しますので。
解っている問題として、子フォルダが多い場合に固まったようになります。
もしかしたら、深すぎるとメモリ確保できなくてエラーになるかも。
早いレスありがとうございます!まさにやりたかった事です!
でも難しくて移行できない・・・。
constructorとかpropertyとかヘルプ見ても???
理解するのに時間がかかりそうなので、解決チェックは
もうしばらく保留にさせてください。
引き続き情報もお待ちしていますので、お願い致します。
フォルダの中のフォルダを一覧し、その一覧中のフォルダの中のフォルダを一覧し、・・・と続きますよね。
再帰処理でなくてもよいのですが、簡単なので再帰で提示します。
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の最初の子として登録されます。
出来ました!
わざわざ初心者でも出来るように作っていただき
ありがとうございます!
ツイート | ![]() |