powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите создать Класс
10 сообщений из 10, страница 1 из 1
Помогите создать Класс
    #32218844
Hunter_eea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как в рантайме создать класс, точнее наследника от класса.
т.е. есть класс CReferenceFrm как от него создать наследника CReferenceFrm1
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32219178
Фотография Chicago
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты что с дуба рухнул? Нельзя в рантайме создать подкласс. Это C++, а не Python. Можно только создать экземпляр класса, наследующего у заданного суперкласса. Но определение подкласса должно быть известно на стадии компиляции. Ты уж определись, что тебе надо, не понял вопроса, если честно.
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32219187
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любой класс дожен быть известен на момент компиляции. Что именно интересует?
Есть несколько способов:
Если myfrm1 наследуется от myfrm без всякого виртуального наследования, и ты получил ссылку или указатель на myfrm, но точно знаешь, что под ним "прячется" myfrm1, то выполни static_cast<>(). Если точно не уверен, что это именно он, или если наследовался виртуально - выполни dynamic_cast<>() и проверь результат, если NULL - это был не myfrm1 (и не его потомок).
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32221604
Hunter_eea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В C...App есть описание окон, у меня ~72 окна получается, и для каждого писать новый класс (описывать фрейм окна), это западло, я определил голальную переменную .... потом

// 1 - 10 Справочники
// * Window #1: Справочник.Организации
CMultiDocTemplate* pRef1DocTemplate = new CMultiDocTemplate(
IDI_BUH,
RUNTIME_CLASS(CTradeDoc),
RUNTIME_CLASS(CReferenceFrame),
RUNTIME_CLASS(CReferencesFrm));
AddDocTemplate(pRef1DocTemplate);
// * Window #2: Справочник.Склады
CMultiDocTemplate* pRef2DocTemplate = new CMultiDocTemplate(
IDI_BUH,
RUNTIME_CLASS(CTradeDoc),
RUNTIME_CLASS(CReferenceFrame),
RUNTIME_CLASS(CReferencesFrm));
AddDocTemplate(pRef2DocTemplate);
// * Window #3: Справочник.Контрагенты
CMultiDocTemplate* pRef3DocTemplate = new CMultiDocTemplate(
IDI_BUH,
RUNTIME_CLASS(CTradeDoc),
RUNTIME_CLASS(CReferenceFrame),
RUNTIME_CLASS(CReferencesFrm));
AddDocTemplate(pRef3DocTemplate);
// * Window #4: Справочник.Валюта
CMultiDocTemplate* pRef4DocTemplate = new CMultiDocTemplate(
IDI_BUH,
RUNTIME_CLASS(CTradeDoc),
RUNTIME_CLASS(CReferenceFrame),
RUNTIME_CLASS(CReferencesFrm));
AddDocTemplate(pRef4DocTemplate);
// * Window #5: Справочник.Список ТМЦ
CMultiDocTemplate* pRef5DocTemplate = new CMultiDocTemplate(
IDI_BUH,
RUNTIME_CLASS(CTradeDoc),
RUNTIME_CLASS(CReferenceFrame),
RUNTIME_CLASS(CReferencesFrm));
AddDocTemplate(pRef5DocTemplate);
// * Window #6: Справочник.Ценообразование
CMultiDocTemplate* pRef6DocTemplate = new CMultiDocTemplate(
IDI_BUH,
RUNTIME_CLASS(CTradeDoc),
RUNTIME_CLASS(CReferenceFrame),
RUNTIME_CLASS(CReferencesFrm));
AddDocTemplate(pRef6DocTemplate);
// * Window #7: Справочник.Пользователи
CMultiDocTemplate* pRef7DocTemplate = new CMultiDocTemplate(
IDI_BUH,
RUNTIME_CLASS(CTradeDoc),
RUNTIME_CLASS(CReferenceFrame),
RUNTIME_CLASS(CReferencesFrm));
AddDocTemplate(pRef7DocTemplate);

Если бы было не CReferencesFrm для каждого окна, а например CReferencesFrmN
где N номер потомка оно бы и не глючило с фреймом, или есть еще какие варианты чтобы фрем не глючил...

P.S. Глюк заключается в том, что у такого рода создания окга с фреймом у неактивного и затем активного окга надпись на фрейме получается одинаковая

