ShellListViewでダブルクリックでファイルのパスを取得するには?

解決


Uga  2004-09-28 01:23:48  No: 11154

度々の事ながら、質問させていただきたいと思います。

ShellListViewでファイルのアイコンをダブルクリックしたとき(フォルダは除く)、そのファイルのパスを取得するというものを作りたいのですが、うまくいきません。
ファイルならうまくいくのですが、フォルダをダブルクリックしたらエラーが出てしまうのです。
おそらく、SelectedFolderのところがおかしくなると思うのですが対処法が分かりません。(IsFolderを使っても駄目でした。)
どうすればうまくいくのでしょうか?ご教授お願いします。


通りすがり  2004-09-28 08:26:10  No: 11155

AutoNavigateがfalseであっても問題がないようであれば、オブジェクトインスペクタでAutoNavigateをfalseにしておくとフォルダ選択時のエラーはないみたいです。
ただ、オブジェクトインスペクタで変えておくと問題ないみたいですが、dbclickイベントでfalseに書き換えてもダメっぽいです。


Uga  2004-09-29 03:17:32  No: 11156

変身遅くなりました。通りすがりさん、返答ありがとう御座います。
確かに通りすがりさんの言う通り、エラーは出なくなりましたが、私はフォルダがダブルクリックされたらそのフォルダを開いていくという風にしたいので、ちょっとこの方法では納得ができません。(えらそーな事言ってすみません。)
そこのところもうまく行くような方法はないでしょうか?ご教授お願いします。


通りすがり  2004-09-29 04:02:44  No: 11157

それじゃあ、AutoNavigateをfalseにして、

  Caption := ShellListVIew1.SelectedFolder.PathName ;
  ShellListView1.Root := Caption;

とかいう、激しくセコイ方法とか、、、


Uga  2004-09-29 05:08:28  No: 11158

ナルホド!その手があったか!っと驚いてみたり(w
確かに無理矢理な感じはしますが、できることはできますね。
ただ、ShellComboBoxとの対応がうまくいかなくなる(ShellComboBoxのRootも変化して、ホームディレクトリに戻れなくなる・・・)のですが、これもShellComboBoxのOnDropDownイベントで無理矢理Rootを'rfDesktop'にすれば解決できました(?)。

通りすがりさん。ありがとう御座いました。これで問題解決・・・と言いたいのですが問題がもう1つあります。

デスクトップのマイコンピュータやごみ箱等をダブルクリックするとIsFolderではフォルダと見なされてしまい、エラーが出てしまいます。これを解決する方法はないでしょうか?ご教授お願いします。


jam  2004-09-29 05:42:40  No: 11159

あまり良く見てませんが、フォルダダブルクリック時 (AutoNavigate=true) は、
SelectedFolder = nil で RootFolder に選択フォルダが入るので、
パスは RootFolder.PathName で取れると思うのですがそういうことではない?

ちなみにマイコンピュータなどは SelectedFolder.Properties に fpFileSystem が
ないので判定できると思います。


通りすがり  2004-09-29 08:20:12  No: 11160

jamさん、凄いです。初めて知りました。感謝感謝


Uga  2004-09-30 02:22:59  No: 11161

変身遅くなりました。jamさん、返答ありがとう御座います。
申し訳ありませんが、フォルダの識別がうまくいきません。次のようにしても駄目だったのですが、どこが違うのでしょうか?

//フォルダの識別
if (ShellListView1.SelectedFolder.IsFolder) and           
   (fpFileSystem in ShellListView1.SelectedFolder.Properties) then


jam  2004-09-30 03:25:57  No: 11162

どのタイミングですか?

ダブルクリック時なら RootFolder.Properties ですよ。


Uga  2004-10-01 02:47:38  No: 11163

返信遅くなりました。

すみません。AutoNavigateをTrueにしていませんでした・・・。
しかし、こうするとどうしてもエラーが出てしまいます。もう一度言いますが、パスを取得したいのはファイルだけであって、フォルダは開くだけ、という風にしたいのです。(厳密に言えば、フォルダもファイルだったような気はしますが・・・)。

申し訳ありませんが、もう少し詳しく説明していただけないでしょうか?何とぞ初心者な者なのでお願い致します。
タイミングはダブルクリック時です。
(今までのレスで"返信"が"変身"になっていました。失礼しました。)


jam  2004-10-01 04:17:19  No: 11164

OnDblClick イベントで、

if ShellListVIew1.SelectedFolder <> nil then
  // ファイルの処理
else
  // フォルダの処理

です。

でもファイルのダブルクリックは関連付けが起動しますが良いのでしょうか...


Uga  2004-10-02 02:19:36  No: 11165

返信遅くなりました。

できました。ですが、jamさんの言う通り、ファイルをダブルクリックすると起動してしまうのは問題ありです。何とか、これを防ぐ方法はないでしょうか?


jam  2004-10-02 03:56:40  No: 11166

OnChange で以下のようにしてください。

procedure TForm1.ShellListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
  with ShellListView1 do
  begin
    if SelectedFolder <> nil then
      AutoNavigate := SelectedFolder.IsFolder;
  end;
end;


Uga  2004-10-02 05:17:42  No: 11167

うまくいきました。物分かりが悪くて長々と質問してしまってすみませんでした。
この質問に答えてくださった通りすがりさん、jamさん、ありがとう御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加