ドロップ先フォルダを取得するには?


UAB  2005-12-18 05:41:52  No: 128988

おせわになります。
ただ今FTPクライアントをVB6.0にて作成しています。

接続先のファイル一覧(ListView)からデスクトップやエクスプローラに
ドラッグ&ドロップでダウンロードさせたいのですが、その時点では
ファイルがローカルに無いため、ドロップができません。
ドロップ先のフォルダを取得できれば、getメソッドにパスを書けるのですが
いくら検索してもそのような情報がありません。無理なのでしょうか・・・

D&Dでダウンロードをするいい方法があれば願います。


ガッ  2005-12-18 07:11:04  No: 128989

うーん…K.J.K.さんのとあるサイトから出発していって、
ICopyHookインタフェイスが関係有りそうな気がしてきました。
…でもまぁ、やったことが無いので、とりあえずここまでです。

K.J.K.さんのとあるサイト:
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/

ICopyHook(IShellCopyHook?):
http://www.asahi-net.or.jp/~GV4J-SGUR/narik/stp002b.htm
↑はgoogleで"CopyCallBack"について検索して得られました


DVDer  2005-12-18 07:21:29  No: 128990

Private Sub ListView1_OLEStartDrag(Data As DataObject, _
                                           AllowedEffects As Long)

  一旦ダウンロード処理

  Data.SetData , vbCFFiles
  Data.Files.Add "一旦ダウンロードしたファイルパス"

  AllowedEffects = vbDropEffectCopy Or vbDropEffectMove Or vbDropEffectLink
End Sub

でいいかな?


UAB  2005-12-18 10:40:31  No: 128991

ガッ様、DVDer様ご回答頂きありがとうございました。

>ガッ様
ICopyHookというものがあるんですか。
検索してみましたが難しそうです..orz
VBしか出来ない私のスキルではちょっと無理かとおもいますが
継続して調べてみます。

>DVDer様
私はOLEについて無知だったと実感します^^;
OLEStartDragに書けば良かったんですね。
ですが、いま実行してみたところMouseDownイベントでダウンロードが始まり
大きいファイルだとフリーズしてしまいます。

スマートではないのですが回避策として、
1.MouseDownイベントでドラッグ開始&タイマーを起動
2.タイマー内でGetAsyncKeyStateを呼び、左ボタンの状態を拾う
3.左ボタンを離した状態かつ現在のEffectが1であればダウンロード
4.ダウンロードファイルをDataオブジェクトに追加
という風に変更しましたが、ダウンロードが完了する頃にはDataオブジェクトが
既に無いのかエラーになってしまいました。

やはりICopyHookでコピーを検知するしか・・・(;_;)
皆様、もう少しお力を御貸し頂けますでしょうか。


ガッ  2005-12-18 11:20:03  No: 128992

※ICopyHookですが、実体が分からないので勧めていいものかどうか、
  投稿した後なのに悩んでおります(ぇ

私の案は切り捨てて、DVDerさんの方法を取り入れて考えてみてください。

…ところで、"MouseDown"イベントはどこから出てきたのだろう…(ん


UAB  2005-12-18 12:00:24  No: 128993

> ※ICopyHookですが、実体が分からないので勧めていいものかどうか、
>   投稿した後なのに悩んでおります(ぇ
あの後、色々と探してみましたがさっぱりわかりませんでした;

>…ところで、"MouseDown"イベントはどこから出てきたのだろう…(ん
サンプルコードを使用したためです ^^;
http://homepage1.nifty.com/rucio/main/technique/tec16_DragDrop.htm
タイミングについては
>状況に応じてもっとも適切なイベントを自分で探すことになります
という記述がありますね。

MouseDownではなくて、ほかのタイミングでドラッグを開始するべきってことですか。
ダウンロードが完了したあとにドラッグスタートが理想なのですが、ダウンロード前に
ドラッグスタートしないとEffect = 1なんていう判断もできませんし。

ドロップ先のパスが取得できれば解決なんですが・・・


K.J.K.  2005-12-18 18:48:23  No: 128994

いや、こういうときはICopyHookではないですよ。
単純にDrag&Dropで対応します。

ただし、動的なデータを伴うDrag&DropはVB6では実装しにくいので、
その部分だけ他の言語などで作るほうがいいかも知れません。
# できないとはいえないけれども結構面倒。

MSDNでは、
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_programming/transferring/transfer.asp
になります。
# これは今まで何度引用したことか。

実際に転送するもののフォーマットは
CFSTR_FILECONTENTS
CFSTR_FILEDESCRIPTOR
の2種類です。この2つのうちの前者を実装するのには、VB6単体では
かなり面倒になっています。
# VB.NETでも既存のDrag&Dropの機能をそのまま使う限りは駄目。


UAB  2005-12-18 19:55:10  No: 128995

K.J.K.様 ご助言ありがとうございます。
>その部分だけ他の言語などで作るほうがいいかも知れません。
やはりVBでは難しい処理なんですね。
>CFSTR_FILECONTENTS
>CFSTR_FILEDESCRIPTOR
上の2つをぐぐってみましたが、
Cのサンプルばかりでした(しかも英語≧д≦;)
しかし、この線で行くしかないなら頑張ってみようかと思います。


DVDer  2005-12-18 22:05:40  No: 128996

>MouseDownイベントでダウンロードが始まり
大きいファイルだとフリーズ

そうかぁ、当然といえば・・・・。安易に考えすぎてました。

スレ主旨から少しずれるかもしれませんが私は似たようなことを
WebBrowserでしてました。

WebBrowser1.Navigate2 "ftp://" & "FTP_URL"
で、ログインダイアログがでるので楽ですよー。
しかし、技術はついてません(笑

ま、どうしようもないときの1案として・・・・。


ガッ  2005-12-18 22:19:43  No: 128997

※性懲りもなく出てきました。

現状で問題となっているのは、
・[シェル⇔自アプリケーション]間の、コピーによるデータの授受が面倒
という部分ですよね。

これはシェルを相手にしているからであって、自アプリケーションで"閉じて"いる場合はもっと楽に出来るのではないでしょうか?
(そう思うだけで、実際に出来るかどうかはわかりません(orz )

例えば、
・ローカルを表示するリストビュー:ListViewLocal
  リモートを表示するリストビュー:ListViewRemote
  を作って、リストビュー間のオブジェクトのコピーで、
  実際のコピーの動作を記述(何を使ってダウンロードしているかは分かりませんが、非同期でも対応できると思います)

とか?
…これでは、一般的なFTPソフトっぽいですね。


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

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






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