none
フォーム内のコントロールの複数選択について RRS feed

  • 質問

  • Visual Basic 2010 Expressにて開発を行っております。
    button1 を押せばコントロールが追加されそのコントロールはドラッグに対応しています。(test,test,defaultは追加したもので、自由にドラッグできます)
    私が実装したい機能は
    上図から下図のようにマウスでエリアを選択しそのエリア内のコントロールを一括してドラッグする(移動する) という機能です。
    ①どのようにしたら複数のコントロールをアクティブ状態?(セレクト状態?)にできるか
    ②複数選択後にドラッグ(移動)する機能は各コントロールにドラッグを対応させたのとおおよそ同じような感じでしょうか?
    この2点ご教授お願いします><
    なお下図の点線はペイントで付け加えたもので、実際には左クリックしながら動かしてもなんにも描画されません(涙)

    • 編集済み mo12mo34 2011年9月17日 11:11
    2011年9月17日 11:10

回答

  • やりたいことを砕いて、どこまでできているのか明確にしませんか?

    (1)一つのコントロールの選択、選択解除を実現する。
    (2)一つのコントロールの移動を実現する。
    (3)二つ以上のコントロールの選択、選択解除を実現する。
    (4)選択されているコントロールのまとめて移動を実現する。

    文面から想像すると、(1)と(2)は実現できているのですよね?(もしかして、(2)だけ?)
    (3)や(4)をどのようにすれば実現できるかは、(1)と(2)の実現方法に依存するので第三者には回答できません。
    (選択されているコントロールを持つ List(Of T) あたりでもあればできそうだとは思いますが、どこまで考えられていて、どこまでのクラスなら知っているのかがわからないので)

    (1)と(2)の現状の設計によっては、そのまま実現できるかもしれませんし、実現できないかもしれません。
    設計がまずい場合は再設計が必要になるかもしれませんね。

    モデリングツールを目指して適当に作っているのかもしれませんが、一度設計関連の本を読んでみた方がよいかもしれませんね。
    行き当たりばったりで作っても、質問ばっかりでなかなか進みませんので、自分で勉強する方法を探してみた方がよいかと思います。(それがある程度できないと、とても開発者とはいえません)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年9月17日 11:29
    モデレータ
  • 私の場合は選択状態をコントロールに頼るのではなく独自に管理しました。

    そして選択状態であることを表すインジケータを独自に描画しました。

    ドラッグ関係は下記が参考になるかも。

    http://dobon.net/vb/dotnet/control/draganddrop.html

    別スレッドで渋木さんもおっしゃっているように見てくれとモデルは分けた方がいいですよ。

    Document-View, MVCなどの対話型システムのアーキテクチャを研究されるときっと役に立ちます。

     


    http://systemartlaboratory.com/
    • 回答としてマーク 山本春海 2011年10月5日 5:32
    2011年9月17日 12:11
  • 外池です。

    やりたいことを、まず、言葉でご説明になっていることは、大変良いことだと思います。次に、その機能を現状で手に入る既製品のコントロールを使って少しずつプログラムを書き進めておられるようで、私としては間違った方向では無いと思います。

    ただ、今、なさっていることは「練習」みたいなもので、「本番」の前には、もう一度、緻密に設計されることが必要かもしれません。で、現状つかっておられるコントロールに備わっている機能と(ドキュメントに書いてある)、mo12mo34さんが実現させたい機能を、よく比較してみてください。

    コントロールを選択された状態でアクティブにする、という機能ですが、フォーカスが存在する、という状態はコントロールでは定義されていますが、部品として操作する対象として選択する、という機能は無いですよね。つまり、これは、mo12mo34さん自身でプログラムしないといけません。

    私も、「部品」の選択や移動など、少しプログラムしたことがありますので、その経験からいくつかコメントしますと

    1) mo12mo34さんが、取り扱いたい「部品」を、既存のコントロールから「派生」させて使うのか?(「派生」とは、まぁ、新たな機能を付け加える方法、とご理解ください。) まったく独自のクラスとしてすべての機能(部品をForm上に描画する機能も含む)を組み込むか、このあたり検討された方が良いでしょう。独自にすべてプログラムする方法も、意外と楽だったりもします。

    2)  1)の選択にかかわらず、やりたいこと全体を、言葉や図をつかって、「設計」の本をよく参考にしながら、全体の概要から初めて、細かいところへ、設計していくことですね。ここで、「概要」とは、「大体のイメージ」と言う意味ではありません。機能の大枠を示すものではあっても、厳密に大枠を定義したもの、とご理解ください。「選択」とはなんぞや、とか、どんな操作で「選択」するのか、とか、「選択」されたモノに対して何を行えるのか、とか・・・。

    モノ(いわゆる、オブジェクトの基になるクラスですね)、モノの状態(この場合ですと「選択」とか「非選択」、いわゆるプロパティーですね。)、モノへの働きかけ(「選択」することや、「選択」されたモノだけに適用できる動作など。いわゆるメソッドというもの)、この3種類を整理するわけです。

    参考になれば幸いです。

     


    (ホームページを再開しました)
    • 編集済み 外池 2011年9月17日 12:22
    • 回答としてマーク 山本春海 2011年10月5日 5:32
    2011年9月17日 12:20

