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

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

by
Offline Offline

« : 16-11-2006 13:02 » new

Есть MDI прога. Создал класс
class CResultViewBar : public CDialogBar
из CGraphFrame : CFrameWnd вызываю функцию Create с идентификатором отрисованного диалога из редактора ресурсов, на котором находятся элементы типа "static text" c номерами IDC_STATIC1 и т.д.
В классе CResultViewBar имеется DDX_control для всех IDC_STATIC.
При выполнении SetFont и SetWindowText в CResultViewBar::OnInitDialog, все нормально: текст и шрифт меняются.
Также всё нормально, когда эти функции вызываются сразу после создания CDialogBar в CGraphFrame.
Но когда я пытаюсь выполнять эти функции из других дочерних классов, ничего не получается.
Как я понял проблема в том, что при инициализации диалога хэндлы всех DDX_control хранятся в стэке, а после возврата в основной цикл, теряются.
void CResultViewBar::DoDataExchange(CDataExchange* pDX)
{
   CDialogBar::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(CGradientDlg)
   DDX_Control(pDX, IDC_STATIC1, m_static1);
   DDX_Control(pDX, IDC_STATIC2, m_static2);
   DDX_Control(pDX, IDC_STATIC3, m_static3);
   DDX_Control(pDX, IDC_STATIC4, m_static4);
   //}}AFX_DATA_MAP
}
Вопрос, каким образом можно получить эти хэндлы при вызове функции такого вида:
void CResultViewBar::SetResult()
{
       m_static4.SetWindowText("3333");
}
Записан
Джон
просто
Администратор

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

« Ответ #1 : 16-11-2006 15:29 » 

Во намутил! Давай по порядку. В какой студии ты работаешь? Судя по всему в 6ой. Или?

1. Что значит "дочерние классы"? Чьи дочерние классы? CResultViewBar?

2. ЧТо значит "хэндлы всех DDX_control"? DDX_control это всего лишь ф-ця.


Код:
/////////////////////////////////////////////////////////////////////////////
// Special DDX_ proc for subclassing controls

void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl)
{
if (rControl.m_hWnd == NULL)    // not subclassed yet
{
ASSERT(!pDX->m_bSaveAndValidate);

HWND hWndCtrl = pDX->PrepareCtrl(nIDC);

if (!rControl.SubclassWindow(hWndCtrl))
{
ASSERT(FALSE);      // possibly trying to subclass twice?
AfxThrowNotSupportedException();
}
#ifndef _AFX_NO_OCC_SUPPORT
else
{
// If the control has reparented itself (e.g., invisible control),
// make sure that the CWnd gets properly wired to its control site.
if (pDX->m_pDlgWnd->m_hWnd != ::GetParent(rControl.m_hWnd))
rControl.AttachControlSite(pDX->m_pDlgWnd);
}
#endif //!_AFX_NO_OCC_SUPPORT

}
}

Она хранит данные только на время вызова. Поэтому в неё передают ссылку на объект CWnd класса. Тогда ф-я сздаёт окно и инициаллизирует его с параметрами (координаты, стили) ресура ID.  Никаких "хэндлов" она не хранит. Да и раз уж ты MFC используешь, там хэндлы окон в явном виде вообще не присутствуют. Они спрятаны в оболочку CWnd. Те в данном случае после вызова DDX_control они хранятся в m_static1,2,3 и тд
Вот так она выглядит. Обрати внимание на обращение к хэндлу - rControl.m_hWnd
Те эта ф-я сработает только один раз, или лучше скажем так, будет срабатывать только тогда, когда окно разрушено, равно NULL. Обычно в диалоге не происходит разрушение окон, поэтому - только 1 раз.

3. Покажи как у тебя определены m_static1? CStatic m_static1;?

4. Покажи код с "основным циклом".
после возврата в основной цикл

хэндлы всех DDX_control хранятся в стэке

В стэке хранятся всё объекты m_static1,2,3,4 и хранятся они там столько, сколько существует объект CResultViewBar.

зы Лучше всего начинать вопрос с короткого описания - что ты хочел сделать, или что сделал. А не КАК ты это сделал. Это второстепенно. Пока в том, что ты написал нет ни единой ошибки. Включая SetResult(). На этой основе даже не знаю, как помочь?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #2 : 16-11-2006 18:34 » 

