none
openFileDialogやDragDropイベントで得たファイルパス情報を他のメソッドで使うには RRS feed

  • 質問

  • いつもお世話になっております。趣味でWindowsFormアプリケーションを作成しようと勉強しています。

    openFileDialogやDragDropイベントでアプリケーションにファイル情報やサムネイルを取り込みます。この処理をbackGroundWorkerでやりたいのですが、どのようにしたらいいのでしょうか。例えばlistView1のDragDropイベントを作ると以下のようにメソッドが作成されてファイルパスが得られますが

    private void listView1_DragDrop(object sender, DragEventArgs e){

     string[] handles = (string[])e.Data.GetData(DataFormats.FileDrop, false);

    }

    void を string に変えて return で戻り値を設定できるのでしょうか?もしコレでいい場合、object sender, DragEventArgs eの扱いがわからないです。初歩的な質問かとは思いますがアドバイスをよろしくお願いいたします。

    2012年2月5日 15:50

回答

  • 何をしたいのかよくわかりません。

     

    >void を string に変えて return で戻り値を設定できるのでしょうか?

    聞く前にやってみたらいいんじゃないですか?

     

    ちなみに、sender はイベントを発生させたオブジェクトです。この場合は listView1 でしょう。

    e はファイルパスを取得するのに使ってますよね。いずれも使う必要がなければ無理に使う必要はありません。

    取得したファイルパスを元に「ファイル情報やサムネイルを取り込」むという処理をすればいいと思います。

    BackgroundWorker のバックグラウンド処理に取得したパスを渡すには、RunWorkerAsync メソッドの引数で渡すか、クラスのフィールドを使を使えば良いでしょう。


    • 編集済み galaco 2012年2月5日 18:13
    • 回答としてマーク millionx 2012年2月5日 22:20
    2012年2月5日 18:12
  • 質問文の「例えば」以降は忘れていただいてもかまいません。dragdropメソッドで戻り値を設定すれば他のメソッドで戻り値を使えるのかなと思っただけです。

    DragDrop イベントの戻り値を仮に設定できたとして、誰が受け取るとお考えですか?
    そして、万が一、DragDrop イベントに複数のイベントハンドラが設定されていた場合、どのイベントハンドラの戻り値が有効になるとお考えですか?

    イベントハンドラの戻り値が仮に設定できたとしても、それを受け取るのはそのイベントを起こした人、今回であれば ListView クラスになりますので、あなたのコードで戻り値を受け取るチャンスはありません。

    もしコレでいい場合、object sender, DragEventArgs eの扱いがわからないです。と述べたとおりこれらの引数の扱いがわかりませんでした。(質問前に試行錯誤していることをご理解ください)

    相手が見えない場所にいるのに、書いていないことを「ご理解ください」というのは無理がありますよ。
    試行錯誤した結果だというのであれば、どういったことを試して、どうだったかを書くのが筋です。(そうじゃないと、試してだめだった結果が提案されて質問者・回答者双方が無駄な時間を過ごすことになる)
    また、「object sender, DragEventArgs e の扱いがわからない」と言われても、どこをどのように疑問に感じているのか、伝わってきませんので、答えられません。どこが疑問なのかを相手に伝えるために、もっと努力が必要なのかもしれません。

     

    さて、BackgroundWorker に渡したいのであれば、DragDrop イベントで backgroundWorker1.RunWorkerAsync(arg); なりすればよいのでは。
    引数は string[] を渡すなり、それをメンバーに持つクラスを渡すなり、あなたが望むようにコーディングすればよいだけです。

    いろいろと、BackgroundWorker を使うサンプルを検索し、読みあさってみるのも自分の考えを広げる一手になるかもしれませんね。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2012年2月5日 21:39
    モデレータ
  • DragDropの方で

    string[] handles = (string[])e.Data.GetData(DataFormats.FileDrop, false);

    backGroundWorker1.RunWorkerAsync(handles);

    と記述し

    backGroundWorker1_DoWorkで

    string[] handles = (string[])e.Argument;

    を記述すれば渡すことが出来ました。

     

    他いろいろとアドバイスありがとうございました。

    • 回答としてマーク millionx 2012年2月5日 22:20
    2012年2月5日 22:20

