ドラック&ドロップでモーダルなフォームを表示する

解決


ハイジ  2006-09-10 03:56:04  No: 133165

こんにちわ。

どなたか方法を教えてください。

メインフォームにファイルをドロップすると、
別フォームが立ち上がるようなプログラムを作りたいと思っています。

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なのですが、これだとモードレスになってしまいます。

モーダルなまま、動作させたいのですが、これって不可能なんでしょうか?

よろしくお願いします。


ガッ  2006-09-10 04:12:35  No: 133166

ワンクッション置いて、Form1_DragDropとは非同期に表示するようにしてみては?


ハイジ  2006-09-10 04:25:27  No: 133167

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 登録は成功しませんでした。"

他に、何かいい方法あるでしょうか?

試してみますので、ヒントいただけないでしょうか?

よろしくです。


Hongliang  URL  2006-09-10 06:01:58  No: 133168

こんな流れになるかと。
・DropDown イベントハンドラでデータを受け取り、BackgroundWorker.RunWorkerAsync を必要な引数つきで呼び出す。
・BackgroundWorker.DoWork は Result に Argument を引き渡す。
・BackgroundWorker.RunWorkerCompleted イベントで Result を利用しつつ Form.ShowDialog を実行する。

BackgroundWorker の解説にある、
> DoWork イベント ハンドラでユーザー インターフェイス オブジェクトを操作しないように注意する必要があります。
> 代わりに、ProgressChanged イベントと RunWorkerCompleted イベントを通じてユーザー インターフェイスと通信します。
と言う部分は重要ですのでしっかり理解してください。

Control.BeginInvoke/EndInvoke を使えばスレッドを使う必要もなくなるんですが、EndInvoke の呼び出しが些か面倒ですね。


ハイジ  2006-09-10 06:13:36  No: 133169

おぉぉ!!
出来ました。
出来ました!

Hongliangさんの言うとおりに実施したら、出来ました。

ほんとに、ありがとうございます。


ハイジ  2006-09-10 06:14:17  No: 133170

出来たことに感動してたら、
解決のチェックをするのを忘れてしまった。。。


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

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






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