Bonjour,
J'ai une classe CBouton associé à un CArray de CBouton dont voici la déclaration :
Bouton.h
Bouton.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 class CBouton : CObject { public: DECLARE_SERIAL( CBouton ) ~CBouton(){} CBouton(); CBouton(char IdBtn, short SK, unsigned int KC); CBouton(const CBouton &rItem); void CopyFrom(const CBouton &Src ); void Clear(); void Serialize(CArchive& ar); const CBouton& operator=(const CBouton& Src) { CopyFrom(Src); return *this; } public: char Id_Btn; //Id du bouton short ShiftKey; //Modificateur VK_SHIFT VK_CTRL VK_ALT unsigned int Key_Code; //Code de la touche Winuser.h }; typedef CArray<CBouton,CBouton&> CBoutonArray;
Maintenant, dans une autre classe je déclare des objet CBoutonArray et je les sérialise grace à cette fontion :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 #include "stdafx.h" #include "Bouton.h" CBouton::CBouton(char IdBtn, short SK, unsigned int KC) { Id_Btn=IdBtn; ShiftKey=SK; Key_Code=KC; } CBouton::CBouton() {Clear();}; CBouton::CBouton(const CBouton &rItem) { CopyFrom(rItem); } void CBouton::CopyFrom(const CBouton &Src ) { if(this==&Src) return; Id_Btn=Src.Id_Btn; ShiftKey=Src.ShiftKey; Key_Code=Src.Key_Code; } void CBouton::Serialize(CArchive& ar) { // sauvegarde CObject::Serialize( ar ); if (ar.IsStoring()) { ar << Id_Btn << ShiftKey << Key_Code; // } else { // lecture ar >> Id_Btn >> ShiftKey >> Key_Code; } } void CBouton::Clear() { Id_Btn=0; ShiftKey=0; Key_Code=0; } template <> static void AFXAPI SerializeElements <CBouton> ( CArchive& ar, CBouton* pItem, int nCount ) { for ( int i = 0; i < nCount; i++, pItem++ ) pItem->Serialize( ar ); } IMPLEMENT_SERIAL( CBouton, CObject, 0)
Mon problème est que dès que j'essaie de supprimer un élément d'une CBoutonArray suite à un chargement de donnée par la fonction de sérialisation, j'obtient une erreur de violation d'accès mémoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 void CTelUSBView::OnFileSave() { _TCHAR Chemin[MAX_PATH]; CFile F_Btn; CString cz_Chemin; if(!SUCCEEDED(SHGetFolderPath(NULL,CSIDL_APPDATA,NULL,SHGFP_TYPE_CURRENT,Chemin))) { AfxMessageBox(_T("Erreur, Pas de chemin valide pour l'application, fermeture de l'application!"),MB_OK|MB_ICONEXCLAMATION); AfxGetMainWnd()->PostMessage(WM_SYSCOMMAND,SC_CLOSE,0); return; } cz_Chemin.Format(_T("%s\\TelUsb"),Chemin); if(!F_Btn.Open(cz_Chemin+_T("\\BtnSave.tel"),CFile::modeCreate|CFile::modeWrite,NULL)) { AfxMessageBox(_T("Erreur d'ouverture!"),MB_OK|MB_ICONEXCLAMATION); return; } F_Btn.SeekToBegin(); //Sauvegarde du fichier CArchive ar( &F_Btn, CArchive::store); this->Serialize(ar); ar.Close(); F_Btn.Close(); GetDocument()->SetModifiedFlag(FALSE); }
Une idée du problème ?
Merci d'avance.
Partager