Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetFirstDocPosition() 
:(
    Опции темы
maq
Дата 26.3.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



У меня такая простенькая задача. В программе регистрируюся 2  шаблона (D_А и D_В) CMultiDocTemplate одного типа документа D (в программе имеются и другие типы документов, но я их сейчас пропускаю). Дается команда открыть шаблон D_В документа типа D. В таком случае программа должна выполнить следующее:

a) если документ D не открыт – открыть документ D в шаблоне D_В и аквизировать его фрейм.
b) если документ D открыт в шаблоне D_В (независимо от того открыт ли он еще и в шаблоне  D_А ) – аквизировать его фрейм.
c) если документ D открыт, но не в шаблоне D_В – открыть активный документ D в шаблоне D_В и аквизировать его фрейм.

Код

BOOL CTMP006App::InitInstance()
{
//…
    AddDocTemplate(new CMultiDocTemplate(IDR_TMP006TYPE,
        RUNTIME_CLASS(CTMP006Doc),
        RUNTIME_CLASS(CChildFrame),
        RUNTIME_CLASS(CTMP006View)));

    AddDocTemplate(new CMultiDocTemplate(IDR_DETAIL,
        RUNTIME_CLASS(CTMP006Doc),
        RUNTIME_CLASS(CMDIChildWnd),
        RUNTIME_CLASS(CEditView)));
//…
}

Имеется класс RDocTemplate, чтобы определить ID шаблона.
Код

//RDocTemplate.h
#pragma once
#include "afxwin.h"

class RDocTemplate : public CMultiDocTemplate
{
public:
    RDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass);
    UINT GetResourceID(void);
public:
    ~RDocTemplate(void);
};

Код

//RDocTemplate.cpp
#include "StdAfx.h"
#include "RDocTemplate.h"

RDocTemplate::RDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass) :
    CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
{
}
RDocTemplate::~RDocTemplate(void)
{
}
UINT RDocTemplate::GetResourceID(void)
{
    return CMultiDocTemplate::m_nIDResource;
}


Код

// команда открыть документ
void CTMP006App::OnAB()
{

    CDocument* pDocActive = NULL;
    CMDIFrameWnd* pMDIFrame    = (CMDIFrameWnd*) GetMainWnd();
    if(pMDIFrame)
    {
        CMDIChildWnd* pChild = pMDIFrame->MDIGetActive();
        if(pChild)
        {
            pDocActive = pChild->GetActiveDocument();
        }
    }

    BOOL bOpened = FALSE;
    if(pDocActive)
    {
        POSITION posTempl = AfxGetApp()->GetFirstDocTemplatePosition();
        while(posTempl)
        {
            RDocTemplate* pDocTempl = (RDocTemplate*) AfxGetApp()->GetNextDocTemplate(posTempl);
            // ПРОБЛЕМА !!!!!!!
            POSITION posDoc = pDocTempl->GetFirstDocPosition();
            while(posDoc)
            {
                CDocument* pDoc = pDocTempl->GetNextDoc(posDoc);
                if(pDoc == pDocActive && pDocTempl->GetResourceID() == IDR_DETAIL)
                {
                    bOpened = TRUE;
                    break;
                }
            }
        }
    }
    else
    {
        POSITION posTempl = AfxGetApp()->GetFirstDocTemplatePosition();
        while(posTempl)
        {
            RDocTemplate* pDocTempl = (RDocTemplate*) AfxGetApp()->GetNextDocTemplate(posTempl);
            if(pDocTempl->GetResourceID() == IDR_DETAIL)
            {
                pDocTempl->OpenDocumentFile(NULL);
                return;
            }
        }
    }

    if(!bOpened)
    {
        POSITION posTempl = AfxGetApp()->GetFirstDocTemplatePosition();
        while(posTempl)
        {
            RDocTemplate* pDocTempl = (RDocTemplate*) AfxGetApp()->GetNextDocTemplate(posTempl);
            if(pDocTempl->GetResourceID() == IDR_DETAIL)
            {
                CDocument* pDocNew = pDocTempl->OpenDocumentFile(NULL);
                if(pDocActive)
                {
                    POSITION posView = pDocNew->GetFirstViewPosition();
                    while(posView)
                    {
                        CView* pView = pDocNew->GetNextView(posView);
                        pDocNew->RemoveView(pView);
                        pDocActive->AddView(pView);
                    }
                }
                break;
            }
        }
    }
}

Проблема в том, что у второго шаблона (одного и того же документа) GetFirstDocPosition() всегда возвращает 0 (см. Ф-ю CTMP006App::OnAB).
Не могу понять почему? Кто-нибудь подскажет?

PM MAIL   Вверх
Earnest
Дата 27.3.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Не очень разбиралась в коде (слишком много букв), но явно есть какая-то лажа.
1) Во-первых, ты регистрируешь в приложении 2 шаблона, причем оба типа CMultiDocTemplate, хотя и с разными параметрами, а вот RDocTemplate - не регистрируешь, так что его как бы и нет - ну нет его в менеджере! А ты к нему приводишь... Нехорошо
2) Во-вторых, шаблон хранит только документы, открытые с его помощью, а вовсе не все документы своего типа! Т.е. с помощью первого шаблона ты не увидишь документы, открытые во втором.

Лучше сделать так:
1) Регистрировать не MultiDocTemplate, а создать свой тип (или даже 2 типа - для каждого вида шаблона) - тогда можно спокойно использовать приведение, можно писать в шаблоне спец. функции - иногода это удобно
2) Поиск документа нужно организовать так: перебираем все зарегистрированные шаблоны, если это шаблон нужного типа (одного из 2), то ищем в нем наш документ. 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0836 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.