Doc::Serialize

pyro2222

Grünschnabel
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
 
Hi pyro

zu 1.

Wie du schon selbst gesagt hast, in der Serialize Funktion. Dort serialisierst du die Attribute deines Dokuments, um sie permanent zu speichern.
Entweder du hast diese Daten bereits in deinem Document oder du musst sie erst aus der View holen.
Da ein Dokument mehrere Views haben kann, solltest du dir überlegen, wie du die Zuordnung der gespeicherten Atribute zu den (möglichen) Views vornimmst.

Beim Speichern solltest du auch eine Versionskontrolle einbauen, damit du Dokumente verschiedener Versionen laden kannst (es werden sicher Änderungen in deinem Projekt kommen,die das erfordern).

Code:
void CMypDoc::Serialize(CArchive& ar)
{
   if (ar.IsStoring())
   {
	  // hier speichern
	  ar << m_MyString;
 }
   else
   {
	  // hier laden
	  ar >> m_MyString;
   }
}



zu 2.
Im Dokument mit UpdateAllViews()


zu 3.
Von der View in das Dokument mit GetDocument().
Das heisst dort, wo du die eine Attribut des Dokuments aus der View heraus ändern willst, greifst du mit GetDocument() auf das Dokument zu und (normalerweise über eine Zugriffsmethode) setzt dieses Attribut neu.

z.B.:
Code:
CMyView::DoSomething()
{
   
   CString newString;
   ...

   CMyDoc *pDoc = (CMyDoc*) GetDocument();
   pDoc->SetAttribute(newString);
   // oder pDoc->m_DocString = newString;
}

Manchmal muss man auch vom Dokument auf die View zugreifen. Das geht mit GetFirstViewPosition() und GetNextView();


Das ist ein Beispiel aus der MFC Hilfe :)

Code:
void CMyDoc::OnRepaintAllViews()
{
   POSITION pos = GetFirstViewPosition();
   while (pos != NULL)
   {
	  CView* pView = GetNextView(pos);
	  pView->UpdateWindow();
   }   
}
 
hi ,

vielen Dank...in die Hilfe hat ich natürlich geschaut, aber irgendwie....naja
jetzt klappts! Vielen Dank für die super Antwort.

Jetzt hab ich noch ein Problem.:)
Ich möchte wenn ich einen Eintrag, den ich im Menü, als Icon und in einem Dialog habe, der dasselbe ausführen soll, nur eine Funktion schreiben.

Kann ich gleiche ID´s oder Membervariablen geben? mein Versuch diesbezüglich ist fehlgeschlagen.

Danke gleich nochmal
Lg pyro2222
 
Möglich ist es, die selbe Methode aufzurufen.

Da du wahrscheinlich einen modalen Dialog verwendest, ist die Frage, ob es sinnvoll ist.
Da die Einstellungen in einem modalen Dialog (von der logischen Seite her), erst Gültigkeit haben, wenn du den Dialog mit OK verlässt.

Du kannst vom (normalerweise nicht modalen) Dialog eine Message an das Mainframe schicken und dort die gemeinsame Funktion aufrufen.
Im Mainframe erhälts du auch das jeweils aktive Dokument und die aktive View (GetActiveDocument, GetActiveView). D.h. wenn dein Commandhandler für die Methode, die du gemeinsam nutzen willst, im Dokument oder in der View liegen, kannst du damit darauf zugreifen.
Oder du machst dies alles in deiner Applikationsklasse, die auch das Main Frame erzeugt. Das ist alles abhängig davon, was du machen möchtest. Ob es auf das Dokument, die View oder auf die Applikation bezogen ist.
Auf die Applikationsklasse hast du von überall Zugriff über AfxGetApp().

Aber, wie gesagt, solltest du von einem modalen Dialog keine Methoden ausserhalb des Dialogs aufrufen.

Mit Icon meinst du sicher ein Symbol in der Toolbar. Da kannst du auf jeden Fall den gleichen Commandhandler benutzen. Das siehst du auch bei den vorgeferertigten Toolbarsymbolen, wie Save, Copy usw.

Ich hoffe, das hilft dir weiter

cu
dora
 

Neue Beiträge

Zurück