度々の事ながら、質問させていただきたいと思います。
ShellListViewでファイルのアイコンをダブルクリックしたとき(フォルダは除く)、そのファイルのパスを取得するというものを作りたいのですが、うまくいきません。
ファイルならうまくいくのですが、フォルダをダブルクリックしたらエラーが出てしまうのです。
おそらく、SelectedFolderのところがおかしくなると思うのですが対処法が分かりません。(IsFolderを使っても駄目でした。)
どうすればうまくいくのでしょうか?ご教授お願いします。
AutoNavigateがfalseであっても問題がないようであれば、オブジェクトインスペクタでAutoNavigateをfalseにしておくとフォルダ選択時のエラーはないみたいです。
ただ、オブジェクトインスペクタで変えておくと問題ないみたいですが、dbclickイベントでfalseに書き換えてもダメっぽいです。
変身遅くなりました。通りすがりさん、返答ありがとう御座います。
確かに通りすがりさんの言う通り、エラーは出なくなりましたが、私はフォルダがダブルクリックされたらそのフォルダを開いていくという風にしたいので、ちょっとこの方法では納得ができません。(えらそーな事言ってすみません。)
そこのところもうまく行くような方法はないでしょうか?ご教授お願いします。
それじゃあ、AutoNavigateをfalseにして、
Caption := ShellListVIew1.SelectedFolder.PathName ;
ShellListView1.Root := Caption;
とかいう、激しくセコイ方法とか、、、
ナルホド!その手があったか!っと驚いてみたり(w
確かに無理矢理な感じはしますが、できることはできますね。
ただ、ShellComboBoxとの対応がうまくいかなくなる(ShellComboBoxのRootも変化して、ホームディレクトリに戻れなくなる・・・)のですが、これもShellComboBoxのOnDropDownイベントで無理矢理Rootを'rfDesktop'にすれば解決できました(?)。
通りすがりさん。ありがとう御座いました。これで問題解決・・・と言いたいのですが問題がもう1つあります。
デスクトップのマイコンピュータやごみ箱等をダブルクリックするとIsFolderではフォルダと見なされてしまい、エラーが出てしまいます。これを解決する方法はないでしょうか?ご教授お願いします。
あまり良く見てませんが、フォルダダブルクリック時 (AutoNavigate=true) は、
SelectedFolder = nil で RootFolder に選択フォルダが入るので、
パスは RootFolder.PathName で取れると思うのですがそういうことではない?
ちなみにマイコンピュータなどは SelectedFolder.Properties に fpFileSystem が
ないので判定できると思います。
jamさん、凄いです。初めて知りました。感謝感謝
変身遅くなりました。jamさん、返答ありがとう御座います。
申し訳ありませんが、フォルダの識別がうまくいきません。次のようにしても駄目だったのですが、どこが違うのでしょうか?
//フォルダの識別
if (ShellListView1.SelectedFolder.IsFolder) and
(fpFileSystem in ShellListView1.SelectedFolder.Properties) then
どのタイミングですか?
ダブルクリック時なら RootFolder.Properties ですよ。
返信遅くなりました。
すみません。AutoNavigateをTrueにしていませんでした・・・。
しかし、こうするとどうしてもエラーが出てしまいます。もう一度言いますが、パスを取得したいのはファイルだけであって、フォルダは開くだけ、という風にしたいのです。(厳密に言えば、フォルダもファイルだったような気はしますが・・・)。
申し訳ありませんが、もう少し詳しく説明していただけないでしょうか?何とぞ初心者な者なのでお願い致します。
タイミングはダブルクリック時です。
(今までのレスで"返信"が"変身"になっていました。失礼しました。)
OnDblClick イベントで、
if ShellListVIew1.SelectedFolder <> nil then
// ファイルの処理
else
// フォルダの処理
です。
でもファイルのダブルクリックは関連付けが起動しますが良いのでしょうか...
返信遅くなりました。
できました。ですが、jamさんの言う通り、ファイルをダブルクリックすると起動してしまうのは問題ありです。何とか、これを防ぐ方法はないでしょうか?
OnChange で以下のようにしてください。
procedure TForm1.ShellListView1Change(Sender: TObject; Item: TListItem;
Change: TItemChange);
begin
with ShellListView1 do
begin
if SelectedFolder <> nil then
AutoNavigate := SelectedFolder.IsFolder;
end;
end;
うまくいきました。物分かりが悪くて長々と質問してしまってすみませんでした。
この質問に答えてくださった通りすがりさん、jamさん、ありがとう御座いました。
ツイート | ![]() |