Получение ошибки «незабываемого идентификатора»
-
26-09-2019 - |
Вопрос
После учебника в 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
Оказывается, что я не добавил обработчик, используя мастер классов и поместил функцию OnSelChange()
вручную, и это вызывало проблему. Большое спасибо для вашего внимания
Другие советы
Ну, видимо OnSelChange
это бесплатная функция. ActiveTabDialogs
является членом-функцией класса CTCGeriArama_TabCtrl
. Отказ Функции членов должны быть вызваны экземпляром класса, который они являются членом. Есть два варианта:
- Сделать
OnSelChange
Функция членаCTCGeriArama_TabCtrl
слишком. - Изменить звонок в
someObj.ActiveTabDialogs()
и предоставитьOnSelChange
со ссылкой наCTCGeriArama_TabCtrl
-пример.
Из взгляда это OnSelChange
является функцией обратного вызова. Вероятно, было бы трудно сделать его элемент-функцией, так как это изменит бы его указатель-тип. Если это обратный вызов для некоторых рамок, которые вы используете, вам следует проверить, дает ли в том, что эта структура предоставляет некоторую механизм для передачи контекста-информации обратному обращению (возможно, что NMHDR* pNMHDR
-параметр для).
По ссылке, заданной вами функцией OnSelchange
это функция участника.
Так что попробуйте изменять
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
к:
void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)