powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание представлений в SDI документе
14 сообщений из 14, страница 1 из 1
Создание представлений в SDI документе
    #34524803
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз здрачтвуйте :rolleyes:

Создаю в классе CProjDoc переменные класса CMultiDocTemplate:
Код: plaintext
CMultiDocTemplate *m_pZakazViewTemplate;
Тамже добавляю функцию:
Код: plaintext
void CreateOrActivateFrame(CDocTemplate *pTemplate, CRuntimeClass *pViewClass);
Объявляю заголовочные файлы в ProjDoc.h:
Код: plaintext
1.
#include "ZakazView.h"
#include "MainFrm.h"

В конструкторе добавляю шаблон:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CProjDoc::CProjDoc()
{
	// TODO: add one-time construction code here
	CWinApp *pApp = AfxGetApp();
	ASSERT(pApp);
	
	if(pApp){

		m_pZakazViewTemplate = 
			new CMultiDocTemplate(
			IDR_MAINFRAME,
			RUNTIME_CLASS(CProjDoc),
			RUNTIME_CLASS(CMainFrame),
			RUNTIME_CLASS(CFormView));
		pApp->AddDocTemplate(m_pZakazViewTemplate);
	}
}
Вот функция активизирующая или активизирующая представление:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void CProjDoc::CreateOrActivateFrame(CDocTemplate *pTemplate, 
										  CRuntimeClass *pViewClass)
{
	CView *pView;
	POSITION pos = GetFirstViewPosition();
	while(pos != NULL){
		pView=GetNextView(pos);
		if(pView->IsKindOf(pViewClass)){
			pView->GetParentFrame()->ActivateFrame(SW_RESTORE);
			return;
		}
	}
	CFrameWnd *pFrame = pTemplate->CreateNewFrame(this, NULL);
	pTemplate->InitialUpdateFrame(pFrame, this);
}

Вызываю функцию обработкой на нажатие меню:
void CProjDoc::OnMZakazView()
Код: plaintext
1.
2.
3.
4.
{
	// TODO: Add your command handler code here
	CreateOrActivateFrame(m_pZakazViewTemplate, 
		RUNTIME_CLASS(CZakazView));
}

Создаю диалог, в свойствах ставлю стиль Child, border - none, при нажатии на соответствующий пункт меню получаю критическую ошибку:
---------------------------
Безымянный - RozOffice: RozOffice.exe - Ошибка приложения
---------------------------
Инструкция по адресу "0x5f46445d" обратилась к памяти по адресу "0x0000009c". Память не может быть "read".


"ОК" -- завершение приложения
"Отмена" -- отладка приложения
---------------------------
ОК Отмена
---------------------------

Где я мог ошибиться?

Если добавляю диалог при помощи мастера new form, то все работает, но появляется крайне не желательный побочный ефффект: при запуске программы дает возможность выбрать какую форму запустить. А на нажатие меню реагирует с ошибкой.
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34524811
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniy пишет:
> Создаю в классе CProjDoc переменные класса CMultiDocTemplate:
>
> CMultiDocTemplate *m_pZakazViewTemplate;

В приложении он должен быть, в приложении. Если его поместить в
документ, то как DocTemplate сможет его создать ?
Ответ - никак. DocTemplate должен быть в приложении.
Обычно он там мембером, хотя это не обязательно, главное
его создать в InitInstance и зарегистрировать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34525269
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniy пишет:
> CProjDoc::CProjDoc()
> {
> // TODO: add one-time construction code here
> CWinApp *pApp = AfxGetApp();
> ASSERT(pApp);

Приложение в документе ? Это орригинально !
Как документ-то будешь создавать ?

> Где я мог ошибиться?

Надо не выдумывать свою структуру приложения, а следовать стандартной,
если не очень пока ориентируешся в MFC.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34525395
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, делал по книжке, товарищь вживую показывал - все работало. Седня попытаюсь узнать у него где что и как, потом напишу.
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34526032
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniy пишет:

> Ну, делал по книжке, товарищь вживую показывал - все работало. Седня
> попытаюсь узнать у него где что и как, потом напишу.

Это в какой такой книжке тебе так сказали делать ?
Ф печку ее ! Тачнее ф топку !

Возми scrible sample и сделай как там сделано.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34528140
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Это в какой такой книжке тебе так сказали делать ?
> Ф печку ее ! Тачнее ф топку !
Visual C++ .net

Получилось, все правильео в коде, просто когда создавался диалог, нужно сначала определить для него все свойства, а потом уже создавать класс. Метод очень неудачный и неудобный.

> Возми scrible sample и сделай как там сделано.

Можно поподробней на этом моменте... )) Что это такое и где его взять?
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34529379
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniy пишет:
> Visual C++ .net
>
> Получилось, все правильео в коде, просто когда создавался диалог, нужно
> сначала определить для него все свойства, а потом уже создавать класс.
> Метод очень неудачный и неудобный.