すべての返信

  • やりたいことを砕いて、どこまでできているのか明確にしませんか?

    (1)一つのコントロールの選択、選択解除を実現する。
    (2)一つのコントロールの移動を実現する。
    (3)二つ以上のコントロールの選択、選択解除を実現する。
    (4)選択されているコントロールのまとめて移動を実現する。

    文面から想像すると、(1)と(2)は実現できているのですよね?(もしかして、(2)だけ?)
    (3)や(4)をどのようにすれば実現できるかは、(1)と(2)の実現方法に依存するので第三者には回答できません。
    (選択されているコントロールを持つ List(Of T) あたりでもあればできそうだとは思いますが、どこまで考えられていて、どこまでのクラスなら知っているのかがわからないので)

    (1)と(2)の現状の設計によっては、そのまま実現できるかもしれませんし、実現できないかもしれません。
    設計がまずい場合は再設計が必要になるかもしれませんね。

    モデリングツールを目指して適当に作っているのかもしれませんが、一度設計関連の本を読んでみた方がよいかもしれませんね。
    行き当たりばったりで作っても、質問ばっかりでなかなか進みませんので、自分で勉強する方法を探してみた方がよいかと思います。(それがある程度できないと、とても開発者とはいえません)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年9月17日 11:29
    モデレータ
  • 指針を示していただいてありがとうございます。

    設計関連の本から勉強しないとダメみたいですね。丁寧なご回答ありがとうございます><

    2011年9月17日 11:52
  • 私の場合は選択状態をコントロールに頼るのではなく独自に管理しました。

    そして選択状態であることを表すインジケータを独自に描画しました。

    ドラッグ関係は下記が参考になるかも。

    http://dobon.net/vb/dotnet/control/draganddrop.html

    別スレッドで渋木さんもおっしゃっているように見てくれとモデルは分けた方がいいですよ。

    Document-View, MVCなどの対話型システムのアーキテクチャを研究されるときっと役に立ちます。

     


    http://systemartlaboratory.com/
    • 回答としてマーク 山本春海 2011年10月5日 5:32
    2011年9月17日 12:11
  • 外池です。

    やりたいことを、まず、言葉でご説明になっていることは、大変良いことだと思います。次に、その機能を現状で手に入る既製品のコントロールを使って少しずつプログラムを書き進めておられるようで、私としては間違った方向では無いと思います。

    ただ、今、なさっていることは「練習」みたいなもので、「本番」の前には、もう一度、緻密に設計されることが必要かもしれません。で、現状つかっておられるコントロールに備わっている機能と(ドキュメントに書いてある)、mo12mo34さんが実現させたい機能を、よく比較してみてください。

    コントロールを選択された状態でアクティブにする、という機能ですが、フォーカスが存在する、という状態はコントロールでは定義されていますが、部品として操作する対象として選択する、という機能は無いですよね。つまり、これは、mo12mo34さん自身でプログラムしないといけません。

    私も、「部品」の選択や移動など、少しプログラムしたことがありますので、その経験からいくつかコメントしますと

    1) mo12mo34さんが、取り扱いたい「部品」を、既存のコントロールから「派生」させて使うのか?(「派生」とは、まぁ、新たな機能を付け加える方法、とご理解ください。) まったく独自のクラスとしてすべての機能(部品をForm上に描画する機能も含む)を組み込むか、このあたり検討された方が良いでしょう。独自にすべてプログラムする方法も、意外と楽だったりもします。

    2)  1)の選択にかかわらず、やりたいこと全体を、言葉や図をつかって、「設計」の本をよく参考にしながら、全体の概要から初めて、細かいところへ、設計していくことですね。ここで、「概要」とは、「大体のイメージ」と言う意味ではありません。機能の大枠を示すものではあっても、厳密に大枠を定義したもの、とご理解ください。「選択」とはなんぞや、とか、どんな操作で「選択」するのか、とか、「選択」されたモノに対して何を行えるのか、とか・・・。

    モノ(いわゆる、オブジェクトの基になるクラスですね)、モノの状態(この場合ですと「選択」とか「非選択」、いわゆるプロパティーですね。)、モノへの働きかけ(「選択」することや、「選択」されたモノだけに適用できる動作など。いわゆるメソッドというもの)、この3種類を整理するわけです。

    参考になれば幸いです。

     


    (ホームページを再開しました)
    • 編集済み 外池 2011年9月17日 12:22
    • 回答としてマーク 山本春海 2011年10月5日 5:32
    2011年9月17日 12:20
  • こんにちは、mo12mo34 さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    しばらく時間が経ちましたが、その後いかがでしょうか。

    参考になるアドバイスをみなさんからいただいているようでしたので、勝手ながら私のほうで一旦回答としてマークさせていただきました。
    アドバイスくださったみなさん、ありがとうございます。

    実際に不明点等が明確になりましたら詳細を改めてご質問を投稿くださいね。

    今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
                                                                                                                                 
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年10月5日 5:32