Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Serialize

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: