CViewから派生クラスを動的配列で保持

[戻る]
shogo 2004/07/23(金) 14:59:30
初めまして,shogoと申します.

WinXP,VC7,MFCを使用して開発をしています.

CViewから派生したクラスを動的配列で保持したいと思っています.
現在は,
CRuntimeClass *pViewClass = RUNTIME_CLASS(CXXXView);
//CXXXViewはCViewから派生したクラス
CXXXView* test = (CXXXView*)pViewClass->CreateObject();
CCreateContext context;
context.m_pCurrentDoc = GetDocument();
test->Create(NULL, NULL, WS_CHILD | WS_VISIBLE, CRect(0,0,100,100), this, 
5000, &context);
XXXView.Add(test); //CObArray XXXView;(ヘッダに記述)
と,CObArrayでCViewから派生したクラスを保持しています.

質問としては,CViewから派生したクラスを動的配列で,
本当にこのように保持していいのか?
何か他に,正しい保持方法があるのか?
という2つです.

よろしくお願いいたします.

Ban 2004/07/23(金) 15:50:10
普通、 CMultiDocTemplate で管理するのでは?
Wizard のスケルトンからして、こういうコードを吐きますし。

というか、CDocument と関連しない CView だけ
複数作っても意味がないと思いますが、どのような用途ですか?
単にCWnd なら何でもよいということですか?

Ban 2004/07/23(金) 15:57:03
失礼、GetDocument は直接されてますね。

shogo 2004/07/23(金) 15:58:10
CDocumentとは,特に関連している必要はないものを作っています.
(CDocumentは,なくても問題なし,と自分では思っている)

用途としましては,何かイベントが起こったら,Viewを切り替えるということで,
例えば,メニュー1を選んだら,View1が表示され,
メニュー2を選んだら,View2に切り替わる,といったことです.

よろしくお願いします.

Ban 2004/07/23(金) 16:18:05
CView だと、やっぱり CMultiDocTemplate の方が
普通なんじゃないでしょうか。
イメージからすると、常に最大化した子窓を持つMDI で、
イベントがきたらアクティブな子のフォーカスを移動、
でもいい気がしますし。

# 多分、コレクションに入れても動くとは思いますけど。

shogo 2004/07/23(金) 16:36:42
shogoです.

> CView だと、やっぱり CMultiDocTemplate の方が普通なんじゃないでしょうか。
ご意見,ありがとうございます.
SDIより,MDIの方がよいと理解して,よろしいでしょうか?
(しかしながら,個人的にSDIで作りたいという思いがあります….)

Ban 2004/07/23(金) 17:00:59
私が MFC を使ってそういう動作を実現するなら多分、
最大表示に子窓を固定した MDI にします。

"View を切り替えて動作する"以上は MultiView で、
MDI は MultiView-MultiDocument Interface で
あるという認識があるからです。
# SDI は、SingleView-SingleDocument の場合に
# 特化して簡略化したものだと思ってます。

これ自体は多分捉え蚊方の問題なので、
CView であることが前提でなく単に CWnd でも構わないという
shogo さんの認識であれば SDI でもいいと思いますが、
CView を使おうと思われている時点で、潜在的に MDI の方が
"美しい" 構成なのかな、とは感じました。

私の想像する限り、CView の設計者が想定している複数管理の
方法は CMultiDocTemplate だと思いますので、
「何か他に,正しい保持方法があるのか?」と聞かれたら、
それが唯一正しいのかは別にして、一般的には
CMultiDocTemplate ではないかと思います。

たいちう 2004/07/23(金) 17:11:42
> SDIより,MDIの方がよいと理解して,よろしいでしょうか?

> # SDI は、SingleView-SingleDocument の場合に
> # 特化して簡略化したものだと思ってます。

私は複数のドキュメントがないならSDIが良いと思います。
CFrameWnd::SetActiveView というのも使えるわけだし。

# 好みの問題なのかも。それと私にMDIの経験が少ないせいかも。

それよりCViewを動的配列でっていうのが気になります。
1組のデータ(ドキュメント)に対して、
表形式で表示、グラフで表示、と切り替えたい様な場合に、
複数のビューを作るのが普通の使い方だと思います。

動的配列ということですが、それぞれのビューは互いにどれだけ
違うのでしょうか。ドキュメントが空っぽなのは構いませんが、
1つのビューで全てを(もちろん同時にではなく)表示すること
は不可能なのでしょうか?

Ban 2004/07/23(金) 17:34:49
> # 好みの問題なのかも。それと私にMDIの経験が少ないせいかも。

