お世話になります。
D7にてShellTreeViewへのドロップによる
コピーや移動を行おうと考えています。
ShellTreeView1.DropTarget.textなどで
ドロップされたディレクトリ名は取得できるのですが、
そのディレクトリまでのフルパスを取得できません。
他の質問で紹介されていた、Parentを遡る方法は試しましたが、
この方法をShellTreeViewで行うと
デスクトップ¥マイ コンピュータ¥ローカル ディスク(C:)¥・・・
となり、ファイルのコピーなどには適さない様です。
ファイルのコピーや移動に適したパスを取得するには
どうすれば良いのでしょうか?
同じ疑問があったので検索していると、この質問を見つけました。
レスがなかったということは、これは難しいのでしょうか?
> デスクトップ¥マイ コンピュータ¥ローカル ディスク(C:)¥・・・
上にたどりながら、文字列の最後にパスを追加しているから。
パスの文字列の頭に追加していくようにすれば問題ないでしょ?
HogeHoge
デスクトップ\HogeHoge
マイ コンピュータ\デスクトップ\HogeHoge
C:\マイ コンピュータ\デスクトップ\HogeHoge
難しいというより、アルゴリズムの問題かと?
えーと、なんかちょっと違うと思うのですが、例えば、
エクスプローラを見ると、一番上に「デスクトップ」、その下に
「マイ コンピュータ」、さらにその下にドライブ名(C:)など・・・があり、
例えば「C:\Temp\Hoge」というフォルダのパスを求めると、
「デスクトップ\マイ コンピュータ\(C:)\Temp\Hoge」
などとなってしまいます。
そこで、:の文字の位置を探して、C:\Temp\Hoge を得ようとし、これは
うまくいったのですが、ネットワーク上のフォルダですと、
「デスクトップ\マイ ネットワーク\AAA\Temp」
などとなってしまい、だめでした。
本来は、「\\AAA\Temp」を得たいのですが・・・
これはどうです?
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;
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;
ShellTreeView1.SelectedFolder.PathName;
で得れるパスとはまた違うのでしょうか?
違うなら無視してください。
DropTargetの話だから違いますね。
よく読んでませんでした。
無視してください。
使ったことありませんが・・・こんなのとか?
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;
「igy」さん、「おれも「は?」だけど・・・」さん、ありがとうございました。
どちらの方法もうまくいきました。
(ShellTreeView1.GetNodeAt と修正しましたが^^;)
このコンポは便利ですが、使い方が難しいですね。
「蒲郡」さんはこのレス読んでるかなぁ・・・
ツイート | ![]() |