obtenir une erreur « identificateur non déclaré »
-
26-09-2019 - |
Question
Après le tutoriel http://www.codersource.net/mfc/ mfc-tutorials / ctabctrl.aspx , j'ai déclaré la fonction ActivateTabDialogs()
dans mon fichier d'en-tête et l'a appelé dans une autre fonction dans ma classe. Le compilateur donne C2065: 'ActivateTabDialogs' : undeclared identifier
d'erreur, à la ActivateTabDialogs();
ligne dans la définition de la fonction OnSelChange()
. Qu'est-ce que je violais ici?
Voici ma partie de déclaration dans le fichier d'en-tête 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();
Voici la définition de ActivateTabDialogs()
et la partie que je vous appelle à l'intérieur 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;
}
Merci.
La solution 3
avère que je n'ai pas ajouté le gestionnaire à l'aide de l'assistant de classe, et de mettre manuellement la fonction OnSelChange()
, et qui a été l'origine du problème. Merci beaucoup pour votre attention
Autres conseils
Eh bien apparemment OnSelChange
est une fonction libre. ActiveTabDialogs
est un élément de fonction de l'CTCGeriArama_TabCtrl
de classe. Les fonctions membres doivent être appelés sur une instance de la classe, ils sont un membre. Il y a deux options:
-
OnSelChange
une fonction de membre deCTCGeriArama_TabCtrl
aussi. - Modifier l'appel à
someObj.ActiveTabDialogs()
et de fournirOnSelChange
une référence à uneCTCGeriArama_TabCtrl
instance.
De l'apparence de celui-ci OnSelChange
est une fonction de rappel. Il serait sans doute difficile d'en faire un membre-fonction qui changerait son type de pointeur. Si cela est un rappel pour un cadre que vous utilisez, vous devriez vérifier si ce cadre fournit un mécanisme pour passer d'information de contexte au rappel-gestionnaire (probablement ce que le paramètre NMHDR* pNMHDR
-est pour).
Dans le lien donné par la fonction que vous OnSelchange
est une fonction membre.
Donc, essayez de changer
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
à:
void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)