| ▼ Mr.XRAYさん>>
 > 分かったところで,実用的には結局はソートが必要かも知れませんから.
 > 最近のテレビ番組の「... ムダな知識」とか「雑学」としてであれば
 > 調べる価値はあるかも知れません.(^^)
 
 もやもやしていたことが払拭されました。
 有り難うございました。
 エクスプローラみたいなプログラムに少し首をつっこんだのですが
 とても奥が深いですね。
 リストビューも仮想方式と現実方式?(普通に書き込んで表示する方法)
 をなんと呼ぶのか知りませんが、試してみました。
 仮想方式はとても早いですがメモリーを食うようです。
 また、TreeViewをデスクトップをルートに下にドライブなど表示するように
 改造したのでフルパス取得が難しくなったので
 構造体を利用して
 PBookMarkItem = ^TBookMarkItem;
 TBookMarkItem = record
 URL:string;
 個々のノードに要素名をファイル名、実際のパスをURLに持たせるようにしました。
 テストしているドライブに20万ファイル、7000フォルダがあり
 4時間かけてノードの展開縮小、リスト表示を繰り返すと
 512MBしかない小生のPCでは
 文言は忘れましたが、メモリー不足(リソース不足)の警告がでました。
 demoのTShellTreeViewではでません。
 そこで、いま、OnCollapsedしたとき
 ぶら下げていたノードを毎回解放するようにしようかと
 考えています。効果があるか知りませんが。
 構造体も破棄しなくてはならないので
 結構私には難しいです。
 次のようにしてみました。
 登録
 var
 P:PBookMarkItem;
 begin
 New(P);
 P^.URL := Path+ SearchRec.Name;
 AddNode:=TreeView3.Items.AddChildObject(Node,SearchRec.Name,p)
 削除(あたり自身がないですが)どこかのサンプル参考。
 procedure TForm1.pNodeDelleteClick(Sender: TObject);
 var
 Node1,Node2:TTreeNode;
 strURL:string;
 begin
 if TreeView1.Selected=nil then exit;
 Node1 := TreeView1.Selected;
 if Node1 <> nil then
 begin
 Node2 := Node1;
 while Node2.HasChildren = True do
 begin
 Node2 := Node2.GetLastChild;
 end;
 
 while Node2 <> Node1 do
 begin
 Node2 := Node2.GetPrev;
 end;
 Node1.Delete;
 end;
 //パスの削除処理
 end
 これって、結構プログラミングの基本ですね。勉強になります。
 有り難うございました。
 
 
 
 
 |