shogo さんの正確な構成や要件が分からない以上は、
当然お互い好みの影響をかなり受けていると思います。
# ちなみに私は MDI の方が多いクチですし。


> # 1つのビューで全てを(もちろん同時にではなく)表示すること
> # は不可能なのでしょうか?

少なくとも一つのビュー内を差し替えると面倒な程には違うと
想定してましたけど。
前提としてこれが簡単なら悩むことも無く素直な SDI だと私も思いますし。

shogo 2004/07/23(金) 17:39:52
shogoです.

Banさん,お返事ありがとうございます.
> 一般的にはCMultiDocTemplate ではないかと思います。
そうですか.
MDIは,今まで全く触ったことがなかったので避けようと思っていました.
しかし,こちらのほうが一般的のようですね.
少し,勉強して,使用することも考慮していこうと思います.

たいちうさん,お返事ありがとうございます.
> それぞれのビューは互いにどれだけ違うのでしょうか。
> ドキュメントが空っぽなのは構いませんが、1つのビューで全てを(もちろん同時に
ではなく)表示することは不可能なのでしょうか?
実際のところ,ビューの構成は,ほとんど同じです.
1つのビューで全てを表示というのが,ちょっと曖昧でわかりにくいですが,
現段階では,やってやれないことはありません.
(今後,機能追加をすると,おそらく不可能になると思います.)
完成のイメージを簡略化して説明すると,画像のサムネイルが並んでいて,
それをクリックしたら,その画像を大きいものが表示,といった感じです.

配列で保持しておくと,後々の処理が楽になるという見通しがあるため,
配列(ビューの個数が可変なので動的配列がよい)に,
持っておきたいと思っています.
(ドキュメントは,基本的に使いません.今後,もしかしたら使うかも.)

Ban 2004/07/23(金) 17:53:59
画面いっぱいのサムネイル表示が完全に消えて、
画面いっぱいの拡大画像と切り替わって表示、
ということでしょうか。

それならサムネイル用と拡大表示用にビューは(固定で)
2枚あれば十分な気がしますが。
中のデータだけキャッシングするなり、コレクションに
入れるなりしてあればよいのでは?
そして、このコレクションに格納されたデータの管理を
Document が統括して行う、という方が MVC 等の
考慮して綺麗な設計になる気が個人的にはしますが
どうでしょう。

Ban 2004/07/23(金) 17:55:05
あ、この場合には無理に MDI にすることもないと
思います。

shogo 2004/07/23(金) 17:59:37
shogoです.

多少,説明不足でした.
> 画面いっぱいのサムネイル表示が完全に消えて、
> 画面いっぱいの拡大画像と切り替わって表示、
ではなく,IE風に左右に分割されたViewがあり,
(左がサムネイル,右が画像表示ビュー)
サムネイルをクリックすると,ビューが変わる,というものです.
(画像ソースの数が可変.右ビューは厳密には画像のみではないです.)

すいません,よろしくお願いいたします.

Ban 2004/07/23(金) 18:11:16
なるほど。
だとすると、私ならやっぱりビューの数は固定ですね。
例えば右画面に拡大ビューとプロパティビューが選べるなら、
それをそれぞれ一つ作っておくだけです。

「ビューの数=提供する表示や操作のインターフェイスの数」
だと思いますから。

実際にサムネイルから選択するのはただのデータですし、
データの数だけ View を作ったりはしないと思います。
View の中で必要なデータを GetDocument 経由で取得して
表示してあげれば良いのではないでしょうか。

shogo 2004/07/23(金) 18:18:35
shogoです.

Banさん,レスありがとうございます.

> 必要なデータを GetDocument 経由で取得して表示
やはり,そうですか.
現状は,これでいくことにします.

最初に質問したことですが,
「CObArrayでCViewから派生したクラスを保持」
これは,やってもいいことなのか,やってはだめなことなのか,どちらでしょうか?
(エラーは出てないから,いいと思ってはいますが….)

よろしくお願いいたします.

Ban 2004/07/23(金) 18:20:57
「(やってもいいけど)普通はやらない方がいい」だと私は思います。

shogo 2004/07/23(金) 19:31:05
[[解決]]
shogoです.

> 「(やってもいいけど)普通はやらない方がいい」だと私は思います。
おそらく,そうですね.

結論としましては,
CObArrayでCViewから派生したクラスを保持はできる.
しかしながら,あまり得策ではなく,
うまく表示を切り替える方法を考えたほうがよい.
ということです.

Banさん,たいちうさん,ありがとうございました.

古いスレッドには追加発言できません。