consiguiendo error 'identificador no declarado'
-
26-09-2019 - |
Pregunta
Siguiendo el tutorial en http://www.codersource.net/mfc/ MFC-tutoriales / ctabctrl.aspx , me han declarado la función ActivateTabDialogs()
en mi archivo de cabecera y lo llamó dentro de otra función en mi clase. El compilador da C2065: 'ActivateTabDialogs' : undeclared identifier
de error, en la línea de ActivateTabDialogs();
dentro de la definición de la función OnSelChange()
. ¿Qué estoy violando aquí?
Esta es mi parte de declaración en el TCGeriArama_TabCtrl.h
archivo de cabecera
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();
Esta es la definición de ActivateTabDialogs()
y la parte que estoy llamando dentro 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;
}
Gracias.
Solución 3
Resulta que yo no agregar el controlador utilizando el asistente de clase, y poner manualmente el OnSelChange()
función, y que estaba causando el problema. Muchas gracias por su atención
Otros consejos
Bueno al parecer OnSelChange
es una función gratuita. ActiveTabDialogs
es un miembro-función de la CTCGeriArama_TabCtrl
clase. Las funciones miembro tienen que ser llamado en una instancia de la clase que son un miembro de. Hay dos opciones:
- Hacer
OnSelChange
una función miembro deCTCGeriArama_TabCtrl
también. - Cambiar la llamada a
someObj.ActiveTabDialogs()
y proporcionarOnSelChange
con una referencia a una instanciaCTCGeriArama_TabCtrl
.
Desde el aspecto de que OnSelChange
es una función de devolución de llamada. Probablemente sería difícil hacer que una función miembro, ya que ello cambie de tipo puntero. Si se trata de una llamada de retorno para algún tipo de marco que está utilizando, usted debe asegurarse de que ese marco proporciona un mecanismo para pasar información contextual a la devolución de llamada-controlador (probablemente lo que el NMHDR* pNMHDR
-parámetro es para).
En el enlace dado por la que OnSelchange
función es una función miembro.
Así que trate de cambiar
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
a:
void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)