000
12.06.2003, 18:43 Uhr
~michael
Gast
|
Hi, heute habe ich in meinem Projekt von einem CObArray auf eine CList umgestellt und nun geht das Serialisieren nicht mehr! Zwischen den Daten beim Speichern und dem bei Laden gibt es unterschiede betreffs der Werte! Das sollte ja aber wohl nicht sein!
Datenklasse (Nur header und Serialize-Funktion)
C++: |
class CTermin : public CObject { DECLARE_SERIAL(CTermin) public: CString GetDescription(); CString GetKind(); CTime GetTime(); void SetDescription(CString); void SetTime(int,int,int,int,int,int); void SetKind(CString kind); CTermin(); virtual ~CTermin(); virtual void Serialize (CArchive& ar); /// Zugriffsmethoden private: CString m_strDescription; CTime m_time; CString m_strKind; };
void CTermin::Serialize(CArchive &ar) { /// Funktion der Basisklasse aufrufen CObject::Serialize(ar); /// Wird geschrieben oder gelesen if(ar.IsStoring()) { /// Variablen schreiben ar << m_time << m_strDescription << m_strKind; } else { /// Variablen lesen ar >> m_time >> m_strDescription >> m_strKind; } }
|
Und nun die Klasse wo ich lade und speichere
C++: |
class CTerminplannerDlg : public CDialog { // Konstruktion public: /** * Neuen Termin anlegen und einfügen */ bool AddNewTermin(CTermin*); /* * Bestimmt in welchem Verzeichnis das Programm installiert wurde */ CString GetApplicationDirectory(); void SetCurTermin(int); CTerminplannerDlg(CWnd* pParent = NULL);// Standard-Konstruktor
// Dialogfelddaten //{{AFX_DATA(CTerminplannerDlg) enum { IDD = IDD_TERMINPLANNER_DIALOG }; CListCtrl m_ctrlView; CString m_strDate; //}}AFX_DATA
// Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CTerminplannerDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung //}}AFX_VIRTUAL
// Implementierung protected: HICON m_hIcon;
// Generierte Message-Map-Funktionen //{{AFX_MSG(CTerminplannerDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnExit(); afx_msg void OnOption(); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnNewdate(); afx_msg void OnLoad(); afx_msg void OnSave(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: /** * Setzt die Spaltenbreite so das jeder String vollstaendig angezeigt wird * oder auf einen festen Wert */ void CTerminplannerDlg::SetColumnBreadth(); /** * Löscht alle Items und Columns in Preview */ void CTerminplannerDlg::ResetView(); /** * Durchsucht das ObjectArray nach Terminen die angezeigt werden sollen */ void ShowImportantTermin(); /** * Funktion ordnet die Termine in das ListCtrl ein */ void InsertTermins(); /** * Löscht die Elemente der Liste */ void DeleteAll();
CList<CTermin*,CTermin*>* m_plTermin; int m_iCurTermin; COptionData* m_option; /// Abstand der Festlegt ab wann ein Termin als dringend erachtet wird CTimeSpan m_tImportant; };
/** * Serialisiert bzw läd die Termine in das Objetkarray */ void CTerminplannerDlg::OnLoad() { /// Listenelemente löschen this->DeleteAll(); /// serialisieren if(!this->m_option->m_strLoad.IsEmpty()) { CFile* file = new CFile(); if(file->Open(this->m_option->m_strLoad,CFile::modeRead)) { try { CArchive archive(file,CArchive::load); this->m_plTermin->Serialize(archive); archive.Close(); } catch(CException* ex) { TRACE("void CTerminplannerDlg::OnLoad() , cant handle CArchive.\n"); ex->Delete(); } file->Close(); } } else AfxMessageBox("Please insert in option filename for loading"); this->m_iCurTermin = this->m_plTermin->GetCount(); this->InsertTermins(); this->ShowImportantTermin(); }
/** * Serialisiert bzw speichert die Termine in das Objetkarray */ void CTerminplannerDlg::OnSave() { if(!this->m_option->m_strSave.IsEmpty()) { CFile* file = new CFile(); if(file->Open(this->m_option->m_strSave,CFile::modeWrite|CFile::modeCreate)) { try { CArchive archive(file,CArchive::store); this->m_plTermin->Serialize(archive); archive.Close(); } catch(CException* ex) { TRACE("void CTerminplannerDlg::OnSave() , cant handle CArchive.\n"); ex->Delete(); } file->Close(); } } else AfxMessageBox("Please insert in option filename for saving"); }
|
Wäre super wenn jemand ne Idee hat! Die Unterschied treten bei der CTime Klasse auf! Es sieht so aus als speichere er den Wert gar nicht ab! Also wird nach serialize immer als nicht initialisiert angesehen!
mfg Michael
PS: entschuldigt die Form, sollte der Quelltext etwas verschoben sein, das Fenste ist zu klein PSS: Wer Rechschreibfehler finet darf sie behalten |