zeiger auf eine dokumenteclasse von einer dialogklasse

bukem

Mitglied
Hi,

ich habe ein sdi projekt mit dem assi und microsoft 2003 vlstudio gemacht.
in der dokumentenclasse sind meine daten und zugriffmethoden definiert.
aus meiner ansichtsclasse kann ich mit dem zeiger
CApfelmaenchenDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

zugriff mit nR = pDoc->GetStartRed();

auf das dokument und meine daten zugreifen.

jetzt versuche ich über eine dialogklasse diese daten zu ändern mein ansazt war das ich die werte der steuerelemente in die dokumentenklasse schreibe. leider bekomme ich keine zugriff auf die variablen in der dokumentenklasse. ich wollte gerne einen zeiger auf die dokumentenklasse innerhalb der dialogklasse haben nur wenn ich wie oben den code einfüge bekomme ich keinen zugriff auf GetDocument().
included sind alle dateien

oder ist das die falsche art ? soll ich die daten in der ansichtsklasse setzten ?

tnx alex
 
Zuletzt bearbeitet:
Du kannst mit GetDocument() nicht vom Dialog auf das Dokument zugreifen, da dies eine Methode der View ist.

Beim Aufrufen des Dialogs kannst du aber einen Pointer auf das entsprechende Dokument an den Dialog übergeben (Membervariable im Dialog defnieren)

Ob das gut oder schlecht ist, hängt von deiner Applikation ab.
Normalerweise macht man den Dialog unabhängig vom Dokument. D. h. du definierst Membervariablen im Dialog, die du beim Aufruf setzt und abfragst, wenn der Dialog mit OK bestätigt wird.
 
Hi,

besten dank für deine antwort.

membervariablen habe ich definiert in der dialogklasse nur greift die ansichtsklasse für die darstellung auf die dokumenten klasse zu dort werden meine daten initialisiert. wenn ich jetzt die daten vom dialog in die dialogmembervariablen eintrage, wie bekommen ich sie dann in die dokumentenklasse ? dort genau komm ich nicht weiter das ist der knackpunkt meiner überlegung. meine überlegung geht dahin das ich die daten dort wo sie stehen in die dokumnten klasse eintragen kann. kannst du mir kurz sagen wie ich den pointer von der dokumentenklasse bekomme , geht das dann von jederklasse aus oder nur von der dialogklasse ?

tnx alex
 
Das ist davon abhängig, ob du einen modalen oder nicht modalen Dialog hast.
Bei einem modalen Dialog liest du sie einfach vom Dialogobjekt und überträgst sie in das Dokument. Das machst du dort wo du den Dialog aufrufst.

Bei einem nicht modalen Dialog musst du dir eine Benachrichtigung einfallen lassen, damit das Dokument die geänderten Daten erhält.
Wie du das machst, ist deinem Gechmack und der Erweiterbarkeit deiner Applikation überlassen.
Am einfachsten ist sicher den Zeiger auf das Dokument dem Dialog mitzugeben. Damit kannnst du Datenänderungen direkt ins Dokument leiten.

Um das allgemein zu erledigen, ohne Abhängigkeiten zwischen speziellen Dialogen, Dokumenten und Views ist ein viel grösserer Aufwand nötig.
 
Hi,

erst mal danke für die schnelle antwort.

wie erhalte ich einen Zeiger auf das Dokument dem Dialog mitzugeben kannst du mir da kurz eine hilfe stellung geben ?

meine denkweise ist die, ich will das dialofeld mehrmals verwenden es ist ein modalen dialog, den ich von der ansichtsklasse aufrufe. die werte die dort eingetragen werden sollen von der dialogklassen in das domument eingetragen werden weill ich so in der ansichtklasse nur den aufruf und sonst keine andere tätigkeiten mehr in der ansichtsklasse habe. ich will den code einfach zusammenfassen.

tnx
alex
 
In der Ansichtsklasse erhältst du das Dokument mit GetDocument();
Diesen Zeiger gibst du an den Dialog weiter, bevor du ihn mit DoModal() öffnest.
In OnOK (oder wo auch in anderen Methoden, wenn du willst) des Dialogs gibst du diese Einstellungen an das Dokument weiter. Am besten über Methoden des Dokuments.

Code:
CMyView::OnDocProperties()
{
 CMyDlg dlg;
 dlg.m_pDoc = GetDocument();
 if(dlg.DoModal() != IDOK)
	  return;
   ...

}


class CMyDlg : public ...
{

public:

   CMyDoc *m_pDoc;

};

CMyDlg::OnOK()
{
   ...

   m_pDoc->Set...(m_Prop);
   ...
}
 
Danke das bringt mich weiter. noch eine frage gibt es gar keine möglichkeit den zugriff auf die dokumenteklasse erste im dialog zu erhalten ohne den zeiger in der ansichtskalsse zu übergeben ?

jedenfalls besten dank für deine hilfe


alex
 
Doch, kannst du.

Über das Main Window (AfxGetMAinWnd) kannst du bei einer SDI Anwendung mittels GetActiveView()/GetActiveDocument() die aktive View/Dokument holen.
Bei einer MDI Anwendung musst du das zuerst das aktive Frame holen (GetActiveFrame oder MDIGetActive) und dann entsprechend View/Dokument.

Wenn du nicht nur das aktive willst, kannst du über die Applikation (AfxGetApp) die Dokument Templates holen (GetFirstDocTemplatePosition, GetNextDoTemplate) und zu jedem Template die Dokumente.


Dora
 
Zurück