スポンサーサイト

一定期間更新がないため広告を表示しています

- | - | -
タブコントロールは人気がない?
 MFCの話。

タブボタンのついた画面を作成する時に、


MFCではタブコントロールと、プロパティシートの二つが用意されているようです。

タブコントロールと言うのは、画面そのものではなく、
画面に張り付いているタブボタンのみですね。
それに対して、プロパティシートの方は画面そのものです。

見た目上でのタブボタンとの大きな違いは、作成する人が用意する画面の数。


タブコントロールの方は、
・タブコントロールを貼り付ける大元の画面
・タブコントロール
・タブボタンで表示させたい画面
で作成します。(後はお好みでOKボタン等。)


プロパティシートの方は
・タブボタンで表示させたい画面
のみが必要です。(OKボタン等が必要な場合は表示させたい画面全てに必要?)
プロパティシートの方は、
大元の画面や、タブコントロールを自動で生成してくれます。
そのため、表示させたい画面のみで十分なのです。

これだけ見ると、「プロパティシートの方が楽じゃん。」って思います。
実際に動くようにするのに関してもプロパティシートの方が断然楽です。

これだけどちらが便利なのかが歴然で、何故この話をするかと言うと、
プロパティシートには制限事項が多いから。

タブコントロールは基本、大元の画面を作る時に、
タブで表示させたい画面も作ると思います。
それに対して、プロパティシートは、大元の画面を作る時に、
一番最初に表示させる画面以外は作られないのです。
タブコントロールが「作る」に対してプロパティシートが「作られない」と言っているのは
タブコントロールの方は、意図的に作成しなければいけないのですが、
プロパティシートの方は自動で作成を行うためです。
勿論、二つとも互いの動きを真似ることはできますが…。

プロパティシートは、最初に表示させる画面以外は、そのタブボタンが押され
画面が表示される直前で作られます。
そのため、全ての画面から情報を表示しようとする等の処理を行って、
まだ存在していない画面を見ようとすると、プログラムが異常終了します。
そこを上手く抑止するための工夫が必要となるわけです。
(画面が開かれたかどうかのフラグで情報の取得を抑止するとか…ね。)

それに、大元の画面を自動で作成されてしまうため、プロパティシートは
大元の画面が自動で作成されてしまうため、レイアウトは完全に固定となってしまいます。
(タブコントロールとタブボタンによって表示される画面、OK・キャンセル等のボタンだけ。)
また、ボタンについても、「適用」等が自動で用意されてしまうため、
見えないようにする工夫が必要です。

個人的に感じる、プロパティシートの一番の問題は、
画面間の情報のやり取りが困難な事でしょうか。
タブボタンで表示させる画面の中に、他の画面の情報と連動しているものがあるとします。
これから表示させる画面をA、
Aで表示させる情報と連動しているものを持っている画面をBとします。
Bを変更した後Aを表示した場合、どうやってAの情報を反映させればいいのでしょう。

タブコントロールの場合、
タブコントロールを持っているのが大元の画面であるため、タブボタンが押された時に
本来の動作(押されているタブを変更する。)に対して割り込みや抑止を行わせる事ができます。
このタイミングでBの情報を取得する→Aの画面に取得した情報を設定する。
と言う処理ができるのです。

プロパティシートの場合、タブコントロールを持っていません。
そのため、大元の画面がタブコントロールのような動きをすることができないのです。
ぱっと思いついて解決方法が以下の二つ。
・無理やりプロパティシートにタブコントロールを実装する(未確認)
・プロパティシートに対して無理やり取得と設定処理を行わせる。(恐らく可能…。)
省略しますが、1のやり方では限りなくタブコントロールと処理が類似し、
2のやり方はかなり強引(設計上よろしくない)作りになると思います。
(1については、イベントハンドラにプロパティシート(一応持ってる)の持ってるアドレスが参照してるタブコントロールを設定すればいけるんじゃないかなぁ…と思う。)

プロパティシートにはこういった制限があるにもかかわらず、
「タブコントロールは使えない。」「まっとうなVCプログラマはこんなの使わない」「こんなの使うのはにわかMFC屋」とか言われてるのはどうなのだろうか……。
そしてこれらの理由が「タブコントロールは貧弱」とか。
どう見ても、プロパティシートの方が設計上で問題になりそうなのだが……。


ただ、職場ではプロパティシートが好まれる。
その理由は、「タブボタンを押した時の画面のフォーカス(どの項目が選択状態になるか)の遷移がおかしい」からである。(マウスで大元の画面を選択したか、タブボタンによって表示している画面を選択したかによって、大元の画面内でのみ遷移したり、表示している画面内でのみ遷移したりする。)
……成る程納得。
これは悲しい。
開発・設計とかプログラミングとか。 | comments(1) | -
スポンサーサイト
- | - | -
Comments
管理者の承認待ちコメントです。
Posted by - | 2015/04/25 11:55 PM

Post a Comment










Recent Comments
Search this site :