すべての返信

  • 何をしたいのかよくわかりません。

     

    >void を string に変えて return で戻り値を設定できるのでしょうか?

    聞く前にやってみたらいいんじゃないですか?

     

    ちなみに、sender はイベントを発生させたオブジェクトです。この場合は listView1 でしょう。

    e はファイルパスを取得するのに使ってますよね。いずれも使う必要がなければ無理に使う必要はありません。

    取得したファイルパスを元に「ファイル情報やサムネイルを取り込」むという処理をすればいいと思います。

    BackgroundWorker のバックグラウンド処理に取得したパスを渡すには、RunWorkerAsync メソッドの引数で渡すか、クラスのフィールドを使を使えば良いでしょう。


    • 編集済み galaco 2012年2月5日 18:13
    • 回答としてマーク millionx 2012年2月5日 22:20
    2012年2月5日 18:12
  • 回答ありがとうございます。

    >何をしたいのかよくわかりません。

    説明不足で申し訳ありません。しかし後半に答えてくださったことはまさに私の望んだ回答となっていると思います。ありがとうございます。

    質問文の「例えば」以降は忘れていただいてもかまいません。dragdropメソッドで戻り値を設定すれば他のメソッドで戻り値を使えるのかなと思っただけです。

    >>void を string に変えて return で戻り値を設定できるのでしょうか?

    >聞く前にやってみたらいいんじゃないですか?

    もしコレでいい場合、object sender, DragEventArgs eの扱いがわからないです。と述べたとおりこれらの引数の扱いがわかりませんでした。(質問前に試行錯誤していることをご理解ください)

    2012年2月5日 18:48
  • 質問文の「例えば」以降は忘れていただいてもかまいません。dragdropメソッドで戻り値を設定すれば他のメソッドで戻り値を使えるのかなと思っただけです。

    DragDrop イベントの戻り値を仮に設定できたとして、誰が受け取るとお考えですか?
    そして、万が一、DragDrop イベントに複数のイベントハンドラが設定されていた場合、どのイベントハンドラの戻り値が有効になるとお考えですか?

    イベントハンドラの戻り値が仮に設定できたとしても、それを受け取るのはそのイベントを起こした人、今回であれば ListView クラスになりますので、あなたのコードで戻り値を受け取るチャンスはありません。

    もしコレでいい場合、object sender, DragEventArgs eの扱いがわからないです。と述べたとおりこれらの引数の扱いがわかりませんでした。(質問前に試行錯誤していることをご理解ください)

    相手が見えない場所にいるのに、書いていないことを「ご理解ください」というのは無理がありますよ。
    試行錯誤した結果だというのであれば、どういったことを試して、どうだったかを書くのが筋です。(そうじゃないと、試してだめだった結果が提案されて質問者・回答者双方が無駄な時間を過ごすことになる)
    また、「object sender, DragEventArgs e の扱いがわからない」と言われても、どこをどのように疑問に感じているのか、伝わってきませんので、答えられません。どこが疑問なのかを相手に伝えるために、もっと努力が必要なのかもしれません。

     

    さて、BackgroundWorker に渡したいのであれば、DragDrop イベントで backgroundWorker1.RunWorkerAsync(arg); なりすればよいのでは。
    引数は string[] を渡すなり、それをメンバーに持つクラスを渡すなり、あなたが望むようにコーディングすればよいだけです。

    いろいろと、BackgroundWorker を使うサンプルを検索し、読みあさってみるのも自分の考えを広げる一手になるかもしれませんね。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2012年2月5日 21:39
    モデレータ
  • DragDropの方で

    string[] handles = (string[])e.Data.GetData(DataFormats.FileDrop, false);

    backGroundWorker1.RunWorkerAsync(handles);

    と記述し

    backGroundWorker1_DoWorkで

    string[] handles = (string[])e.Argument;

    を記述すれば渡すことが出来ました。

     

    他いろいろとアドバイスありがとうございました。

    • 回答としてマーク millionx 2012年2月5日 22:20
    2012年2月5日 22:20
  • >>>void を string に変えて return で戻り値を設定できるのでしょうか?
    >>聞く前にやってみたらいいんじゃないですか?
    >もしコレでいい場合、object sender, DragEventArgs eの扱いがわからないです。と述べたとおりこれらの引数の扱いがわかりませんでした。(質問前に試行錯誤していることをご理解ください)
    イベントハンドラの void を string に変えるとコンパイルすら通らないんですよ。
    試行錯誤してるなら、コンパイルすら通らないものを「できますか」なんて質問は出てこないのです。
    RunWorkerAsync メソッドの引数もヘルプに載っていることです。
    millionx さんはこのページを見たのですか?
    見たのなら RunWorkerAsync(argument) の argument にいろんなものを突っ込んで実行してみましたか?
    試行錯誤とはこういうことを言います。
    2012年2月6日 2:08
  • millionxさんは他の質問を見る限り正式リリース前のVS11を使われています。コンパイルが通らなかったとしても、それがコードが間違っているからなのか、VS側の問題なのか、それを判断できない、する気がないのでしょう。
    2012年2月6日 2:18
  • 先輩方のアドバイスありがとうございます。今後の参考にさせて頂きます。
    2012年2月6日 6:12