こんにちわ。
どなたか方法を教えてください。
メインフォームにファイルをドロップすると、
別フォームが立ち上がるようなプログラムを作りたいと思っています。
Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
Dim tempForm As New Form2
' ドロップ&ドラッグされたファイル名を設定
tempForm.textBox1.Text = e.Data.GetData(DataFormats.Text)
' フォームをモーダルで表示
tempForm.showDialog(Me)
End Sub
これを実行すると、ドロップ元のエクスプローラが動かなくなってしまいます。
showDialogをshowに変えると、OKなのですが、これだとモードレスになってしまいます。
モーダルなまま、動作させたいのですが、これって不可能なんでしょうか?
よろしくお願いします。
ワンクッション置いて、Form1_DragDropとは非同期に表示するようにしてみては?
BackgroundWorkerを使って試してみました。
Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
Dim tempForm As New Form2
' ドロップ&ドラッグされたファイル名を設定
tempForm.textBox1.Text = e.Data.GetData(DataFormats.Text)
BackgroundWorker1.RunWorkerAsync(tempForm)
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
DirectCast(e.Argument, Form2).ShowDialog() ' ★
End Sub
上記★の箇所で、以下のエラーが発生してしまいます。
System.InvalidOperationException はユーザー コードによってハンドルされませんでした。
Message="DragDrop 登録は成功しませんでした。"
他に、何かいい方法あるでしょうか?
試してみますので、ヒントいただけないでしょうか?
よろしくです。
こんな流れになるかと。
・DropDown イベントハンドラでデータを受け取り、BackgroundWorker.RunWorkerAsync を必要な引数つきで呼び出す。
・BackgroundWorker.DoWork は Result に Argument を引き渡す。
・BackgroundWorker.RunWorkerCompleted イベントで Result を利用しつつ Form.ShowDialog を実行する。
BackgroundWorker の解説にある、
> DoWork イベント ハンドラでユーザー インターフェイス オブジェクトを操作しないように注意する必要があります。
> 代わりに、ProgressChanged イベントと RunWorkerCompleted イベントを通じてユーザー インターフェイスと通信します。
と言う部分は重要ですのでしっかり理解してください。
Control.BeginInvoke/EndInvoke を使えばスレッドを使う必要もなくなるんですが、EndInvoke の呼び出しが些か面倒ですね。
おぉぉ!!
出来ました。
出来ました!
Hongliangさんの言うとおりに実施したら、出来ました。
ほんとに、ありがとうございます。
出来たことに感動してたら、
解決のチェックをするのを忘れてしまった。。。
ツイート | ![]() |