VC+Oracle,我采用的是MDI + CRecordView,我是想通过菜单来选择不同的模块进行操作。比如选"基本资料“-->"个人信息"即出来一个输入个人基本信息的画面,这时可以选择用Dialog或者View(我是想用CRecordView,当然它也是继承CFormView而来的)请问各位大侠是否合理?另外相应的CRecordView共用一份CDocument好还是各自用的好?因为还必须考虑采用是多CRecordSet还是单CRecordSet谢谢!

解决方案 »

  1.   

    CDocument用一份吧,不是说doc-view模式吗?
      

  2.   

    如果我采用一个功能相对独立的模块用一个CFormView做UI合适吗?还可能要在面里用到CTableCtrl控件。
      

  3.   

    我要的实现应该应是MDI+Multi View吧?因为是初学,所以概念不清,自己都不知要问什么问题,见笑了。另外不知为何我用ClassWizard做出一个Form的继承类后,便自动在CMyWinApp::InitInstance()中自动添加了一类似这样的新的DocTemplate项: CMultiDocTemplate* pNewDocTemplate = new CMultiDocTemplate(
    IDR_HRBASEINFOVIEW_TMPL,
    RUNTIME_CLASS(CCLSMISDoc), // document class
    RUNTIME_CLASS(CMDIChildWnd), // frame class
    RUNTIME_CLASS(CHrBaseInfoView)); // view class
    AddDocTemplate(pNewDocTemplate);并在程序运行时要我选择View,如果我要在点击相应的菜单时才出来相应的View怎么办呢?
      

  4.   

    如果我把后来加的那些View类全删除,并在InitInstance()中相应的DocTemplate删除,编译通过,运行时则会提示“试图执行系统不支持的操作”,How?
      

  5.   

    我不知这样是动态创建View呢还是ChildFrame?请高人指点!
      

  6.   

    我也遇到这问题……痛苦中。
    在MIS软件中,一般都是直接对数据库进行操作,我觉得没必要用D/V结构,所以代码直接在FormView中处理就是了,所以我一赶想用没有D/V的MDI来解决我的问题,然而,在AppWizard中如果不选择D/V支持,则它创建的View只能是继承至CView,而不能选择CFormView。 我在框架创建之后,自己加上CFormView,然后想自己创建ChildWnd以及FormView,却总是出现运行时错误。
    另一个问题是,在MIS系统中,一般每种功能其对应的窗口只能打开一个,比如“出库单”模块,点一下菜单之后,如果这个窗口已经存在就只是让它显示,没有存在才创建并显示它,可是如果采用D/V结构,都不知道怎样控制每种View只建立一次,AddTemplate之后,OnFileNew就弹个选择文档类型的窗口出来,郁闷啊…… 哎……搞了好久了,找不到方向,不知道有哪位高手不吝赐教呢???
      

  7.   

    我用ClassWizard加上默认的MFC选项而不是Form选项从CFormView继承生成一个“个人基本信息”的Form如下:
    class CHrBaseInfoRD : public CFormView
    {
    public:
    CHrBaseInfoRD();           // protected constructor used by dynamic creation
    DECLARE_DYNCREATE(CHrBaseInfoRD)// Form Data
    public:
    //{{AFX_DATA(CHrBaseInfoRD)
    enum { IDD = IDD_HRBASEINFOVIEW_FORM };
    // NOTE: the ClassWizard will add data members here
    //}}AFX_DATA// Attributes
    public:// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CHrBaseInfoRD)
    public:
    virtual void OnInitialUpdate();
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected:
    virtual ~CHrBaseInfoRD();
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endif // Generated message map functions
    //{{AFX_MSG(CHrBaseInfoRD)
    // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };
    然后再让Main Frame响应相应的菜单选项,显示此Form:void CMainFrame::OnBaseinfoPerson() 
    {

    // TODO: Add your command handler code here
        CChildFrame* pChildFrame = new CChildFrame;
    // CDocument* pDocument = GetActiveView() ->GetDocument();
    CDocument* pDocument = this ->GetActiveDocument();
                           //上面两句结果是否不同?为何使用前一句会有运行异常?
    CRuntimeClass* pCHrBaseInfoRD = RUNTIME_CLASS( CHrBaseInfoRD );
    CCreateContext* pCreateContext = new CCreateContext;
    pCreateContext ->m_pCurrentDoc = pDocument;
    pCreateContext ->m_pCurrentFrame = this;
    pCreateContext ->m_pNewViewClass = pCHrBaseInfoRD;
    ASSERT( pChildFrame->Create( NULL,   // standard CMDIChildWnd class
                        _T("My MDIChildWnd"), // caption of MDI child window
                                 WS_CHILD  | WS_OVERLAPPEDWINDOW,  // window styles
                                 rectDefault,   // default rectangle size
                                 NULL,  // parent window; can be NULL
      pCreateContext)
       );     

    pChildFrame->ShowWindow(SW_SHOWMAXIMIZED | WS_VISIBLE);
    }
    但不知为何可以生成CHrBaseInfoRD对象,但其窗口显示不出来?而且我不知这种设计思路是否正确?还请大侠指点,谢谢!
      

  8.   

    也许你再加上一句:
    pChildFrame->UpdateWindow();
    试试?
      

  9.   

    pChildFrame ->ActivateFrame();
      

  10.   

    就差了这一句。而多View的话则要SetActivateView().