喫茶XRAYトップページ

[スレッド全体
]

[2429] 検索順序は本当はどうなるのでしょうか?返信 削除
2009/6/10 (水) 23:36:16 宮 〔HomePage
おじゃまします。winXP Delphi6Personalです。

本当はエクスプローラーを勉強するために
Mr.XRAYさんの簡易エクスプローラを参考に解析始めたのですが
とても高度で難しくて読めませんでした。
そこでサンプルプログラム集の
790−03 ファイル一覧・仮想リストビュー(システムのイメージリストを使用)
800−03_フォルダの一覧表示 フォルダ・ファイル順に表示
別々にすこしづつ勉強してあとで自分でくっつけたのですが、
しげしげ、じっくり見ていくと、いままで気づかなかったことが、
気になりだして、質問してもいいでしょうか。

たまたま、デスクトップに次のようなフォルダとファイルがあります。
エクスプローラーの表示で
●サムネイル                (Folder)
●ななサムネイル            (Folder)
サムネイル                (Folder)
ななサムネイル                (Folder)
●サムネイル.txt                (File)
●ななサムネイル.txt        (File)
サムネイル.txt                (File)
ななサムネイル.txt        (File)

合体作業が終わり出来具合を見ているとなんか違和感を覚えるのでじっくり見ると
●ななサムネイル、●サムネイル、ななサムネイル、サムネイル、
●ななサムネイル.txt、●サムネイル.txt、ななサムネイル.txt、サムネイル.txt
の順になります。
フォルダツリーもリストビューもこのよう順番になります。

800−03フォルダ一覧では
procedure TForm1.SetFolderListToTreeView(APath:String;Node:TTreeNode;Flag:Boolean);
で検索するままだし、
ファイル一覧では
procedure TForm1.Button1Click(Sender: TObject);の
      //ソート
      if FFileList.Count>0 then begin
        FFileList.Sort(Addr(SortFFileList));
      end;
でソートされているようだし、解決できませんでした。

ただ
簡易エクスプローラでは、ツリービューの方は
エクスプローラと同じに表示します。
何か解決方法があるのでしょうか、
しかし、リストビューの方は逆さまのままです。

//----------------
後一つ質問よろしいでしょうか
790−03ファイルリスト一覧の方で開始ボタンのところにある
procedure TForm1.Button1Click(Sender: TObject);
begin
      Update;<−−−−−−−コレは何の働きをするのでしょうか?

destructor TplDataList.Destroy;
・・・
    inherited;<−−−−−−−コレは何の働きをするのでしょうか?
end;

ヘルプに書いてあることが解りません。
簡単にアバウトいいですから、出来れば教えて頂けないでしょうか。

よろしくお願いします。(^_^;)


[2432] Re:検索順序は本当はどうなるのでしょうか?返信 削除
2009/6/11 (木) 11:36:13 Mr.XRAY
▼ 宮さん

> 800−03フォルダ一覧では
> procedure TForm1.SetFolderListToTreeView(APath:String;Node:TTreeNode;Flag:Boolean);
> で検索するままだし、


ソートしていないだけです.別に他意はありません.
必要であれば,ソートしてください.
TreeViewにはSortTypeプロパティがあります.


[2433] Re2:検索順序は本当はどうなるのでしょうか?返信 削除
2009/6/11 (木) 12:02:41 Mr.XRAY
題名が「検索順序は」なんですが,ソートの問題としてレスしました.
FindFirst,FindNext等による「検索順序」ということであれば,
分かりません.
これは,Windows内部の仕様でしょう.
調べれば分かるかも知れませんが,その気はありません.

分かったところで,実用的には結局はソートが必要かも知れませんから.
最近のテレビ番組の「... ムダな知識」とか「雑学」としてであれば
調べる価値はあるかも知れません.(^^)


[2434] Re3:検索順序は本当はどうなるのでしょうか?返信 削除
2009/6/12 (金) 01:45:41 宮 〔HomePage
▼ 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
これって、結構プログラミングの基本ですね。勉強になります。
有り難うございました。




[2436] Re4:検索順序は本当はどうなるのでしょうか?返信 削除
2009/6/12 (金) 11:21:11 Mr.XRAY
▼ 宮さん

> テストしているドライブに20万ファイル、7000フォルダがあり
> 4時間かけてノードの展開縮小、リスト表示を繰り返すと
> 512MBしかない小生のPCでは


20万ファイル,7000フォルダはどうか分かりませんが,
簡易エクスプローラは,Window98( 64MB) で動作していました.
この簡易エクスプローラから,ワードやエクセル,拙作の業務アプリ
も起動していましたが,メモリ不足になることはなかったですね.

もっともノードを閉じるたびにツリー情報は削除していました.
これはメモリ対策ではなく,前回の展開状態が再現されるのが
うっとうしいからです.
結果的にこれがベターだったかは不明です.

非常に多くのファイル等であれば,もうエクスプローラの領域ではなく
データベース化の領域かも知れません.

>demoのTShellTreeViewではでません。

これはシェルの機能を使用しています.
基本的にはシェルの機能を使用した場合の方がメモリは使うような
気がします.ただ,シェルはOSの機能ですから,そこはうまくやって
くれているのかも知れません(シェルはOSのShellの意味).


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82