Еще раз.
У тебя было все В КОНРНЕ неправильно.

> Можно поподробней на этом моменте... )) Что это такое и где его взять?

Это - стандартный тюториал по работе с DOC/View структурой.
Он есть в поставке VC, наверное его также можно найти на сайте MS.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34530224
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз большое спасибо :).

И еще 1 вопрос:

Подскажите плз, нужно вывести результат запроса (SELECT......) в грид. Грид лежит на форме созданой на базе класса CDialog.
Отсюда:
1. Где, в какой функции, лучше всего задавать параметры грида (устанавливать столбцы, строки, указывадь что где будет храниться)?
2. Каким образом открыть не всю таблицу, а только избраные SELECT'ом

Спасибо.
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34530357
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniy пишет:

> 1. Где, в какой функции, лучше всего задавать параметры грида
> (устанавливать столбцы, строки, указывадь что где будет храниться)?

OnInitDialog

> 2. Каким образом открыть не всю таблицу, а только избраные SELECT'ом

Написать вместо SELECT * FROM XXX другой запрос.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34530596
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Написать вместо SELECT * FROM XXX другой запрос.

Это я понимаю, а вот как это делается на практике. Я использую MSFlexGrid? вот код в OnInitDialog():

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
	CRect rect;
	CString strm_id = "id";
	CString strm_sum = "sum";
	CString strm_overball = "overball";
	CString strm_data = "data";

	int iRowCount =  1 ;

	GetClientRect(rect);
	m_ZakazGrid.MoveWindow(rect,TRUE);
	m_ZakazGrid.RedrawWindow(
		NULL, 
		NULL,
		RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

	m_ZakazGrid.SetCols( 4 );
//	m_ZakazGrid.SetRows(m_pSet->GetRecordCount() + 1);

	m_ZakazGrid.SetColWidth(- 1 ,  1440 );
	
	m_ZakazGrid.SetRow( 0 );
	m_ZakazGrid.SetCol( 0 );
	m_ZakazGrid.SetText("¹ çàêàçà");
	m_ZakazGrid.SetCol( 1 );
	m_ZakazGrid.SetText("Ñóììà");
	m_ZakazGrid.SetCol( 2 );
	m_ZakazGrid.SetText("Áàëëû");
	m_ZakazGrid.SetCol( 3 );
	m_ZakazGrid.SetText("Äàòà çàêàçà");

//	m_pSet->MoveFirst();

	while(!m_pSet->IsEOF()){
		m_ZakazGrid.SetRow(iRowCount);

//		m_ZakazGrid.SetCol(0);
//		m_ZakazGrid.SetText(m_pSet->m_id);

//		m_ZakazGrid.SetCol(1);
//		m_ZakazGrid.SetText(m_pSet->m_sum);

//		m_ZakazGrid.SetCol(2);
//		m_ZakazGrid.SetCol(m_pSet->m_overball);

//		m_ZakazGrid.SetCol(3);
//		m_ZakazGrid.SetText(m_pSet->m_data);

		if(m_pSet->IsEOF()){
			m_pSet->MoveNext();
			iRowCount++;
		}
	}
	m_pSet->MoveFirst();

	m_ZakazGrid.SetRow( 1 );
	m_ZakazGrid.SetCol( 1 );

Когда нажимаю на кнопку открытия диалога получаю критическую ошибку:
---------------------------
Безымянный - RozOffice: RozOffice.exe - Ошибка приложения
---------------------------
Инструкция по адресу "0x5f703ebf" обратилась к памяти по адресу "0x00000004". Память не может быть "read".


"ОК" -- завершение приложения
"Отмена" -- отладка приложения
---------------------------
ОК Отмена
---------------------------

Причем ошибка получается из-за строки:

Код: plaintext
m_pSet->MoveFirst();

переменную передавал таким образом:
в классвизарде на вкладке classinfo в графе foreign class выбрал класс CZakazSet и в поле variable вписал переменную m_pSet. В конструктор формы добавлил такой код, в итоге конструктор формы выглядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CZakazForm::CZakazForm(CWnd* pParent /*=NULL*/)
	: CDialog(CZakazForm::IDD, pParent)
{
	m_pSet = new CZakazSet(NULL);
	m_pSet->Open();
	//{{AFX_DATA_INIT(CZakazForm)
	m_pSet = NULL;
	//}}AFX_DATA_INIT
}

Подскажите, я подозреваю что это из-за того что как-то неправильно передал переменную m_pSet, что делать?
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34530658
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот переписал функцию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
CRecordset* CZakazForm::OnGetRecordset()
{
	return m_pSet;
}

BOOL CZakazForm::OnInitDialog() 
{
	
	m_pSet = new CZakazSet(NULL);
	m_pSet->Open();

	CDialog::OnInitDialog();
//---------------------------------------------------------------------	
//  [5/16/2007]
	CRect rect;
	CString m_id = "id";
	CString m_sum = "sum";
	CString m_overball = "overball";
	CString m_data = "data";

	int iRowCount =  1 ;

	GetClientRect(rect);
	m_ZakazGrid.MoveWindow(rect,TRUE);
	m_ZakazGrid.RedrawWindow(
		NULL, 
		NULL,
		RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

	m_ZakazGrid.SetCols( 4 );
	m_ZakazGrid.SetRows(m_pSet->GetRecordCount() +  1 );

	m_ZakazGrid.SetColWidth(- 1 ,  1440 );
	
	m_ZakazGrid.SetRow( 0 );
	m_ZakazGrid.SetCol( 0 );
	m_ZakazGrid.SetText("¹ çàêàçà");
	m_ZakazGrid.SetCol( 1 );
	m_ZakazGrid.SetText("Ñóììà");
	m_ZakazGrid.SetCol( 2 );
	m_ZakazGrid.SetText("Áàëëû");
	m_ZakazGrid.SetCol( 3 );
	m_ZakazGrid.SetText("Äàòà çàêàçà");

	m_pSet->MoveFirst();

	while(!m_pSet->IsEOF()){
		m_ZakazGrid.SetRow(iRowCount);

//		m_ZakazGrid.SetCol(0);
//		m_ZakazGrid.SetText(m_pSet->m_id);

//		m_ZakazGrid.SetCol(1);
//		m_ZakazGrid.SetText(m_pSet->m_sum);

//		m_ZakazGrid.SetCol(2);
//		m_ZakazGrid.SetCol(m_pSet->m_overball);

//		m_ZakazGrid.SetCol(3);
//		m_ZakazGrid.SetText(m_pSet->m_data);

		if(!m_pSet->IsEOF()){
			m_pSet->MoveNext();
			iRowCount++;
		}
	}
	m_pSet->MoveFirst();

	m_ZakazGrid.SetRow( 1 );
	m_ZakazGrid.SetCol( 1 );
//---------------------------------------------------------------------		
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

При вызове диалога выдает сообщение:
---------------------------
RozOffice
---------------------------
Invalid Row Value
---------------------------
ОК
---------------------------
и открывает сам диалог с гридом, но без записей.
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34530666
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стало ясно что ошибка здесь:
Код: plaintext
m_ZakazGrid.SetRows(m_pSet->GetRecordCount() +  1 );
Если ввожу вручную количество записей - то все ок, но ведь записи будут добавляться...
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34530722
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniy пишет:
> Это я понимаю, а вот как это делается на практике. Я использую
> MSFlexGrid? вот код в OnInitDialog():

> // m_pSet->MoveFirst();

Это должно происходить до получения m_pSet, я так понимаю.

> Подскажите, я подозреваю что это из-за того что как-то неправильно
> передал переменную m_pSet, что делать?

Ты ее неправильно получил, для начала. Не тем запросом.
А если про ошибку защиты памяти - я не знаю как там ты что куда передаешь,
ты уж сам разбирайся, это не сложно.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание представлений в SDI документе
    #34530724
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniy пишет:

> Если ввожу вручную количество записей - то все ок, но ведь записи будут
> добавляться...

Если они будут добавляться, ты будешь перезаписывать весь набор данных в
грид заново, так ведь ? И этот код повторится и установит нужное кол-во строк.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание представлений в SDI документе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]