上書き保存の仕方について – プログラミング – Home

上書き保存の仕方について
 
通知
すべてクリア

[解決済] 上書き保存の仕方について


きん
 きん
(@きん)
ゲスト
結合: 21年前
投稿: 10
Topic starter  

こんにちは (WinXP VS.Net 2003 MFC-MDI)

過去ログを「上書き保存」で調べましたが、
良い解答が見つからなかったので質問させていただきます。

名前を付けて保存の場合は下記の方法で実現できました。
void
CMapEditView::OnFileSaveAs()
{
CFileDialog dlg( FALSE, // セーブ用ダイアログ
.dat, // 拡張子
GetDocument()->GetTitle(), // デフォルトタイトル
OFN_OVERWRITEPROMPT, // 上書き確認
DAT Files(.dat)|*.dat|| // ファイルの種類
);

if( dlg.DoModal() != IDOK ) return;

// Serialize
CFile file( dlg.GetPathName(), CFile::modeWrite | CFile::modeCreate );
CArchive ar( &file, CArchive::store );
GetDocument()->Serialize( ar );
}

次に上書き保存を実装したいと思い、動作は↓の様にしようと思っています。
・セーブが初めてなら上記のような処理。
・セーブしたことがあるのなら上書き。

ここに来て、セーブの有無を調べる方法がわからなかったので質問させて頂きました。
何かよい方法があったのなら、どうぞご教授お願いします。


引用未解決
トピックタグ
会
 会
(@会)
ゲスト
結合: 21年前
投稿: 2
 

セーブの有無も一緒に記憶すればいいのでは?


返信引用
U-t
 U-t
(@U-t)
ゲスト
結合: 22年前
投稿: 14
 

MFCはよくわからんのですが、
上書きフラグのようなものを持たせればいいのではないでしょうか?

今回は view での処理のようなので、
1. CMapEditView クラスに上書きフラグ変数を追加して、
OnInitialUpdate関数内で初期化。
2. ファイル読込 & 保存時に上書きフラグを立てる。
3. OnFileSave関数(なのかな?)でフラグをチェックし、
フラグが立っていなければ OnFileSaveAs関数をコールして終了。
のような流れにするといいのではないでしょうか?

# MFCにそのような関数が用意されているかもしれないので、
# 最良の方法ではないかもしれません。


返信引用
U-t
 U-t
(@U-t)
ゲスト
結合: 22年前
投稿: 14
 

発言した直後にそれっぽいのがありました・・・
CDocument::GetPathName 関数が使えそうな感じがしますね。

if (GetDocument()->GetPathName() == NULL)
OnFileSaveAs();

みたいな感じで。


返信引用
U-t
 U-t
(@U-t)
ゲスト
結合: 22年前
投稿: 14
 

間違えました;;
CDocument::GetPathName は空の文字列を返すんですね・・・。
お恥ずかしい;;

if (strcmp(GetDocument()->GetPathName(), ") == 0)
OnFileSaveAs();

こんな感じですかね。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> ・セーブが初めてなら上記のような処理。
> ・セーブしたことがあるのなら上書き。

MFCなら、何もしなくてもこのように動作しませんか?


返信引用
きん
 きん
(@きん)
ゲスト
結合: 21年前
投稿: 10
Topic starter  

会さん、U-tさんお早いレスありがとうございます。

>>セーブの有無も一緒に記憶すればいいのでは?
>>上書きフラグのようなものを持たせればいいのではないでしょうか?

やはりフラグが手っ取り早いでしょうか。
何か関数があったらいいな、や
IsModified()とかに騙されつつ…(これは変更うんぬんですね^^;)

とりあえずフラグ用意してやってみます!
皆様ありがとうございました。解決しておきます~☆


返信引用
きん
 きん
(@きん)
ゲスト
結合: 21年前
投稿: 10
Topic starter  

あわわ、書き込んでる最中にレスが^^;
解決いれちゃいました_no

U-tさん、dairygoodsさんありがとうございます。

>>MFCなら、何もしなくてもこのように動作しませんか?
とのことですが、下記を付け足すことで動作するということでしょうか?
ON_COMMAND( ID_FILE_SAVE, CWinApp::OnFileSave )

まだ試していませんので、ちょっとやってみますね^^


返信引用
きん
 きん
(@きん)
ゲスト
結合: 21年前
投稿: 10
Topic starter  

上の発言はちょっと勘違いかも…

CMapEditView::OnFileSave()の中で普通にセーブしようとすれば、
初ならダイアログがでてってことでしょうか?

なにはともあれやってみます!


返信引用
きん
 きん
(@きん)
ゲスト
結合: 21年前
投稿: 10
Topic starter  

U-tさんのやり方も試してみましたが、空文字列しか返ってきませんでした(なんでだろう^^;

一応、下記のコードで無事動作しました!
ViewクラスよりDocumentクラスの方がやり易そうだったので移してやってみました。

void
CMapEditDoc::OnFileSave()
{
CDocument::OnFileSave();
}

しかし、また新たな問題が現れました。
ダイアログの中の「ファイルの種類」のところが「All Files」になってしまいます。
上記のコードに何かを付け足す事でファイルのフィルターは変えられるのでしょうか?

自分でも探してみますが、何かご指摘ありましたらよろしくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました