喫茶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;

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

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


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

そういえばまだ,TreeViewの問題がありましたっけ.
ちょっと待ってくださいね.少し落ち着いてきたところですので,

> 気になりだして、質問してもいいでしょうか。

どうぞ,どうぞ,質問しやすいように,サンプル,全てのページに図番号と
リスト番号をつけているのですから.
ただし,時間が経過すると忘れてしまうかも(笑)

これは,ソートと表示順番の問題ですよね?

通常,FFileList.Sort(Addr(SortFFileList));
とすると,TStringList(TList)が決めたソートの順番です.

>簡易エクスプローラでは、ツリービューの方は
>エクスプローラと同じに表示します。


これはそのようになるようにしています.
シェルネームスペースを使用すると,エクスプローラと同じ順番に
リストを作成してくれますが(デフォルトでは)
一連のサンプルでは,シェルの機能を使用していません.
そのためにそのようになります.

簡易エクスプローラでは,エクスプローラ(シェル)の表示仕様を解析して
コーディングしています(結構レアなコードだと勝手に思っています).

表示の順番が気に食わないのであれば,自分でソートのルーチンを作成
して,自分なりの仕様にするしかないですね.

>procedure TForm1.Button1Click(Sender: TObject);
>begin
>      Update;<−−−−−−−コレは何の働きをするのでしょうか?


宮さんの環境では発生しないのかも知れませんが,環境によっては,
ダイアログの表示が終了した時に,画面の表示が乱れる(欠損等)こと
があります.そのために,再表示をしています.
つまり,体裁上の問題です.動作そのものには関係ありません.
ダイアログで処理に時間がかかるなど,重い処理の場合は特にそうです.
したがって,[キャンセル]で閉じた場合は必要ないようです.

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


これは,そのものズバリで,元のTListのDestroyを実行しているだけです.
ihheritedはそういう意味ですから.
inheretedを実行しないで,自前で処理するのであれば必要ありません.
(あまりそういうことはしませんが,やることも,実はあります
よっぽど詳しく本サイトのコードを読まないと分かりませんが)

このような疑問の場合,疑問に思った行を削除して実行してみるのも
1つの動作確認になるかも知れません.
ただ,単にメモリリークが発生するだけの場合もあるかも知れませんが.


ところで,シェルの機能を使用したフォルダツリー,ファイルリストは
開発中です.実は数年前からやっているのですが,他のことをやったり
して中断しています.
これは,サンプルとしてUPするには厳しいのでコンポーネントになります.
今考えている手順は以下の通りです.

1. TplPrevのVistaでの描画問題の修正
2. シェル機能のファイルとフォルダのコンポ開発
3. それを使用して,ファイル関連ダイアログコンポのVista+ Delphi2007
   の対応確認と修正
4. 他のコンポのVista+ Delphi2007への対応確認と修正
5. Delphi2009への移行

Delphi2007の動作確認は省略できませんね.どうしても.


[2431] Re2:検索順序は本当はどうなるのでしょうか?返信 削除
2009/6/11 (木) 11:23:52 Mr.XRAY
> Delphi2007の動作確認は省略できませんね.どうしても.

何回か書いていますが,ワードとエクセル操作フォームの対応が
ほぼ終了したところです.
ダウンロード数が多い提供ものですので,早くやりたかったのですが.

Vistaでは新規にPCを購入するとIE7です.この問題を解決したかった
のです.
IE7では,ブラウザとエクスプローラの機能が分離されて,TWebBrowser
上に表示されなくなったものですから(別窓表示になる)


[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の意味).


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

> demoのTShellTreeViewではでません。

ということは,どこかでメモリリークしているのでは?

>テストしているドライブに20万ファイル、7000フォルダがあり

自分のがどれだけあるか調べてみました.Dドライブです.
[780]の04を使ってみました.
ListViewに表示するようにしたら,中々終わらないので,
Listviewの表示行をコメントアウトにして.
上が総ファイル数,下がフォルダ(サブフォルダを含む)数です.
あるもんですね.


[2440] Re5:検索順序は本当はどうなるのでしょうか?返信 削除
2009/6/12 (金) 22:32:18 宮 〔HomePage
▼ Mr.XRAYさん
> ▼ 宮さん
>
> > demoのTShellTreeViewではでません。
>
> ということは,どこかでメモリリークしているのでは?
>

確かにメモリーリークがあるかもしれません。
テストでぱっつぱっつとやっただけですから。
一応は当てておきましたが、詳しくは見ていません。
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
    Dispose(Node.Data);
end;
ひきつづき研究します。
また、アドバイスがありましたら教えてください。
こうした方がいいよとか。
では。

[2441] メモリマネージャは返信 削除
2009/6/12 (金) 23:26:44 Mr.XRAY
▼ 宮さん

> 確かにメモリーリークがあるかもしれません。

メモリマネージャは何を使っているんでしょうか


[2447] Re:メモリマネージャは返信 削除
2009/6/13 (土) 11:17:31 宮 〔HomePage
▼ Mr.XRAYさん
> ▼ 宮さん
>
> > 確かにメモリーリークがあるかもしれません。
>
> メモリマネージャは何を使っているんでしょうか


お手数かけます。
HeapCheckerというやつでほぼ完成版になったら
入れております。
dprに下記のような宣言をして
HeapChecker.OutputClassName := True;
HeapChecker.DumpLeakMemory := True;
関連pas、dcuを入れて使うもので
面倒です。
使い方もなれていません。

何かいいツールがありましたら、教えてください。
先のテストでは使っていません。m(_ _)m


[2474] Re2:メモリマネージャは返信 削除
2009/6/18 (木) 12:52:09 Mr.XRAY
▼ 宮さん

亀レスですみません.

> 何かいいツールがありましたら、教えてください。

いいかどうかはわかりませんが,これを使っています.
http://mrxray.on.coocan.jp/Others/UsageFastMM.htm

> 先のテストでは使っていません。m(_ _)m

他の方に配布する場合は,メモリリークのチェックは必須ですね.
ただ,リークがあっても,Indy10のように増加しなければ問題は
ないと思います.
念のためにウィルスチェックもかな.




[2475] Re3:メモリマネージャは返信 削除
2009/6/18 (木) 14:26:07 宮 〔HomePage
▼ Mr.XRAYさん
>>
> いいかどうかはわかりませんが,これを使っています.
> http://mrxray.on.coocan.jp/Others/UsageFastMM.htm
>

フリーならインストールします。
今のツールはソースの「プロジェクト名.dpr」にコードを書き
pasフォルダにツールのソースを混在させなければならないのが不便です。
またたまに、メディアプレイヤーを動的に貼り付け
いきなり再生するようなとき微妙にミスをすることがあります。
そのため、つい外したままになることがあります。
 
> >
> 他の方に配布する場合は,メモリリークのチェックは必須ですね.
> > 念のためにウィルスチェックもかな.


恐れ入ります。
以後、習慣でチェックするようにします。
すみませんでした。では。

 

[2476] TWebBrowserでフォルダ表示返信 削除
2009/6/18 (木) 17:36:17 Mr.XRAY
▼ 宮さん

このスレッドとは全く関係ない話ですが,
宮さんはTWebBrowser関係が多いのですよね.

もうすぐ,IEをIE7に切替える予定です.
ブラウザにファイルなどを表示する関係はテストできなくなって
しまいますね.残念です(本当か?)

アクセス解析でも,IE7,IE8が増えているので,そろそろ.
元々このサイトにはTWebBrowser関係のサンプルはないですけどね(笑)

2009/06/14 00:01:27 〜 の解析結果

[2477] Re:TWebBrowserでフォルダ表示返信 削除
2009/6/18 (木) 20:02:20 宮 〔HomePage
▼ Mr.XRAYさん
> ▼ 宮さん
>>

FastMM4をインストールしました。
使い方は簡単ですね。
しかし使い方が悪いのかリークの明細がでないですね。

HeapCheckerはログリストを出力してくれます。
マスターのFastMMの導入(Delphi7) リスト1のリークサンプル結果です。
-----------------------------------------------------------------------------
 ADDRESS | 未解放領域1(推定クラス名:TStringList)(size:48)
-----------------------------------------------------------------------------
00158F28 | B4 9D 41 00 00 00 00 00-00 00 00 00 00 00 00 00 | エ戡?????????????
00158F38 | 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | エ戡?????????????
00158F48 | 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | エ戡?????????????
-----------------------------------------------------------------------------
もう何年もHeapCheckerを使っているせいか慣れがあります。

> もうすぐ,IEをIE7に切替える予定です.
> ブラウザにファイルなどを表示する関係はテストできなくなって
> しまいますね.残念です(本当か?)


ハイ私はWebブラウザしかないです。
話が見えないんですが?
マスターのIEを7にすると言うことでしょうか。
EmbeddedWBがどう対応するか解りませんが。
私はIE7が出てすぐから使っておりますが。
私の場合は問題なく使っていますが。
Vistaとの組み合わせはどうなるか解りませんが。
すみません外していたらごめんなさい。(^_^;)
では。




[2478] Re2:TWebBrowserでフォルダ表示返信 削除
2009/6/18 (木) 20:22:07 Mr.XRAY
▼ 宮さん

> もう何年もHeapCheckerを使っているせいか慣れがあります。

使い慣れている方がいいのではないでしょうか.

> 私はIE7が出てすぐから使っておりますが。
> 私の場合は問題なく使っていますが。


とすると,XPでは問題ないのかな.
IE7からはブラウザとエクスプローラの機能が分離されたんです.
SHDocVwのDLLのバージョンの関係かも知れません.

[2479] Re3:TWebBrowserでフォルダ表示返信 削除
2009/6/18 (木) 23:31:54 宮 〔HomePage
▼ Mr.XRAYさん
>> とすると,XPでは問題ないのかな.

そんなに私めにとっても重大なことだったんですか。
以前、マスターがこの件について書いておられましたね。
そのときは、何のことか気にしませんでした。

> IE7からはブラウザとエクスプローラの機能が分離されたんです.
> SHDocVwのDLLのバージョンの関係かも知れません.


Webコンポーネントが関係するのでしょうかね。
もっともIE7の何をどう使って動いているのか知りませんが。
知らぬが仏 心配しても始まりません。
では。




[2480] Re4:TWebBrowserでフォルダ表示返信 削除
2009/6/18 (木) 23:44:35 Mr.XRAY
▼ 宮さん

> Webコンポーネントが関係するのでしょうかね。

タハハハッ.(^^;  (汗)


[2481] Re5:TWebBrowserでフォルダ表示返信 削除
2009/6/19 (金) 12:14:11 宮 〔HomePage
▼ Mr.XRAYさん
>>
> タハハハッ.(^^;  (汗)


Internet Explorer 8 をインストールしました。

エクスプローラから種々雑多なファイルを
複数ドロップしてみました。
開かない。???
アドレス窓にローカルパスを入力してみました
表示しない???

このことですか、先におっしゃっていた内容は。
そりゃまた、とんちんかんな応答をしていました。(^_^;)

IE7からそうだったんですか?
いや〜気づきませんでした。
なんせIEなど使わないモンですから。

では。



[2482] Re6:TWebBrowserでフォルダ表示返信 削除
2009/6/19 (金) 14:33:57 Mr.XRAY
▼ 宮さん

調べてみました.
IE7から仕様が変更になったようですが,
必ずしもエクスプローラが別窓で開くわけではないようです.

ところでWebBrowserですが,これはSHDocVw.dllの機能を利用して実現
しています.Personal版でしたら,このdllを,タイプライブラリまたは
ActiveXの取り込みで,このdllを使用可能にするユニットを作成したハズ
です.

このdllはIEが使用しているものです.
つまり,WebBrowserは,IEが使用可能な環境でないと使用できません.
そして,そのPCで現在使用しているIEのバージョン,つまりHDocVw
のバージョンにより,動作仕様が決まります.

これはWebBrowserに限ったことではありません.
Delphiは,Windowsのこれらのdll等の機能を使っています(カプセル化).
Delphiは,Windowsがインストールされていない環境では,
Windowsのプログラムは開発できないということです.
(インストールもできませんが...)

つまり.WebBrowserを使っているということは,

>なんせIEなど使わないモンですから。

ということはないんです.メチャクチャ使っているんです.
もちろん,他の方のように直接ではなく,IEの機能をという意味です.


[2549] Re3:TWebBrowserでフォルダ表示返信 削除
2009/7/9 (木) 22:13:45 Mr.XRAY
> IE7からはブラウザとエクスプローラの機能が分離されたんです.
> SHDocVwのDLLのバージョンの関係かも知れません.


TWebBrowser(Delphi2007-R2 Pro)とVista+IE8 Beta
で動作確認してみました.

URLにフォルダ名を指定した場合は,TWebBrowser上に表示されます.
ただし,IE8 Betaのアドレスバーにフォルダを指定した場合は
別窓で表示されます.

こういう仕様のようですね.
ワード,エクセル等,他のアプリはどちらも別窓表示でした.


[2550] Re4:TWebBrowserでフォルダ表示返信 削除
2009/7/10 (金) 18:29:10 宮 〔HomePage
▼ Mr.XRAYさん
>
> ただし,IE8 Betaのアドレスバーにフォルダを指定した場合は
> 別窓で表示されます.
>
> こういう仕様のようですね.
> ワード,エクセル等,他のアプリはどちらも別窓表示でした.


つい先日、マスターに指摘されてIE7では、ローカルフォルダは
開かないといわれて始めて知ったはずでした・・・?。
(もう記憶が定かでない(^_^;) )

なんと、今回IE8では、それでは不便すぎると文句が出たのか
別窓で開きますね。始めて知りました。
IE7は削除したので確かめようがないけど。

MSさんも定番中の定番ソフトを結構、ごそっと変えるんですねぇ〜。
もっとも、IEもエクスプローラーもそのヘルプを読んだことがないので
確かなことは解りませんが。
改めて考えてみるとヘルプを読まないで、
万人が使えるアプリはずごいですよね。

Linuxが普及しないわけ、もっとも劣っているのは、デスクトップに
このエクスプローラーに匹敵するツールが無いことだと思う。(余談)

情報有り難うございました。



INCM/CMT
Cyclamen v3.82