Datei-Name von 'Speichern unter' übernehmen
-
Hallo zusammen,
ich habe in meinem Dokument unter OnSaveDocument() eine Routine zum Speichern meiner Daten geschrieben. Als ich bis dahin den 'Speichern unter' Dialog der MFC aufgerufen habe, wurde mein geöffnetes Dokument von DokumentAlt.c zu DokumentNeu.c, d.h. die ursprünglich geöffnete Datei DokumentAlt.c wurde im ursprünglichen Zustand geschlossen und jetzt wurde die neue DateiDokumentNeu.c bearbeitet. Soweit so gut..Jetzt benötigte ich aber neue Datei-Typen, so das ich die Funktion OnFileSaveAs() dafür verwende, den 'Speichern unter' Dialog zu öffnen, enstsprechende Dateitypen als Filter in CFileDialog angebe und dann OnSaveDocument() selbst aufrufe. Funktioniert alles ganz gut, nur das jetzt die alte Datei geöffnet bleibt und die neue nur gespeichert wird!
Gibt es hierfür auch nen Flag, oder kriege ich das nur mit mehr Aufwand hin? Wenn ja, wie?
Danke für eure Hilfe!
rg_Basser
-
Moment .. Du öffnest also den CFileDialog erst in OnFileSaveAs ??
Wird der nicht schon vorher von der MFC automatisch aufgerufen?
-
Nicht wenn du OnFileSaveAs() selbst aufrufst! Wo sollte ich deiner Meinung nach CFileDialog aufrufen?
[ Dieser Beitrag wurde am 18.12.2002 um 11:28 Uhr von rg_Basser editiert. ]
-
Oje, hab mir das mal kurz angeschaut:
Also, prinzipiell müsstest Du nur DoPromptFileName überschreiben, also die Funktion, wo der CFileDialog aufgerufen wird. Das geht aber nicht, weil diese Funktion in CDocManager verankert ist, noch dazu besitzt CDocManager keine virtuellen Funktionen (Warum das für die Entwickler so schwierig ist, da einfach 'n virtual davor zu schreiben, weiss ich net)!
DoPromptFileName wird von CWinApp::DoPromptFileName aufgerufen, welches wiederum nicht virtual ist (f.u.c.k.), somit ist es die einfachste Möglichkeit, die diesmal virtuelle Funktion CDocument::DoSave zu überschreiben und dort gleich den richtigen Namen zusammen zu setzen.
Den Rest macht ja die MFC schon wie gewünscht!
-
Verstehe ich richtig, du meinst ich soll anstatt OnFileSaveAs() CDocument::DoSave() aufrufen? Wenn ja, wie? Hab im Assistenten nach der entsprechenden virtuellen Funktion geschaut, hab ich aber nicht gefunden! Oder muß ich das dann manuell eingeben?
Gruß
rg_Basser
-
Nöö, DoSave wird automatisch vom Framework aufgerufen. Und da es virtuell ist, wird es automatisch an Deine Funktion DoSave weitergeleitet. Du musst nur den Code aus CDocument::DoSave rauskopieren, dort wird dann DoPromptFileName aufgerufen, und das Stück musst Du dann mit Deinem Code ändern!
-
Verzeih, dass ich schwer von Begriff bin!!
Was meinst du mit meiner Funktion DoSave()? Meinst du damit OnSaveDocument(), wo bei mir das Speichern stattfindet?
-
Leider sind viele MFC-Funktionen nicht in der MSDN zu finden.
Schau Dir einfach mal das CDocument-Objekt im Header an, dort gibts ne protected Funktion
virtual BOOL DoSave(LPCTSTR lpszPathName, BOOL bReplace = TRUE);
Die musst Du überschreiben
-
Die Deklaration von DoSave() im Header habe ich gefunden (AFXWIN.H). Aber keine Definition, in der Code drinsteht, wie das mit dem DoPromptFileName?! Wo muß ich DoSave überschreiben? Könntest du vielleicht ein Beispiel schreiben?
-
Ich hab den Code gefunden und ich glaube ich weiß jetzt, was du meinst!