ECCSkelton(注)も完成し、CREDITクラスの動作確認までにRichTextを扱うサンプルとしてRTWEditorを作ることとし、「MDIは、もー旧いんじゃね?今はタブベースじゃね?」等と軽薄なことを言っていた罰が当たりました。
注:20年前のBCC5.5.1用のSJISベースのBCCSkeltonライブラリーを、Windowsがnativeにしているユニコード(といってもUTF-16)専用にした、現在のBCC102(Embarcadero C++ Compiler)用の互換ライブラリー
自分で書いたCTABクラスがわかんねぇ!
てか(というか...なれない若者言葉は止めます...)、「タブコントロールってどういうものだったっけ?」というところが、20年前のコードだし、どういう位置づけ(子ウィンドウであるコントロールで、更にタブシート毎の孫ウィンドウを貼っ付けてあるんだっけ???等々)だったかも忘れていた(注)ので、今日ほぼ一日かけて復習しました。
注:CTABをそのまま使ったアプリは一度も書いたことが無く、CVSPLIT(とCHSPLIT)クラスで4つのスプリットウィンドウにタブをあてがった時に使っただけで、アプリとしてはSplitterTestしかありません。
最初は「タブというものは、メインとなる親ウィンドウのコントロールとなる子ウィンドウを多数寄せ集めて、切り替えて表示するもの」という想定でCTABのコードを見たり、SplitterTestのコードを見たりしたのですが、どうもそういうことではないようです。CTABクラスのコードを見直すと、最大64枚のタブ迄設定でき、それに応じた整数の配列があるのですが、それが「タブコントロールの子ウィンドウのコントロールID」であると誤解して「分かんねー、分かんねーな」を繰り返していました。(実際その想定でタブシートの一つにリッチエディットコントロールを貼ろうとして、エラーばかり出していました。)
で、悩みぬいて
「あっ、そいこと!?!」
と、気が付いたのは、
親ウィンドウ---タブウィンドウ(タブインデックスだけ表示し、場所貸しを生業とする手配師)
|
|--------第1タブウィンドウで表示されるコントロール(親はタブではない)(非表示)
|
|--------第2タブウィンドウで表示されるコントロール(親はタブではない)(カレントタブ→表示)
・
・
・
|--------最終タブウィンドウで表示されるコントロール(親はタブではない)(非表示)
という関係でした。(注)
注:昭和の上野公園にお花見に行くと、ヤクザが良い場所を占有して、来客からお金を取って「はい、ここで1時間楽しんで!」で、1時間立つと「オラオラ、次のお客さんが待っているんだから早くどけよ!」と「場所の管理」を業務にしていたことを思い出します。
要すれば、
(1)タブコントロールは「今どのタブページを表示しているのかを示すインデックスを表示」し、「その表示場所のサイズを与える」ことができるだけで、
(2)後はユーザーがその表示場所をどう使うかはユーザー次第なのですが、CTABでは「各タブページに一つの親のコントロール(親の子ウィンドウで、CTABとは兄弟)を表示画面に張る」こととを設計仕様にしています。(注)
(3)後はタブページの新規追加と任意削除というページ管理ができればそれでよいわけです。
注:今回のRTWEditorの場合、リッチエディットコントロールを各タブページへ張り付ければよいのですが、いくつかのコントロールを持つページにしたいなら、リソースのダイアログを張り付けることも可能です。
と、いうことでやっと昔の自分の考えが分かり、「はぁー、俺は賢かったんだなぁー」という感慨を持った老人の一日でした。
ps. このような、しょーもない話なのでPeogram関連とせず、ブログとしてアップしています。しっかし、ボケてきたなぁー。