Taurus727
|
|
« Ответ #30 : 04-06-2007 17:34 » |
|
куски кода... вот такие. это MainWnd.cpp #include "MainWnd.h" #include "MyApp.h" #include "Dlg1.h" CMainWnd::CMainWnd(void) { Create (NULL,"Application",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL); }
CMainWnd::~CMainWnd(void) {
}
BEGIN_MESSAGE_MAP(CMainWnd,CFrameWnd) ON_WM_CREATE() ON_WM_PAINT() ON_COMMAND(ID_FILE_EXIT,MenuExit) ON_COMMAND(ID_VIEW_VIEWSETTINGS1,ShowSettings1) ON_COMMAND(ID_FILE_COUNT,DialogCount) END_MESSAGE_MAP()
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; m_wndMenu.LoadMenu(IDR_MENU1); SetMenu(&m_wndMenu); settings1.check_1=0; settings1.check_2=0; settings1.edit_field1="edit1"; settings1.edit_field2="edit2"; settings1.check1txt="0"; settings1.check2txt="0"; return 0; } void CMainWnd::MenuExit() { DestroyWindow(); } void CMainWnd::OnPaint() { CPaintDC dc(this); dc.TextOutA(0,0,"Hello"); return; }
void CMainWnd::ShowSettings1() { Invalidate(1); CPaintDC dc(this); settings1.check1txt.Format("%d",settings1.check_1); settings1.check2txt.Format("%d",settings1.check_2); dc.TextOut(0,0,"Edit field_1:"+settings1.edit_field1); dc.TextOut(0,16,"Edit field_2:"+settings1.edit_field2); dc.TextOut(0,32,"Checkbox_1:"+settings1.check1txt); dc.TextOut(0,48,"Checkbox_2:"+settings1.check2txt); return; }
void CMainWnd::DialogCount() { CDlg1 dlg; dlg.DoModal(); return; } это Dlg1.cpp #include "Dlg1.h" #include "resource.h" #include "MainWnd.h" CDlg1::CDlg1(CWnd* pParent):CDialog(IDD_DIALOG1, pParent) {}
CDlg1::~CDlg1(void) { }
Это MyApp.cpp #include "MyApp.h" #include "MainWnd.h"
CMyApp::CMyApp(void) { }
CMyApp::~CMyApp(void) { } BOOL CMyApp::InitInstance() { m_pMainWnd=new CMainWnd(); ASSERT(m_pMainWnd); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } CMyApp theApp;
Смысл тот, что пытаюсь я передать указатель на объект settings1 структуры settings в диалог модальный чтобы в этом самом диалоге эти данные изменить. Выше напечатанный код попыток моих не отражает. это рабочиая, тык скыть сборка только без передачи параметров диалогу. в диалоге уже, получив данные хочу соответственно переменным check_1, check_2 и другим выставить контролы. воть. не ругайте за корявость, если что, я еще новичОГ
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #31 : 04-06-2007 17:47 » |
|
Собственно я пытался переопределить DoModal() но не вышло. Что-то я, видать, с синтаксисом путал.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #32 : 04-06-2007 17:54 » |
|
Class CMainWnd ........ { public: struct s_str1 { BOOL b1; BOOL b2; };
... };
class CDlg1 ......... { CMainWnd::s_str1* m_pstr1;
CDlg1(CWnd* pParent,CMainWnd::s_str1* p); };
#include "Dlg1.h" #include "resource.h" #include "MainWnd.h" CDlg1::CDlg1(CWnd* pParent,CMainWnd::s_str1* p):CDialog(IDD_DIALOG1, pParent) { m_pstr1=p; }
CDlg1::~CDlg1(void) { }
CDlg1::FFF() { //делаем что то с параметрами m_pstr1->...; }
void CMainWnd::DialogCount() { CMainWnd::s_str1 sss;
CDlg1 dlg(this,&sss); dlg.DoModal();
//sss - возможно, уже поменяное в диалоге
return; }
|
|
« Последнее редактирование: 05-06-2007 03:15 от Алексей1153++ »
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #33 : 04-06-2007 18:40 » |
|
Структура settings определяется в классе CMainWnd... Результат добавления этого кода - 34 ошибки. Блин. Попробую их разгрести... Ну понятно что имена структуры и прочее я поставил свои...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #34 : 05-06-2007 03:15 » |
|
Taurus727, определи структуру settings глобально )
или, раз в классе CMainWnd, то для доступа используй CMainWnd::settings (см. предыдущий пост, я подправил)
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #35 : 05-06-2007 10:05 » |
|
Если settings - это основные данные, с которыми работает программа, то лучше всего засунуть их в объекта типа CDocument, позаботившись об интерфейсе доступа. Если использование Doc/View архитектуры не предусмотрено, то тогда лучше всего создать экземпляр settings в CMyApp.
Например так:
...
settings m_settings1;
settings *GetData() { return &m_settings1; }
...
тогда в диалоге и View доступ к данным будет типа:
void CMainWnd::ShowSettings1() { Invalidate(1); CPaintDC dc(this); theApp->GetData().check1txt.Format("%d",theApp->GetData().check_1); theApp->GetData().check2txt.Format("%d",theApp->GetData().check_2); dc.TextOut(0,0,"Edit field_1:"+theApp->GetData().edit_field1); dc.TextOut(0,16,"Edit field_2:"+theApp->GetData().edit_field2); dc.TextOut(0,32,"Checkbox_1:"+theApp->GetData().check1txt); dc.TextOut(0,48,"Checkbox_2:"+theApp->GetData().check2txt); return; }
Так же доступ к данным осуществляется в любом другом месте программы.
В данном конкретном случае считаю дополнительное сохранение указателя в диалоге неоправданным.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Taurus727
|
|
« Ответ #36 : 05-06-2007 12:39 » |
|
Джон, так вроде бы выглядит удобнее, как ты написал. По крайней мере нет разброса кода... А вот с указателем в диалоге все не выходит. Поправленый код сделал. Осталась одна ошибка "fatal error. CDlg1 ::CDlg1 Default parameter for parameter 2 not defined" (пишу по памяти. Сейчас опять не у компа) у меня конструктор класса Dlg1 в хэдере определен так:CDlg1 ::CDlg1 (CWnd* pParent=NULL):CDialog(IDD_DIALOG1, pParent) {} я это не показал сразу тут моя вина. Вот это смущает CWnd* pParent=NULL вот. Это дефолтный параметр первый. Видимо нужен дефолтный параметр в конструктор и для второго параметра. может мне получше изучить теорию работы с указателями, ребят, прежде чем тупо копи/пэйстить? А то так вы мне всю программу напишете. Мне уже стыдно
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #37 : 05-06-2007 13:27 » |
|
Taurus727, убери "=NULL" и будет шасте )
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #38 : 05-06-2007 13:30 » |
|
тады буит не щастье, а вот это Error 1 error LNK2001: unresolved external symbol "protected: virtual struct AFX_MSGMAP const * __thiscall CDlg1::GetMessageMap(void)const " (?GetMessageMap@CDlg1@@MBEPBUAFX_MSGMAP@@XZ) Dlg1.obj Error 2 fatal error LNK1120: 1 unresolved externals C:\Documents and Settings\Rex\Мои документы\Visual Studio 2005\Projects\71\Debug\71.exe
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #39 : 05-06-2007 14:50 » |
|
Taurus727, ты хочешь сделать как Лёшка посоветовал? Тогда тебе надо определить конструктор с необходимым параметром. А почему ты не хочешь через WinApp сделать? Тебе тогда в твоём диалоге вобще ничего менять не надо.
зы ЕЩЁ РАЗ - тебе надо конструктор диалога сделать точно как Лёшка написал
не
CDlg1 ::CDlg1 (CWnd* pParent=NULL):CDialog(IDD_DIALOG1, pParent) {}
а
CDlg1(CWnd* pParent, CMainWnd::s_str1* p);
|
|
« Последнее редактирование: 05-06-2007 14:52 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Taurus727
|
|
« Ответ #40 : 05-06-2007 15:23 » |
|
Джон. Я попробую и так и так. Щас пробовал как ты сказал. Какого-то черта при обращении theApp-> мне выдало undeclared identifier. Это же глобальный объект! Как он может быть undeclared внутри любого класса? Правильность написания проверил. Обращался в классе CMainWnd. Include "MyApp.h" не помог. Чего-то у меня ошибки все какие-то глупые мне кажется выскакивают. И еще. Почему у меня возникает проблема undeclared identifier при обращении любом к экземпляру структуры если он создается в любом месте кроме такого метода struct {...} exemplar; то есть удается обращаться к экземпляру если только он определен сразу после описания структуры?
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #41 : 05-06-2007 18:56 » |
|
Не понимаю любое обращение к theApp вообще из любого места программы вызывает undeclared identifier... Чего-то я запарился. Может у меня сам компилятор не настроен или что. Я не могу обратиться ни к экземпляру структуры ни к theApp ниоткуда. Все #include на месте.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #42 : 05-06-2007 23:33 » |
|
Ну что я могу сказать.... Проект в студию. Тогда уже реально будем на ошибках учиться. А так сложно... Одни догадки. Я так думаю у тебя пока там немного всего. Удаляй Debug/Release *.ncb всё остальное запихивай в архив и кидай в студию.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Taurus727
|
|
« Ответ #43 : 06-06-2007 02:13 » |
|
Окей. С работы приду - все выложу. А то гадание на бобах получается.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #44 : 06-06-2007 04:29 » |
|
>>Не понимаю любое обращение к theApp вообще из любого места программы вызывает undeclared identifier...
лечится через вставку в начало файла, где будет использоваться theApp строки
extern CMyApp theApp;
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #45 : 06-06-2007 04:44 » |
|
А как лечится то, что к экземпляру структуры невозможно обратиться? Исключение если экземпляр определяется сразу struct{...}exempl; то есть есть в описание структуры в классе. В функции initinstance происходит например создание экземпляра. Если я так пишу, то ни в одной функции даже этого же класса я не могу обратиться к экземпляру этому. Как-будто он не создан. Удается только сразу если его сделать. Но это же не всегда нужно. Единственный ответ, который приходит в голову это то, что возможно InitInstance() выполняется позже функции где происходит обращение. Но что может быть раньше ее? Тем более к экземпляру обращался вроде по сообщению он_комманд... В общем приду с работы - выложу тем более там практически и нет ничего. Я почти все кроме ресурсов и хэдеров выложил выше
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #46 : 06-06-2007 04:50 » |
|
Taurus727, чёт я нифига не понял из предыдущего поста ))
приведи код, где ты не могешь обратиться
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #47 : 06-06-2007 04:58 » |
|
Приведу када дома окажусь щас чисто по памяти пишу
|
|
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #48 : 06-06-2007 05:56 » |
|
Джон, вот Алексей1153++ мне объяснил про области видимости и вроде как я понял свою ошибку. Я создавал экземпляр внутри функции и поэтому он только в ней и опознается. Alex1153: <- (06.06.2007 09.06.28) FFF() { { int nnn; } //здесь nnn уже нету } <- (06.06.2007 09.07.40) а вот так - FFF() { int nnn; //1 { int nnn;//2 //здесь nnn 1 уже нету } //здесь nnn 2 уже нету //здесь nnn 1 есть } <- (06.06.2007 09.08.17) видимость только в блоке. поэтому вопрос вроде как сам собой отпадает. Осталось на практике применить. И про theApp он мне ответил. Я не учел того, что надо написать extern CMyApp theApp; собственно как я понял все ошибки относились к недостатку знаний об области видимости данных.
|
|
« Последнее редактирование: 06-06-2007 06:01 от Taurus727 »
|
Записан
|
|
|
|
Taurus727
|
|
« Ответ #49 : 06-06-2007 12:45 » |
|
ОТЧЕТ: ура! получился твой метод, Джон, но все же пришлось приложить немного голову. Итак. 1. проблему с невозможностью обратиться к theApp решил с помошью Лешки (extern CMyApp theApp) в файле MainWnd.cpp 2. объявил структуру в классе CMyApp и добавил в класс CMyApp функцию GetData() class CMyApp : public CWinApp { public: struct settings { int check_1,check_2; CString edit_field1,edit_field2,check1txt,check2txt; }; settings settings1; settings *GetData() { return &settings1; } ... }
как ты и писал. 3. непосредственно такая запись как ты сказал: theApp->GetData().check1txt.Format("%d",theApp->GetData().check_1); выдает ошибки: "Error 1 error C2819: type 'CMyApp' does not have an overloaded member 'operator ->'" и еще "Error 2 error C2232: '->CMyApp::GetData' : left operand has 'class' type, use '.'" 4. тогда я решил не мутить такие длинные конструкции и сделал так: в хэдер CMainWnd добавил указатель, принимающий значение из функции GetData() class CMainWnd : public CFrameWnd { public: ... CMyApp::settings *pointer; ... } и при необходимости обратиться к структуре делаю вот так: CPaintDC dc(this); pointer=theApp.GetData(); dc.TextOutA(0,0,pointer->edit_field1); И все а почему нельзя непосредственно вот так как сказал ты theApp->GetData().check1txt.Format("%d",theApp->GetData().check_1); это уже загадочнее. А за уделенное проблеме внимание - Большое спасибо
|
|
« Последнее редактирование: 06-06-2007 12:49 от Taurus727 »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #50 : 06-06-2007 12:49 » |
|
Это Я так написал?
theApp->GetData().
Да - это я так написал. "Да за такое убивать надо!" (с)
Конечно надо
theApp.GetData()->
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Taurus727
|
|
« Ответ #51 : 06-06-2007 12:54 » |
|
ну да точно. theApp это же не указатель, а экземпляр класса. надо через точку, а потом стрелку. вот поменл записи на правильные и они заработали без добавления лишних указателей одна голова -хорошо, а две-мутант
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #52 : 06-06-2007 13:43 » |
|
Эт я по запарке в большой спешке на работе написал. Ну и ессно один раз, а остальные copy-paste. Одна голова выспавшаяся и без заморочек, десяти невыспавшихся стоит. А ежели ещё на экран смотреть не через спичечный забор, то можно вобще хорошие вещи творить.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #53 : 07-06-2007 03:18 » |
|
Taurus727,
>>одна голова -хорошо, а две-мутант одна голова - хорошо, а всё тело - лучше ))
|
|
|
Записан
|
|
|
|
|