maruさん
> だから、ツリービューのツリーコントロール自身にデータを持たせたいなっ
> て思うんだけど、皆さんはどうしています?
読み方によって、回答が変わってしまいそうですが、
私なら、ツリーコントロール自身にデータを持たせるのは賛成です。
ただし、持たせるのは実体データではなく、参照データのみです。
参照データには、指し示す先の実体が必要なので、その実体データをドキュメン
トで扱う感じです。
(例) 住所録
住所録データの要素が以下のような設計だとして、
class CAdressBook
{
CString m_Country; // 都道府県
CString m_City; // 市区町村
CString m_Name; // 名前
};
ドキュメントには、このオブジェクトスの集まり(目的によって、リスト、配列、
マップを使い分ける)を扱います。
そして、ツリービューには、上記オブジェクトへの参照をもちます。
CTreeCtrl::SetItemData()にて設定
都道府県 市区町村 名前
----------+---------+-----
- 東京都
+ 渋谷区 bun1
+ :
+ 大阪府
+ 堺市 bun2
+ :
- 愛知県
+ 名古屋市 bun3
+ :
私が今までやってきた限りでは、これが一番分かりやすく無駄も少ない方法です。
もっとも、今回の場合、ドキュメントは不要という見方もできます。
通常、ドキュメントで扱うのは、ファイルに保存しない限り、揮発してしまう情
報だと思うからです。ディスク情報なら、揮発することはあり得ないですからね。
utmさん
話がずれていって申し訳ありません。
> だから、ツリービューのツリーコントロール自身にデータを持たせたいなっ
> て思うんだけど、皆さんはどうしています?
自分で書いた内容だけど、実は自分でもツリーコントロール自身にデータを持
たせていません。
ドキュメントのツリー構造となる部分はコンポジットモデルで実現して、ツリ
ービューに表示するときに、その構造をたどってツリーコントロールに追加し
てます。さらにドキュメントのツリーのリーフとなるデータ(オブジェクト)
のポインタをツリーコントロールのアイテムにセット(これはbunさんと似た感
じ?)。
ただ、やはりデータ構造がダブっているような気がして、なんか気持ちが悪か
ったんですよ。
> ツリービューでの表示は表現方法の一つと割り切って
> データ管理とは別にしてますね。
と割り切ることですね。
で、utmさんの元に質問に対する私の回答。
(他の人と一緒ですけど)CDocument::UpdateAllViewsを使用すべきでしょう。
私の場合、クリックしたときの動作として、上に書いたツリーアイテムにセッ
トしたポインタをヒントデータとしてUpdateAllViewsを呼び出しています。
PATIOさん
> がーん、ホントだ。
> 全然気がついて無かったです。
情報の後出で済みません。
> もっとも、今回の場合、ドキュメントは不要という見方もできます。
> 通常、ドキュメントで扱うのは、ファイルに保存しない限り、揮発してしまう情
> 報だと思うからです。ディスク情報なら、揮発することはあり得ないですからね。
これも一理あるんですが、CDocument::UpdateAllViewsを使ってコントロールする
と言う方法をとるならドキュメントクラスにデータ管理をさせた方がすっきりすると
思うのです。あれこれ考えずにドキュメントクラスに表示に必要な情報を要求する
と言う考え方です。
ドキュメントクラスの内部実装はどうにでも出来ますから
それこそ要求される度にディスクから取得しても実装はできると思います。
実際の話、ディスク上の状況が変わってしまった時にどう対応するかという
部分も絡む話なのでそれは設計次第かなと。
例えば、ユーザーに「最新の情報を表示」というコマンド明示的に与えて
それまでは最初に取得した情報をメモリ上に保持しておいて返却すると言うのも
有りかと思いますし。
この辺はそれこそ実装次第かなと。
皆さん、色々なご意見ありがとうございます。
管理と表示を別々ならば、皆さんがご教示して下さった
「CDocument::UpdateAllViews」を使用する理由は判りました。
今回はViewのみでは無く、Document/Viewの本来の姿で進めて
行こうかと思います。
また質問も出て来るやも知れませんので、その時も宜しくお願いします。