ottenendo l'errore 'identificatore non dichiarato'
-
26-09-2019 - |
Domanda
Dopo il tutorial a http://www.codersource.net/mfc/ MFC-tutorial / ctabctrl.aspx , ho dichiarato la funzione ActivateTabDialogs()
nel mio file di intestazione e lo ha chiamato all'interno di un'altra funzione nella mia classe. Il compilatore dà errore C2065: 'ActivateTabDialogs' : undeclared identifier
, alla linea ActivateTabDialogs();
all'interno della definizione della funzione OnSelChange()
. Che cosa sto violando qui?
Ecco la mia parte di dichiarazione nel file di intestazione 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();
Ecco la definizione della ActivateTabDialogs()
e la parte sto chiamando 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;
}
Grazie.
Soluzione 3
Si scopre che non ho aggiungere il gestore utilizzando la procedura guidata di classe, e mettere manualmente la funzione OnSelChange()
, e che ha causato il problema. Grazie mille per la vostra attenzione
Altri suggerimenti
Beh a quanto pare OnSelChange
è una funzione gratuita. ActiveTabDialogs
è un membro funzione della CTCGeriArama_TabCtrl
classe. funzioni membro devono essere chiamato su un'istanza della classe sono un membro di. Ci sono due opzioni:
- Fare
OnSelChange
una funzione di membro diCTCGeriArama_TabCtrl
troppo. - Cambia la chiamata a
someObj.ActiveTabDialogs()
e fornireOnSelChange
con un riferimento a unCTCGeriArama_TabCtrl
istanza.
Dagli sguardi di esso OnSelChange
è una funzione di callback. Probabilmente sarebbe difficile rendere un membro-funzione che avrebbe cambiato è del puntatore-tipo. Se questo è un callback per un quadro di riferimento che si sta utilizzando, si dovrebbe verificare se tale quadro fornisce un meccanismo per passare contesto informazioni al callback-handler (probabilmente quello che il NMHDR* pNMHDR
-parametro è per).
Nel link indicato dal cliente la funzione OnSelchange
è una funzione membro.
Quindi, provare a cambiare
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
a:
void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)