▼ 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
これって、結構プログラミングの基本ですね。勉強になります。
有り難うございました。
|