Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Первый шажок... что ли  (Прочитано 54318 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #31 : 04-06-2007 17:47 » 

Собственно я пытался переопределить DoModal() но не вышло. Что-то я, видать, с синтаксисом путал.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 04-06-2007 18:40 » 

Структура settings определяется в классе CMainWnd... Результат добавления этого кода - 34 ошибки. Блин. Попробую их разгрести... Ну понятно что имена структуры и прочее я поставил свои...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #34 : 05-06-2007 03:15 » 

Taurus727, определи  структуру settings глобально )

или, раз в классе CMainWnd, то для доступа используй CMainWnd::settings
(см. предыдущий пост, я подправил)

Записан

Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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 вот. Это дефолтный параметр первый. Видимо нужен дефолтный параметр в конструктор и для второго параметра. Улыбаюсь может мне получше изучить теорию работы с указателями, ребят, прежде чем тупо копи/пэйстить? А то так вы мне всю программу напишете. Мне уже стыдно
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #37 : 05-06-2007 13:27 » 

Taurus727, убери "=NULL" и будет шасте )
Записан

Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Записан
Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #40 : 05-06-2007 15:23 » 

Джон. Я попробую и так и так. Щас пробовал как ты сказал. Какого-то черта при обращении theApp-> мне выдало undeclared identifier. Это же глобальный объект! Как он может быть undeclared внутри любого класса? Правильность написания проверил. Обращался в классе CMainWnd. Include "MyApp.h" не помог. Чего-то у меня ошибки все какие-то глупые мне кажется выскакивают. И еще. Почему у меня возникает проблема undeclared identifier при обращении любом к экземпляру структуры если он создается в любом месте кроме такого метода struct {...} exemplar; то есть удается обращаться к экземпляру если только он определен сразу после описания структуры?
Записан
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #41 : 05-06-2007 18:56 » 

Не понимаю любое обращение к theApp вообще из любого места программы вызывает undeclared identifier... Чего-то я запарился. Может у меня сам компилятор не настроен или что. Я не могу обратиться ни к экземпляру структуры ни к theApp ниоткуда. Все #include на месте.
Записан
Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #43 : 06-06-2007 02:13 » 

Окей. С работы приду - все выложу. А то гадание на бобах получается.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #44 : 06-06-2007 04:29 » 

>>Не понимаю любое обращение к theApp вообще из любого места программы вызывает undeclared identifier...

лечится через вставку в начало файла, где будет использоваться theApp строки

extern CMyApp theApp;
Записан

Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 06-06-2007 04:44 » 

А как лечится то, что к экземпляру структуры невозможно обратиться? Исключение если экземпляр определяется сразу struct{...}exempl; то есть есть в описание структуры в классе. В функции initinstance происходит например создание экземпляра. Если я так пишу, то ни в одной функции даже  этого же класса я не могу обратиться к экземпляру этому. Как-будто он не создан. Удается только сразу если его сделать. Но это же не всегда нужно. Единственный ответ, который приходит в голову это то, что возможно InitInstance() выполняется позже функции где происходит обращение. Но что может быть раньше ее? Тем более к экземпляру обращался вроде по сообщению он_комманд... В общем приду с работы - выложу Улыбаюсь тем более там практически и нет ничего. Я почти все кроме ресурсов и хэдеров выложил выше
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #46 : 06-06-2007 04:50 » 

Taurus727, чёт я нифига не понял из предыдущего поста ))


приведи код, где ты не могешь обратиться
Записан

Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #47 : 06-06-2007 04:58 » 

Приведу када дома окажусь Улыбаюсь щас чисто по памяти пишу
Записан
Taurus727
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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 » Записан
Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #51 : 06-06-2007 12:54 » 

ну да точно. theApp это же не указатель, а экземпляр класса. надо через точку, а потом стрелку. вот поменл записи на правильные и они заработали без добавления лишних указателей Улыбаюсь одна голова -хорошо, а две-мутант
Записан
Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #53 : 07-06-2007 03:18 » new

Taurus727,

>>одна голова -хорошо, а две-мутант
  одна голова - хорошо, а всё тело - лучше ))
Записан

Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines