[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『UserForm上でOLEDragDropイベントを起こしたいのでListViewを使ってみた。が・・・』(白茶)
●目的
エクスプローラからUserForm(ShowModal=False)にファイルをD&Dしてファイルパスを取得し、 同UserForm上のComboboxにファイルのフルパスを列挙すること。 (列挙するのは拡張子がsql又はtxtのファイルのみ)
なるべくUserForm上のどこにドロップしてもイケる様にしたいです。
●現状
まずUserFormと同じ面積のListViewをUserFormの最前面に配置してVisibleをFalseにしておく。
UserForm_BeforeDragOverイベントで AppActivate Me.Caption ListView1.Visible = True としてListViewへのOLEDragDropイベントに備える
ListView1_OLEDragDropイベント内で ComboboxにAddItemしていき、 最後にListViewのVisibleをFalseにする
というところまではできました。
●問題点
ListViewへドラッグしたまでは良かったが、ドロップした場所がUserForm外だった場合 ListViewが最前面に残ったままになってしまい、他のコントロールが隠れて 以降の作業が続行できない。
# 尚、ドロップした場所がUserForm外で、且つExcel上だった場合は # 結果として該当ファイルをExcelが開こうとする訳ですが、 # それについては今回問題としていません。
●ボツ案
UserForm_BeforeDragOverの引数State あるいは ListViewのOLEDragOverの引数State を使って何とかならないかと思って、 単純に Stateが1だったらListViewのVisibleをFalseにする という風にしてみたところ、 ドラッグ中にListViewのVisibleが激しく入れ替わるばかりで お話になりませんでした。
●てな訳で
なにか良い方法はありませんでしょうか?
「問題点」で述べた現象の回避策でも、「ボツ案」に対するアドバイスでもよいです。 ListViewを使ったのは今回が初めてで、実はあまり理解してません。 OLEDragDropイベントを実現する為だけに試してみました。 従って冒頭の「目的」を果たすものであれば、全然違うアプローチでもよいです。
宜しくお願いします。
(白茶)
案だけですが・・・・。
案1
UserForm_BeforeDragOverイベントで、リストビューコントロール表示後の時間で自動で非表示に 戻す という方法です。通常、リストビューコントロール表示後に ドロップ動作って、せいぜい 1,2秒ですよね? この時間が過ぎたら、非表示にする ということです。 時間制約を持つという普通のドラッグ&ドロップにない制限ができてしまいますが・・・。
案2 リストビューコントロールは、Userformいっぱいのサイズにしてあるのですよね? 他のコントロールってフレームで囲むとリストビューコントロールより、前面表示できますよね? 各コントロールのサイズに合わせて、フレームのサイズもピッタリにします。 フレーム枠や見出しもなしにして・・・。
後は、リストビューコントロールの背景色を通常のUserformと同じような色にしておけば、 そのまま、OLEDragDropイベントが使えますよね? 問題は、フレームで囲むとテキスボックス等の入力系のイベント発生順序にバグがありましたね!! コントロールの内容によっては、ダメもしれまあせんが・・・・。
http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips03.htm
どちらも帯に短し、・・・ですが、ちょっと思いついたことだけ記述しました。
ichinose
2つの案ありがとうございます。 どちらも思い付かなかった事です。 参考になります。
あれから自分なりに「とりあえず」の落し所として、 ListViewのClickイベントでVisibleをFalseに、 という事にしています。 (が、作り手としての心情的には、納得いってません)
それよりは案1の方がユーザーにとっては親切ですね。 >時間制約を持つという普通のドラッグ&ドロップにない制限 これは確かに・・・そうですね・・・
APIのGetAsyncKeyStateでマウスボタンUPを監視しつつ・・・ ってやれば、なんだかイケそうな雰囲気ですね。 ちょっと悩んでみます。
案2は存じませんでした。 これはかなり現実的っぽいですね。 案1の試行錯誤が一段落したら試してようと思います。 お察しの通り、TextBoxあるんで、 イベント関連の動作確認をしてみないと・・・
アドバイスありがとうございました。 行き詰ったら、またお願いします。
(白茶)
納得のいく結論が出ましたので、一応ご報告しておきます。
かなりの紆余曲折を経たのですが、 (一時はClassでわざわざイベント作るところまで行ってしまった) 意外にも原点に戻っちゃったです。
結局ListViewのOLEDragOverの引数Stateを使って解決しました。
引数StateをStatic変数に入れ、前回呼び出し時の値と比較する方法です。 「前回が2で今回が1だったらListViewを隠す」という感じ
>ichinoseさん 案2の方は、 やはりイベント発生順序の問題を実装前に発見してしまったので、 今回の私のフォーム上では断念しました。
しかし面白い方法ですね。別のフォームで機会があったら 使わせていただきます。 この度はありがとうございました。
他にも頭を使って下さったであろう方々にも お礼申し上げます。 お付き合い頂き、ありがとうございました。
(白茶)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.