none
オブジェクトをフォームに張り付けるのと、コードでフォームにオブジェクトを発生させるのはどちらが良いのでしょうか? RRS feed

  • 質問

  • フォームにオブジェクトを貼り付けるのと、コードによりオブジェクトを発生させるのでは、どちらが良いのだろうかと考えています。

    フォームに自作のカレンダーを載せているのですが、ラベルの数が150以上になっています。MouseEnter、MouseLeave、Clickなどのイベントコードを書いても、各ラベルにそれらのイベントを割り当てるのも一苦労です。関数を作ってまとめてはいるのですが...。

    何とかならないものかと、コードでオブジェクトを発生させた場合は、EventHandlerを使ってイベントすぐに割り当てることができるので、コードで発生させた方が数が多い場合はメリットの方が大きいと考えるようになりました。

    同種のオブジェクトの数が増えて割り当て等が大変になる場合は、コードで発生させた方が良いと思うのですが、軽快さとかメモリーの観点から何か判断基準になるものがないのか、教えていただきたいです。

    2018年10月29日 13:52

すべての返信

  • デザイナーの方が勝る場面としては、できあがりの見た目を確認できるという点と、ローカライズ(英語版・日本語版・中国語版など)を作る際もデザイナーが備える仕組みを利用できる点です。
    コードで生成する場合、実行するまでわかりませんし、言語ごとの文言変更やレイアウト調整もコードで書く必要があります。

    なお、そもそもの話をすると、150 個のコントロールを駆使して1つのカレンダーを作るという状況が厳しいと考えています。
    コントロールは多くなれば多くなるほど表示時に白い背景が目立つみたいな、もっさり感が否めません。
    このため、大量のコントロールを持ったフォームはできるだけ回避したくなります。
    カレンダーであれば、最小限のコントロールと、実行時の描画(Paint イベントなど)で補うことも作戦として考えたいところです。

    2018年10月29日 21:15
    モデレータ
  • デザイナでオブジェクトを貼り付けても、コードでイベントハンドラを設定できますが?
    何を聞きたいのだろう?

    Jitta@わんくま同盟

    2018年10月30日 0:47
  • ご存知かもしれませんが、デザイナーで作成した場合も、実際はコードが自動的に生成されています。(例えばForm1.Designer.csというようなファイル)

    そのコードと独自に書かれたコードを比較すれば、快適さやメモリーの観点で検証できるかと思います。

    2018年10月30日 1:03
  • Windows Forms アプリの話ですか? フォームという呼び方は ASP.NET Web Forms アプリにもありますけど。そういう基本的な情報は最初にきちんと書きませんか?

    たぶん、Windows Forms アプリの話であろうと想像して・・・

    > フォームに自作のカレンダーを載せているのですが、ラベルの数が150以上になっています。

    ここに書いてあること以外は知り得ない第三者には、質問者さんの自作コントロールの情報としては「カレンダー」と「ラベルの数が150以上」ぐらいしか分かりません。。

    なので、質問者さんが、

    > コードで発生させた方が数が多い場合はメリットの方が大きいと考えるようになりました。

    と判断されたのなら、それで良いんじゃないですか・・・というような話になってしまうのですが。

    質問者さんの作った自作コントロールについて、それ以上の詳しい話をお望みなら、Label 150 ではなく 1 つか 2 つぐらいに絞った簡単なサンプルを作って、そのコードをアップしてもらって、それをベースに話をした方がよさそうです。

    • 編集済み SurferOnWww 2018年10月30日 1:27 訂正
    2018年10月30日 1:24
  • モデレータさん、ご返信ありがとうございます。

    最初は、カレンダーコントロールをフォームに貼り付けていろいろとやっていたのですが、既存のカレンダーコントロールでは意図することが実現できない考えるようになり、カレンダーを自作することにしようというところから始まりました。

    使っているPCが比較的性能の良いものであれば、再描画をほとんど意識することはないのですが、数年前のノートパソコンで駆動させると、ラベルが白抜けして下方から流れるように再描画されているところがまざまざと分かるので、もっさり感がたっぷりです。Paintを使うことは考えたこともなかったので、勉強してみます。ありがとうございました。

    2018年10月30日 14:24
  • Paintでの描写の場合、マウスのキャプチャー、カレンダーが他の画面で隠れた(画面からはみ出した)後の再描写などに注意して下さい。また、日付はクリックイベントが座標判断になるようにすれば良いと思います。見栄えをよくするにはそれなりに大変だとは思いますが、工夫次第で良いものができると思います。

    他の選択枝としてWPFで作るという手もあります。WindowsフォームアプリケーションからWPFの画面を簡単に呼ぶことができます。つまり、1つのアプリケーション内で両者は共存できます。お使いのハードウェアでどの程度のパフォーマンスになるかわかりませんが、以下を一度試してみられるとパフォーマンスがわかると思います。

    (参考)
    【WPF】自作カレンダー その2(動的生成)
    https://www.doraxdora.com/blog/2017/10/16/post-2779/


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年10月31日 0:52
    モデレータ