ВОПРОС ГАМЛЕТА:КАК ЭТО ИСПРАВИТЬ ИЛИ НЕ БЫТЬ
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32221615
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недопонял ??
Если проблема только в надписи окна при его создании , так переопредели
в CReferenceFrame - OnWindowNew .... мап ( ON_COMMAND(ID_WINDOW_NEW,OnWindowNew))
далее найди нужный темплейт и присвой нужный заголовок при создании ...
или я что то не так понял ?
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32221619
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да добавлю ... создавать разные справочники на основе одного и того же
CTradeDoc - по концепции документ-вид не есть верно,
если они все похожи то можно создпть базовый клас наследуемый от CDocument (CTradeDoc public CDocument), а на основе CTradeDoc создать
создать конкретные справочники (возможно с привязкой к конкретному источнику данных если речь идет о БД) ...
проникнетесь - объект документ должен представлять данные (содержание) документа,
фрейм - отображать рамку документа (в том числе и заголовок) ,
вид - представление документа
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32222643
Hunter_eea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thank you for rendered by You help
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32223020
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут калякаю проект, тоже для работы с данными. Так вот, пришел к выводу, что регистрировать миллион Doc-темплейтов - это как-то муторно. Короче, у меня есть мой базовый класс для всех моих форм, (у нас около 250 форм), весь енжин по работе с данными - в базывом классе. CDocument я не использую. Свои формы я создаю непосредственно в MDI фрейме - это очень легко, и не надо регистрировать 250 Doc-темплейтов. Причем пихаю я туда даже диалоги, т.е. когда хочу - отображаю их модально, а когда хочу - пихаю их в MDI фрейм. И нечего пытаться ссать против ветра, юзая один-в-один предложенный MFC Document-View шаблон, если у тебя десятки и сотни дата-форм.

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int CCommonFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (super::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if((m_wndView==NULL)
		return -1;

	if(!m_wndView->CreateInFrame(this))
		return -1;

	return 0;
}


m_wndView - мой базовый класс формы, обрати внимание на m_wndView->CreateInFrame(this);

Код:
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.
#define req_style (WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_THICKFRAME | WS_HSCROLL | WS_VSCROLL )

bool CWSView::CreateInFrame(CWnd* pParent) 
{
	m_bInFrame=true;
	Create(m_lpszTemplateName, pParent);

	DWORD OldStyle=GetStyle() & req_style;

	ModifyStyle(WS_BORDER|WS_CAPTION|WS_POPUP|WS_THICKFRAME, WS_CHILD);
	SetParent(pParent);
	ShowWindow(SW_SHOW);
	
	pParent->ModifyStyle(req_style & (~OldStyle), req_style & OldStyle);
	if(!(OldStyle & WS_THICKFRAME))
		pParent->ModifyStyleEx(WS_EX_CLIENTEDGE, 0);

	CRect rc, mrc, crc;
	GetWindowRect(rc);					// inside rect
	rc.InflateRect(0,0,2,2);
	pParent->MoveWindow(rc, false);
	pParent->SetIcon(GetIcon(true), true);
	pParent->SetIcon(GetIcon(false), false);

	return TRUE;
}

bool CWSView::Show(CMDIFrameWnd* pMainFrame, UINT uResourceID)
{
	CCommonFrame* pFrame = new CCommonFrame;

	CCreateContext context;
	context.m_pCurrentFrame = pMainFrame;

	HMENU hMenu=Client::_app()->get_DocMenu();					//!!! put global menus!!!
	HACCEL hAccel=SLoadAccelerators(uResourceID);

	pFrame->m_wndView=this;

	if (!pFrame->LoadFrame(uResourceID,
			WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, 
			NULL, &context))
	{
		delete pFrame;
		return false;
	}

	pFrame->SetHandles(hMenu, hAccel);
	String strFullString, strTitle;
	if (strFullString.LoadString(uResourceID))
		AfxExtractSubString(strTitle, strFullString, CDocTemplate::docName);

	GetWindowText(strTitle);
	pFrame->SetTitle(strTitle);
	pFrame->CenterWindow();
	pFrame->InitialUpdateFrame(NULL, TRUE);

	pFrame->SetFocus();
	return true;
}



тут пара чисто "наших" функций, типа SLoadAccelerators и _app()->get_DocMenu(); но, надеюсь, они не помешали восприятию.
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32223023
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, еще:

CWSView - базовый класс для всех форм, CCommonFrame - единственный в проекте фрейм.

Там еще есть несколько мелочей, типа с ресайзингом и передачей фокуса, но это ерунда, хотя интересующимся могу выслать на мыло полный текст.
...
Рейтинг: 0 / 0
Помогите создать Класс
    #32223163
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2vdimas:
А engine по работе с данными в базовом классе - это как ? Можно поподробнее...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите создать Класс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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