ShellTreeViewのDropTargetへのパスを取得するには?

解決


蒲郡  2004-11-10 23:35:22  No: 11711

お世話になります。
D7にてShellTreeViewへのドロップによる
コピーや移動を行おうと考えています。

ShellTreeView1.DropTarget.textなどで
ドロップされたディレクトリ名は取得できるのですが、
そのディレクトリまでのフルパスを取得できません。
他の質問で紹介されていた、Parentを遡る方法は試しましたが、
この方法をShellTreeViewで行うと
  デスクトップ¥マイ  コンピュータ¥ローカル  ディスク(C:)¥・・・
となり、ファイルのコピーなどには適さない様です。

ファイルのコピーや移動に適したパスを取得するには
どうすれば良いのでしょうか?


deldel  2006-03-23 20:36:09  No: 11712

同じ疑問があったので検索していると、この質問を見つけました。
レスがなかったということは、これは難しいのでしょうか?


は?  2006-03-23 21:07:58  No: 11713

>   デスクトップ¥マイ  コンピュータ¥ローカル  ディスク(C:)¥・・・
上にたどりながら、文字列の最後にパスを追加しているから。

パスの文字列の頭に追加していくようにすれば問題ないでしょ?

HogeHoge
デスクトップ\HogeHoge
マイ  コンピュータ\デスクトップ\HogeHoge
C:\マイ  コンピュータ\デスクトップ\HogeHoge

難しいというより、アルゴリズムの問題かと?


deldel  2006-03-23 22:17:54  No: 11714

えーと、なんかちょっと違うと思うのですが、例えば、
エクスプローラを見ると、一番上に「デスクトップ」、その下に
「マイ コンピュータ」、さらにその下にドライブ名(C:)など・・・があり、
例えば「C:\Temp\Hoge」というフォルダのパスを求めると、
「デスクトップ\マイ コンピュータ\(C:)\Temp\Hoge」
などとなってしまいます。

そこで、:の文字の位置を探して、C:\Temp\Hoge を得ようとし、これは
うまくいったのですが、ネットワーク上のフォルダですと、
「デスクトップ\マイ ネットワーク\AAA\Temp」
などとなってしまい、だめでした。
本来は、「\\AAA\Temp」を得たいのですが・・・


igy  2006-03-23 22:44:15  No: 11715

これはどうです?

procedure TForm1.ShellTreeView1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  Shellfolder: TShellFolder;
  i: Integer;
begin
    for i:=0 to ShellTreeView1.Items.Count - 1 do
    begin
      if ShellTreeView1.Items[i] = ShellTreeView1.DropTarget then
      begin
        ShellFolder := ShellTreeView1.Folders[i];
        if Assigned(ShellFolder) then
          MessageDlg(ShellFolder.PathName, mtInformation, [mbOk], 0);
        break;
      end;
    end;
end;


igy  2006-03-23 23:10:36  No: 11716

AbsoluteIndexを使えば、こんな感じです。

procedure TForm1.ShellTreeView1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  Shellfolder: TShellFolder;
begin
    ShellFolder := ShellTreeView1.Folders[ShellTreeView1.DropTarget.AbsoluteIndex];
    if Assigned(ShellFolder) then
      MessageDlg(ShellFolder.PathName, mtInformation, [mbOk], 0);
end;


えっと・・・  2006-03-23 23:43:50  No: 11717

ShellTreeView1.SelectedFolder.PathName;

で得れるパスとはまた違うのでしょうか?

違うなら無視してください。


えっと・・・  2006-03-23 23:45:26  No: 11718

DropTargetの話だから違いますね。
よく読んでませんでした。
無視してください。


おれも「は?」だけど・・・  2006-03-24 01:15:09  No: 11719

使ったことありませんが・・・こんなのとか?

procedure TForm1.ShellTreeView1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  node:TTReeNode;
begin
  node := GetNodeAt(X, Y);
  if node <> nil then begin
    MessageDlg(TShellFolder(node.Data).PathName, mtInformation, [mbOk], 0);
  end;
end;


deldel  2006-03-24 17:44:04  No: 11720

「igy」さん、「おれも「は?」だけど・・・」さん、ありがとうございました。
どちらの方法もうまくいきました。
(ShellTreeView1.GetNodeAt と修正しましたが^^;)

このコンポは便利ですが、使い方が難しいですね。
「蒲郡」さんはこのレス読んでるかなぁ・・・


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

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






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