ошибка получения необъявленного идентификатора - PullRequest
0 голосов
/ 25 октября 2010

Следуя инструкции на http://www.codersource.net/mfc/mfc-tutorials/ctabctrl.aspx, я объявил функцию ActivateTabDialogs() в своем заголовочном файле и вызвал ее внутри другой функции в моем классе. Компилятор выдает ошибку C2065: 'ActivateTabDialogs' : undeclared identifier в строке ActivateTabDialogs(); внутри определения функции OnSelChange(). Что я здесь нарушаю?

Вот моя часть объявления в заголовочном файле TCGeriArama_TabCtrl.h

class CTCGeriArama_TabCtrl : public CTabCtrl
{
// Construction
public:
    CTCGeriArama_TabCtrl();

// Attributes

    //Array to hold the list of dialog boxes/tab pages for CTabCtrl
    int m_DialogID[2];

    int m_nPageCount;

    //CDialog Array Variable to hold the dialogs 
    CDialog *m_Dialog[2];

public:
// Operations
    //Function to Create the dialog boxes during startup
    void InitDialogs();

    //Function to activate the tab dialog boxes
    void ActivateTabDialogs();

Вот определение ActivateTabDialogs() и часть, которую я называю внутри TCGeriArama_TabCtrl.cpp

void CTCGeriArama_TabCtrl::ActivateTabDialogs()
{
    int nSel = GetCurSel();
    if(m_Dialog[nSel]->m_hWnd)
        m_Dialog[nSel]->ShowWindow(SW_HIDE);

    CRect l_rectClient;
    CRect l_rectWnd;

    GetClientRect(l_rectClient);
    AdjustRect(FALSE,l_rectClient);
    GetWindowRect(l_rectWnd);
    GetParent()->ScreenToClient(l_rectWnd);
    l_rectClient.OffsetRect(l_rectWnd.left,l_rectWnd.top);
    for(int nCount=0; nCount < m_nPageCount; nCount++){
        m_Dialog[nCount]->SetWindowPos(&wndTop, l_rectClient.left, l_rectClient.top, l_rectClient.Width(), l_rectClient.Height(), SWP_HIDEWINDOW);
    }
    m_Dialog[nSel]->SetWindowPos(&wndTop, l_rectClient.left, l_rectClient.top, l_rectClient.Width(), l_rectClient.Height(), SWP_SHOWWINDOW);

    m_Dialog[nSel]->ShowWindow(SW_SHOW);

}

//Selection change event for the class derived from CTabCtrl
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
{
    // TODO: Add your control notification handler code here
    ActivateTabDialogs(); // HERE'S WHERE THE COMPILER GIVES THE ERROR
    *pResult = 0;
}

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Ну, очевидно, OnSelChange - это бесплатная функция. ActiveTabDialogs является функцией-членом класса CTCGeriArama_TabCtrl. Функции-члены должны вызываться для экземпляра класса, членом которого они являются. Есть два варианта:

  1. Сделать OnSelChange также функцией-членом CTCGeriArama_TabCtrl.
  2. Измените вызов на someObj.ActiveTabDialogs() и предоставьте OnSelChange ссылку на экземпляр CTCGeriArama_TabCtrl.

Судя по всему, OnSelChange является функцией обратного вызова. Вероятно, было бы трудно сделать его функцией-членом, поскольку это изменило бы его тип указателя. Если это обратный вызов для какой-либо используемой вами платформы, вам следует проверить, предоставляет ли эта среда какой-либо механизм для передачи контекстной информации обработчику обратного вызова (вероятно, для чего нужен NMHDR* pNMHDR -параметр).

1 голос
/ 25 октября 2010

В указанной вами ссылке функция OnSelchange является функцией-членом.

Так что попробуйте изменить

void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)

до:

void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
0 голосов
/ 25 октября 2010

Оказывается, я не добавил обработчик с помощью мастера классов, а вручную поставил функцию OnSelChange(), и это вызывало проблему. Большое спасибо за ваше внимание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...