いつも拝見させていただきありがとうございます。
フォルダの表示コンポーネント(TShell Tree View)に特定の拡張子のファイルを追加して表示させ、それを選択(クリック)したときにはそのファイル名を取得したいのですが、、、。
TShell Tree Viewの表示中にOnCustomDrawイベントでそのファイルの拡張子をなくして空のフォルダを作成し、非表示時に空のフォルダを削除するという方法を考えたのですが、TShell Tree Viewの表示中にエクスプローラでフォルダをのぞくとその空フォルダが存在するので見栄えが悪いので困っています。
また、この表示ファイル(空フォルダ)を通常のフォルダと区別が容易になるようにアイコンの色を変えるということは可能でしょうか?
* 特にフォルダとして表示する必要はなです。
よろしくお願いします。
さゆみん: 「ShellTreeViewに特定の拡張子のファイルだけを追加して表示なんてデキル?」
エリック: 「ShellTreeViewは、ShellCtrls.pasの中に書かれてるでしょ。だからぁ、そのソースを調べてうまく書き換えれば出来ますよね?」
なかざわ: 「まぁ、そやな」
エリック: 「うぅ〜ん、でもソース調べて書き換えるのってムズカシくて大変ですよね。時間もかかりそう」
なかざわ: 「がんばらんと、ガンバリや〜」
さゆみん: 「亀造さん、亀造さん。またまたイジワルしてるみたいですよ、ナカザワさんが...」
エリック: 「えっ、そうなんですか? ナカザワさん」
なかざわ: 「ン?イジワル?ナンのコッチャ」
さゆみん: 「もう〜、トボケないでくださいよ〜、もっと簡単なやり方があるんですよね?♪」
なかざわ: 「バレたらしゃあない、... ObjectTypes、それとOnAddFolderイベントや」
エリック: 「なるほどぉ、ObjectTypes.otNonFolderをTrueでファイルも表示と...それから...OnAddFolderイベントの引数は AFolderとCanAdd...うぅンこれって...」
さゆみん: 「きっとぉ、CanAddをFalseにすると〜そのノード追加されないんですよ♪」
エリック: 「じゃあ、"フォルダと特定の拡張子のファイル"以外は Falseにすればイイってこと? でも〜ファイル名も分からないと...」
さゆみん: 「そうですよねぇ、AFolder引数でファイル名、分かるのかなぁ?」
エリック: 「ヘルプ見ても 載ってないしぃ〜...」
さゆみん: 「ナカザワさ〜ん、"カワユイさゆみん"にヘルプお願い♪」
なかざわ: 「...(ーー;... なら、もういっちょヒントやるか。AFolder.DisplayNameがフォルダ(ファイル)名や」
エリック: 「おぉ、それさえ分かれば〜これでもう楽勝ですね」
なかざわ: 「そやったらエエな、...(まだまだDisplayNameヒトクセありよるで)...」
毎度ありぃ様
貴重なヒントを記載いただきありがとうございます。
当方、稲刈豊作はDELPHI6.0パーソナルのためなのでしょうか?
ShellCtrls.pasの中に'OnAddFolder'等の文字を見つけられずにいます。
もう少しヒントをいただければ幸いです。どうかよろしくお願いします。
さゆみん: 「あの〜、ナカザワさ〜ん♪」
なかざわ: 「なんやねん」
エリック: 「このようにやれば〜、"フォルダと *.txtファイル"だけ表示されると思ったんですけどぉ...」
procedure TForm1.ShellTreeView1AddFolder(Sender: TObject; AFolder: TShellFolder; var CanAdd: Boolean);
begin
if (not AFolder.IsFolder)and
(LowerCase(ExtractFileExt(AFolder.DisplayName)) <> '.txt') then CanAdd := False;
end;
なかざわ: 「どないしたん」
さゆみん: 「それが〜...、ダメなんですよ。どしてでしょ♪?」
なかざわ: 「ナニがダメやねん」
エリック: 「テキストファイルが入ってるはずのフォルダで、それが表示されないんですよぉ...」
さゆみん: 「そうなんですぅ。これってゼッタイおかしいですよね♪?」
エリック: 「コードに間違い無いか何回も見直したんですよ〜。これ間違ってないですよね、ナカザワさん」
なかざわ: 「ホンマ"間違いない"思うとる?」
さゆみん: 「マチガイないと思いますぅ、...でしょ♪?」
なかざわ: 「まちごうとらんやったら、チャンと表示されるやろ!」
さゆみん: 「もぅ〜、ナカザワさんのイジワル〜(;;)」
なかざわ: 「泣いてモノゴト解決する思うとったらアカンで!」
エリック: 「あの〜、だったら...なにかヒントを...(^^;;」
なかざわ: 「しゃ〜ないなぁ、...#0や、#0!」
ちょっとひつれい!!
なかざわさんのゆうとるメソドどこにある?
わてもデルファイ6のぱーそなる
さゆみん: 「ナカザワさ〜ん、グリコですぅ♪」
なかざわ: 「お手上げっチュウことかい」
エリック: 「ヒントの #0 がナンのことだか分かりませ〜ん」
なかざわ: 「そなら、とりあえず...このコードでやってみいや」
procedure TForm1.ShellTreeView1AddFolder(Sender: TObject; AFolder: TShellFolder; var CanAdd: Boolean);
begin
if (not AFolder.IsFolder)and
(LowerCase(ExtractFileExt(AFolder.DisplayName)) <> '.txt'#0) then CanAdd := False;
end;
エリック: 「お〜!、*.txtファイルが表示されました! これって前のコードの '.txt' を '.txt'#0 に変えただけですよねぇ」
さゆみん: 「フシギ〜、 '.txt'#0 だとナンでうまくいくんでしょ♪?」
なかざわ: 「それはやな〜、DisplayNameが "PChar型の長いファイル名+PChar型のDOSファイル名" の形になっとるンからや」
さゆみん: 「あれっ?、でもなんか変ですぅ。表示されない.txtファイルがあるんですけどぉ...」
なかざわ: 「だから、"とりあえず"言うたやろ。8文字以下のファイル名は "DOSファイル名" 空文字の場合あるン。その時は拡張子 '.txt'#0#0 や」
エリック: 「えっ?、それじゃぁ、'.txt'#0 と '.txt'#0#0 の両方のチェックが必要ですよね」
なかざわ: 「そないなことせんでも、DisplayNameをPCharにキャストしといたらエエやん」
procedure TForm1.ShellTreeView1AddFolder(Sender: TObject; AFolder: TShellFolder; var CanAdd: Boolean);
begin
if (not AFolder.IsFolder)and
(LowerCase(ExtractFileExt(PChar(AFolder.DisplayName))) <> '.txt') then CanAdd := False;
end;
エリック: 「おぉ〜、カンペキ〜!」
さゆみん: 「もぅ〜、最初っからチャンと教えてくれればイイのにぃ♪」
なかざわ: 「おまえのウソ泣き見たかったンよ」
さゆみん: 「アレぇ〜(^^ゞ...バレてたンですかぁ」
エリック: 「ところで...」
なかざわ: 「まだナンかあるんか?」
エリック: 「Delphi6 Personalで、ShellCtrls.pasの中に'OnAddFolder'の文字が無いとか、AddFolderメソッドが無いとかの質問ありますけど...」
さゆみん: 「'OnAddFolder'の文字は、220行目と235行目にありますぅ。だけど今回は〜ShellCtrls.pasの中身をイジル必要無いですよね♪」
エリック: 「それに OnAddFolderイベントハンドラは、オブジェクトインスペクタのイベント項目の右欄ダブルクリックで自動的にコードに挿入されるし...」
さゆみん: 「でも〜、VCLソースの中身を見るとイロイロ勉強になりますよね♪」
なかざわ: 「おっ、イッチョマエのこと言うとるやん」
さゆみん: 「そりゃぁ〜、ワタシだってナカザワさんの弟子ですから〜」
なかざわ: 「ダレがウチの弟子やねん」
さゆみん: 「ナカザワさ〜ん、カワユイ弟子にお昼おごってくれますよね♪?」
なかざわ: 「しらん、しらん」
毎度ありぃ様
ど子に?様
お付き合い頂きありがとうございます。
こちらで色々しらべていたのですが?
コンポーネントの登録に不具合あって正常にTShellTreeViewのプロパティやら、メソドをオブジェクトインスベクタに表示できていませんでした。
インストールしてある他のコンポーネントを削除などしてどうにか正常に表示できるようになりました。
やっと、これからソースに挑戦します。
失礼します。
毎度ありぃ様
記載していただいたソースをそのまま写して無事表示させることができました。
ありがとうございます。
もう一つお伺いしてよろしいでしょうか?
またもや低レベルな質問でしかられるかもしれませんが、、、
この表示したファイルをクリックしたときにそのファイルのフルパスを取得したいのです。簡単に取得できますでしょうか?
おさがわせしました。
ShellTreeView1.Folders[ShellTreeView1.Selected.Index].PathName で取得できました。
ありがとうございました。
取得は
ShellTreeView1.Folders[ShellTreeView1.Selected.Index].PathName でなく
(Sender as TShellTreeView).Path
おいらも苦労したよ!
ツイート | ![]() |