В какой студии ты работаешь? Судя по всему в 6ой. Или?
MSVC 2005
Покажи как у тебя определены m_static1? CStatic m_static1;?
Хорошо. Поясню конкретнее.
***************************************************************
Из файла pviewbar.cpp
/////////////////////////////////////////////////////////////////////////////
// CResultViewBar

CResultViewBar::CResultViewBar()
{
    b_enabled = TRUE;
   m_pBoldFont = new CFont;
}

CResultViewBar::~CResultViewBar()
{
   delete m_pBoldFont;
}

void CResultViewBar::DoDataExchange(CDataExchange* pDX)
{
   CDialogBar::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(CGradientDlg)
   DDX_Control(pDX, IDC_STATIC1, m_static1);
   DDX_Control(pDX, IDC_STATIC2, m_static2);
   DDX_Control(pDX, IDC_STATIC3, m_static3);
   DDX_Control(pDX, IDC_STATIC4, m_static4);
   //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CResultViewBar, CDialogBar)
   //{{AFX_MSG_MAP(CResultViewBar)
   ON_WM_PAINT()
   ON_WM_SIZE()
   ON_WM_CREATE()
   ON_MESSAGE(WM_INITDIALOG, OnInitDialog )
   ON_WM_RBUTTONUP()
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

Привожу только эту фунцию

LONG CResultViewBar::OnInitDialog ( UINT wParam, LONG lParam)
{
   BOOL bRet = HandleInitDialog(wParam, lParam);
   if (!UpdateData(FALSE))
   {
      TRACE0("Warning: UpdateData failed during dialog init.\n");
   }
   m_pBoldFont->CreateFont(35,0,0,0,900,0,0,0,0,0,0,ANTIALIASED_QUALITY,0,"Arial");

   //Use big font and standard colors
   m_static1.SetFont(m_pBoldFont);
   m_static1.SetWindowText("0000000");
   m_static2.SetFont(m_pBoldFont);
   m_static2.SetWindowText("0000000");
   m_static3.SetFont(m_pBoldFont);
   m_static3.SetWindowText("0000000");
   m_static4.SetFont(m_pBoldFont);
   m_static4.SetWindowText("0000000");
   return bRet;
}

****************************************************************8
Из файла pviewbar.h

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CResultViewBar window

class CResultViewBar : public CDialogBar, public virtual CGraphBaseClass
{
//    #define GRAPH_COMBO_CHILD_ID   11005
 //   #define GRAPH_POINT_LIST_CHILD_ID   11006

// Construction
public:
   CResultViewBar();

   protected:
   virtual void DoDataExchange(CDataExchange* pDX);   // DDX/DDV support
// Attributes
public:

    CGraphComboBox graph_combo_box;
//    C3DListCtrl point_list_ctrl;
    BOOL b_enabled;
   CFont *m_pBoldFont;
   CStatic m_static1;
   CStatic m_static2;
   CStatic m_static3;
   CStatic m_static4;
// Operations
public:
    virtual void AppendMenuItems(CMenu* menu);
    virtual void OnRBMenuCommand(UINT command_id);
   void SetResult();
// Overrides
..........................................................
Также есть некий класс CTest_grafixView, который делает расчёт данных
И мне нужно, чтобы результат этого расчёта выводился в CResultViewBar на контрол типа CStatic с заданным при инициализации DialogBar шрифтом
****************************************************

Из файла test_grafixView.cpp

void CTest_grafixView::OnGraphStartCapture()
{
   pResultViewBar->SetResult();
}
****************************************************
Из файла test_grafixView.h

class CTest_grafixView : public CView
{
protected: // create from serialization only
   CTest_grafixView();
   DECLARE_DYNCREATE(CTest_grafixView)

// Attributes
public:
   CTest_grafixDoc* GetDocument();
   CGraphWnd graph_wnd;
   CResultViewBar *pResultViewBar;
....................................................

И при выполнении pResultViewBar->SetResult();
Возникает ошибка в модуле winocc.cpp, line 246
Т.е получается, что элементы CStatic m_static1 не определяются как окна.
Окно класса CResultViewBar создается в функции
int CGraphFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

Каким образом можно передать данные из CTest_grafixView на элементах CStatic из CResultViewBar и отобразить  в диалоге Не понял?
Записан
Джон
просто
Администратор

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

« Ответ #3 : 17-11-2006 01:20 » 

Улыбаюсь Нууу ты объяснил...

Лучше уж кинь проектик в архиве на мыло. А то придётся здесь весь код выкладывать. Практически ты повторил свой первый топик. Я же тебе сказал, что там ошибок нет.

Судя по ошибке твои контролы не существуют как окна в момент обращения. Там просто стоит проверка IsWindow. Те либо они ещё не созданы, либо к ним уже применили Destroy. В общем нужен код из CTest_grafixView - цепочка, от создания pResultViewBar (кстати попутно маленький совет - называй мемберы с m_ в начале, m_pResultViewBar, их тогда легче от локальных отличать, но это не важно), до вызова CTest_grafixView::OnGraphStartCapture()

Может у тебя диалог больше не существует? В общем что-то очень простое.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #4 : 17-11-2006 09:41 » 

Похоже, что контролы разрушаются после создания диалога, т.е. после выхода из CResultViewBar::OnInitDialog.
Т.к. когда я ставлю вызов CResultViewBar::SetResult в CResultViewBar::OnSize, появляется та же ошибка.  С ума сойти...
Как сделать, чтобы контролы не разрушались???
Записан
Джон
просто
Администратор

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

« Ответ #5 : 17-11-2006 10:19 » 

winbinar, кинь мне проект на мыло. Я тебе не могу объяснить какую именно часть кода ты должен показать, тк не заню всей концепции. Когда, что, где запускается?

Еще раз. Твои вопросы:

Вопрос, каким образом можно получить эти хэндлы при вызове функции...

Каким образом можно передать данные из CTest_grafixView на элементах CStatic из CResultViewBar и отобразить  в диалоге Не понял?

Как сделать, чтобы контролы не разрушались???

не имеют ничего общего с проблемой.

Предположение:
Похоже, что контролы разрушаются после создания диалога, т.е. после выхода из CResultViewBar::OnInitDialog.

вообще не лезет ни в какие ворота! Если ты привёл реально используемый код:

Код:
LONG CResultViewBar::OnInitDialog ( UINT wParam, LONG lParam)
{
   BOOL bRet = HandleInitDialog(wParam, lParam);
   if (!UpdateData(FALSE))
   {
      TRACE0("Warning: UpdateData failed during dialog init.\n");
   }
   m_pBoldFont->CreateFont(35,0,0,0,900,0,0,0,0,0,0,ANTIALIASED_QUALITY,0,"Arial");

   //Use big font and standard colors
   m_static1.SetFont(m_pBoldFont);
   m_static1.SetWindowText("0000000");
   m_static2.SetFont(m_pBoldFont);
   m_static2.SetWindowText("0000000");
   m_static3.SetFont(m_pBoldFont);
   m_static3.SetWindowText("0000000");
   m_static4.SetFont(m_pBoldFont);
   m_static4.SetWindowText("0000000");
   return bRet;
}

и он работает, то я утверждаю, что это
Цитата
контролы разрушаются после создания диалога, т.е. после выхода из CResultViewBar::OnInitDialog.
АБСОЛЮТНО невозможно.

Ещё раз, всё что я до сих пор видел - в порядке.

Короче, проще говоря, ты ищешь не там. Я бы грубо сформулировал проблему след. образом - у тебя нарушена последовательность создания-разрушения окон и обращения к ним. По идее такие ошибки находятся очень легко, но скорее всего тебе не хватает опыта.
Так что не мудрствуя лукаво - выкинь из проекта всё ненужное, засунь в архив и кинь на мыло. А то мы будем так до ишачей пасхи фантазировать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #6 : 17-11-2006 14:25 » 

Выслал...
Записан
Джон
просто
Администратор

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

« Ответ #7 : 17-11-2006 15:25 » 

Ага получил, к сожалению сейчас нет времени разобираться - пятница, клиентов полна фирма.
ПОпозже, или вечерком гляну.

Хорошая новость, всё именно так как я и предполагал. В этот момент у тебя не то, что контролы, а даже диалог не определён.



указатель не иницаллизирван. Поэтому в силу кастинга кусок памяти просто подгоняется под формат класса, это просто. Но поскольку там лежит мусор, то ничего не происходит.

зы Я просто кликнул на sln и открыл в 2003 студии. Обычно она не любит 2005 проекты. А тут без проблем. Ты уверен, что у тебя 2005?  Или проект был в 6-ой начат? Просто такие вещи:

//{{AFX_DATA_MAP(CGradientDlg)

начиная с .NET уже умерли. Они были нужны только для Class Wizard в шестёрке. Поэтому я и спросил. Кстати они у тебя от другого диалога. Ага

* ss1.gif (2.22 Кб - загружено 2818 раз.)
« Последнее редактирование: 17-11-2006 15:28 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #8 : 17-11-2006 15:41 » 

У меня дома 2005, а на работе 2003.
А проект с 6.0 конвертирован это точно.
Записан
Джон
просто
Администратор

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

« Ответ #9 : 17-11-2006 15:56 » 

Ээээ чёт я не пойму. У тебя на весь проект только два места где pResultViewBar встречается:

test_grafixView.cpp(289):   pResultViewBar->SetResult(777,777,777,777);
test_grafixView.h(33):   CResultViewBar *pResultViewBar;

а где он создаётся? Инициаллизируется? Не порядок. Где те ф-ции про которые ты говорил?

создания CDialogBar в CGraphFrame.

Или ты слишком много удалил? Я так думаю, DialogBar должен создаваться в MainFrame, а потом указателю в View присвоить ссылку на него.

зы winbinar, задача: Буратино дали 5 яблок, Буратино съел 2 яблока. Сколько яблок осталось у Буратино?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #10 : 17-11-2006 18:03 » 

DialogBar создается в class CGraphFrame : public CFrameWnd.
А вот как присвоить корректно ссылку на ентот Dialog Bar в Cview что-то не догоняю.
Джон, подскажи, плз
« Последнее редактирование: 17-11-2006 18:04 от winbinar » Записан
Джон
просто
Администратор

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

« Ответ #11 : 20-11-2006 10:01 » 

winbinar, сорри. На выходные решал бытовые проблемы. Но разобраться в твоём проекте ооочень не легко. В том смысле, что надо много времени. Структура сразу не просматривается. Очень хочется надеятся, что тебе его подсунули в таком виде. Это ж просто катастрофа. Какие-то куски, множественное наследование...

В общем немного потерпи, пока я "въеду". Если надо побыстрей, то посмотри след:

В test_grafixView.h добавь ф-ю:

void SetDlgBarPtr(CResultViewBar *pResultViewBar)
{
     m_pResultViewBar = pResultViewBar;
}

мембер pResultViewBar переименнуй в m_pResultViewBar.

При создании окна DialogBar в CGraphFrame посмотри, какие есть возможности получить доступ к grafixView. И вызови ф-ю SetDlgBarPtr.

зы Кстати как насчёт задачи про Буратино? Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #12 : 20-11-2006 10:46 » 

Я думаю, что лучше рассмотреть возможность отправки сообщения WM_SETTEXT из Ctest_grafixView в CGraphWnd с указателем на строку.
Проект остался в первозданном виде. Я и сам в нём пока слабо ориентируюсь... Осваивать приходится экспериментальным путём.
А про буратино...
Не известно сколько у него осталось яблок, т.к. неизвестно сколько у него их было до этого...  Ага
Записан
winbinar
Интересующийся

by
Offline Offline

« Ответ #13 : 20-11-2006 11:44 » 

Джон, я воспользовался такими инструкциями для получения указателя на класс Ctest_grafixView:
   CTest_grafixView* pView;
   pView = (CTest_grafixView *)pView->GetThisClass();
и вызвал функцию для сохранения указателя на класс.
   pView->SetDlgBarPtr(this);

В результате получил ошибку записи. Что за фигня такая?
PS: Эти инструкции поставил в CResultViewBar::OnInitDialog
« Последнее редактирование: 20-11-2006 11:46 от winbinar » Записан
Джон
просто
Администратор

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

« Ответ #14 : 20-11-2006 12:25 » 

Я думаю, что лучше рассмотреть возможность отправки сообщения WM_SETTEXT из Ctest_grafixView в CGraphWnd с указателем на строку.

Сути это не меняет, SendMessage такая же ф-я. Прямая инициализация лучше. А ещё лучше, конечно, встроить в CGraphFrame ф-ю

CResultViewBar* GetDlgBar();

а мембер вообще выкинуть. Я только вечерком смогу глянуть.

Цитата
А про буратино...
Не известно сколько у него осталось яблок, т.к. неизвестно сколько у него их было до этого...  Ага

О! А мораль? Ага Переменные надо инициализировать! Вот добавили бы в конструктор сразу pResultViewBar=NULL; и уже вопросы про хэндлы статиков сами собой отпали бы. Ага
« Последнее редактирование: 20-11-2006 12:37 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Джон
просто
Администратор

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

« Ответ #15 : 20-11-2006 12:27 » 

Джон, я воспользовался такими инструкциями для получения указателя на класс Ctest_grafixView:
   CTest_grafixView* pView;
   pView = (CTest_grafixView *)pView->GetThisClass();
и вызвал функцию для сохранения указателя на класс.
   pView->SetDlgBarPtr(this);

В результате получил ошибку записи. Что за фигня такая?
PS: Эти инструкции поставил в CResultViewBar::OnInitDialog

Ещё бы!

Ты определил pView через pView! Ага


Ещё раз - ПЕРЕМЕННЫЕ НАДО ИНИЦИАЛИЗИРОВАТЬ!!!

CTest_grafixView* pView=NULL;

Тогда у тебя ошибка сразу тут выскочит:

pView->GetThisClass();
« Последнее редактирование: 20-11-2006 12:32 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #16 : 20-11-2006 12:55 » 

Ошибка выскакивает как раз-таки в SetDlgBarPtr. Ага
Записан
Джон
просто
Администратор

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

« Ответ #17 : 20-11-2006 14:03 » 

winbinar, ты что, издеваешься? ПОЭТОМУ И ВЫСКАКИВАЕТ!
У тебя в указателе мусор! Ты понимаешь, что ты делаешь?

Сравни:

int i = i;

Что стоит в i? Ага

А преобразованию типа по барабану. Обращение к куску памяти по адресу "мусор в pView" выдаёт ошибку.

зы Забыл - покажи код GetThisClass();
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #18 : 20-11-2006 14:14 » 

Да ладно, хрен с ним.
Я просто дурью маялся, вот и написал то, что в подсказке было.
Джон, мот идеи какие возникли?
« Последнее редактирование: 20-11-2006 14:17 от winbinar » Записан
Джон
просто
Администратор

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

« Ответ #19 : 20-11-2006 15:08 » 

Я вечерком гляну, ща работы по самое нихочу.
А решение простое. Сначала надо "отрисовать" всю структуру и установить родственные связи. Это будет самое трудное.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Джон
просто
Администратор

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

« Ответ #20 : 20-11-2006 23:11 » 

Заключение мед. комиссии: выбросить всё нафиг и забыть как о кошмарном сне.
Такой ненависти к ООП, к структурному программированию я ещё не встречал.
Интерес представляет только с научной точки зрения извращённых наук - почему это вообще компилится?

Тем не менее попробую...

Итак:

Объект типа CResultViewBar создаётся как мембер в классе
 
class CGraphFrame : public CFrameWnd, public virtual CGraphBaseClass
{
...
      CResultViewBar m_rview_bar;
...
};

Объект CGraphFrame создаётся в классе

class CGraphWnd : public CWnd, public virtual CGraphBaseClass
{
     CGraphFrame* graph_frame;
};

Ну и наконец объект CGraphFrame является мембером класса

class CTest_grafixView : public CView
{
      CGraphWnd graph_wnd;
};



Ураааа докапались. Теперь делаем след:

1.
в СGraphFrame добавляем ф-ю
CResultViewBar *GetResultViewBar() { return &m_rview_bar; }

*) я переименовал rview_bar в m_rview_bar.

2.
в CGraphWnd добавляем ф-ю
CGraphFrame* GetGraphFrame() { return graph_frame; }

3.
в CTest_grafixView выкидываем мемебер указатель
CResultViewBar *pResultViewBar;

4.
Обращение в void CTest_grafixView::OnGraphStartCapture()
выглядит след образом:

   CResultViewBar *pResultViewBar = graph_wnd.GetGraphFrame()->GetResultViewBar();
   pResultViewBar->SetResult(777,777,777,777);

Всё. Все числа поменялись. Потом я получил ошибку Listner

Unable to open COM-port
(error code 3)

Что нормально, тк ничего на СОМ порту у меня не висит.

Всё.

оптимизацию и рефэкторинг полностью оставляю тебе. Использование кода в таком виде просто недопустимо. Постарайся убедить в этом начальство.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
winbinar
Интересующийся

by
Offline Offline

« Ответ #21 : 21-11-2006 08:51 » 

Ура !!!
Получилось !!!
Джон, ну ты молодец  Класс!, раскрутил всё-таки бодягу  Ага
Буду должен  Ага
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines