Doc::serialze() es speichert nicht
-
Moin!
Ich will doch nur speichern....
1. Wie kann ich mit der Doc::Serialize Funktion eine Variable aus der View-Klasse wegspeichern? Kann mir jemand sagen in welcher Funktion ich was machen muss?
2. Wenn ich diese Datei wieder laden möchte, und den Öffnen-Dialog aufrufe, wie kann ich damit ein Invalidate() verbinden? (wenn die Variable zB. eine Farbe ist und der Hintergrund neu gefärbt werden soll, die geladenen DAten also aktiviert werden sollen)
3. ich verstehs nicht. Wenn ich eine neue Funktion bastle, zB. LButtonDown() dann kann ich das Auslesen und neuzeichnen. Soweit bin ich. Aber ohne weiß ich nicht, wie ich den Variablenwert von der View in die Doc bekomme. Soweit ich weiß verbindet nur die GetDocument() die beiden Klassen.Und wo stecken die Dialogfenster aus dem Standard-Menü?
*verwirr*
Dank schon mal im Voraus
Grüße
-
Du musst die Serialize Funktion überschreiben.
z. B.// .h Datei class CText : public CDocument { protected: DECLARE_SERIAL(CText) public: CString Puffer; virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); }; // .cpp Datei // Text.cpp #include <afxwin.h> #include "TuBEditor.h" #include "Text.h" IMPLEMENT_SERIAL(CText, CDocument, 2) BOOL CText::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; Puffer = _T(""); return TRUE; } void CText::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar << Puffer; } else { ar >> Puffer; } }
-
die serialize() hab ich so und
also so schauts jetzt in der .h bei mir aus:class CSpeicherDoc : public CDocument { protected: // Nur aus Serialisierung erzeugen CSpeicherDoc(); // DECLARE_DYNCREATE(CSpeicherDoc) DECLARE_SERIAL(CSpeicherDoc) // Attribute public: int m_farbe; // Operationen public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); // Überladungen // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CSpeicherDoc) public: // virtual BOOL OnNewDocument(); // virtual void Serialize(CArchive& ar); //}}AFX_VIRTUAL
aber es tut sich nichts. muss ich in der view noch etwas tun?
zum laden hab ich eine funktion gebaut: (falls es am laden liegt)
void CSpeicherView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen CSpeicherDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); m_farbe=pDoc->m_farbe; Invalidate(); CView::OnRButtonDown(nFlags, point); }
grüße
-
also....ich komm voran..
wie aussieht kann ich speichern, und laden...aber:
er speichert nur den Variablenwert den ich in OnNewDocument zu Beginn zu weise. Dh. es hapert noch daran, den Variablenwert für die Farbe aus der View in die Doc zubekommen. Wenn ich dort die Farbe änder, dann speichert er nicht den neuen Wert.
der Rest mein ich passt.
grüße
-
Funktioniert deine Header datei wirklich???
Du überlädst die Funktionen teilweise doppelt???
Oder war dies eventuell nur ein problem beim posten???
-
nö...
hab die unteren auskommentiert...
oder .... egal...es funktioniert inzwischen!
vielen dank...der haken war, dass ich das DECLARE_SERIAL nur in der Doc hatte und nicht in der View, wo die Variable ja herkam... das hatte ich nirgends herausgelesen.
und das Aktualisieren hab ich auch hinbekommen...bzw. das funktioniert wohl immer, nur bei mir nicht weil ich die Variable in der View und eine parallele in der Doc hatte, wobei dann nur teilweise gesetzt wurde...egal.
klappt!
dank dirVg, pyro2222