タイトル【Carbon化シリーズ】プログラム-DoSaveCommandカテゴリーCarbon/CF, Carbon化
作成日2000/6/27 0:32:13作成者新居雅行

void DoSaveCommand()
{
WindowPtr targetWindow;
DocRecHandle docH;

OSErr er;
NavReplyRecord reply;
NavDialogOptions dialogOptions;
AEDesc defLoc;
FSSpec defLocSpec;
short fVolRef;
long fDirID;

NavEventUPP neProc = NewNavEventProc(myNavEventProc);

if((targetWindow = FrontWindow()) != 0) { //アクティブなウインドウがあるとき
docH = GetDocHandle(targetWindow);
if(((**docH).isDarty & 2) == 0) { //保存されたかどうかを調べる
//これが初めての保存作業の場合
HLock((Handle)docH); //このあと構造体のメンバーへのポインタを利用するのでロック
NavGetDefaultDialogOptions(&dialogOptions); //ダイアログ設定は既定値
CopyCString(dialogOptions.savedFileName, (unsigned char *)"新しい文書ファイル名");
//最初から設定されているファイル名を文字列で指定できる
er = FindFolder (kOnSystemDisk, kDocumentsFolderType, kDontCreateFolder, &fVolRef, &fDirID);
//書類フォルダを探す
er = FSMakeFSSpec(fVolRef, fDirID, "\p", &defLocSpec); //書類フォルダのFSSpecを構築
er = AECreateDesc(typeFSS, &defLocSpec, sizeof(FSSpec), &defLoc);
//書類フォルダのAppleEventディスクリプタを生成

er = NavPutFile(&defLoc, &reply, &dialogOptions, neProc, myFileType, myCreator, NULL);
//ファイル保存のダイアログボックスを表示
if(er == noErr && reply.validRecord) { //ファイル選択が指定されれば
AEKeyword theKeyword;
DescType actualType;
Size actualSize;
FSSpec documentFSSpec;

er = AEGetNthPtr(&(reply.selection), 1, typeFSS, &theKeyword,
&actualType, &documentFSSpec, sizeof(FSSpec), &actualSize);

SaveToFile(&documentFSSpec, targetWindow); //ウインドウの書類を保存
//DocRecordのファイル関連のメンバーを更新
(**docH).vRefNum = documentFSSpec.vRefNum;
(**docH).parID = documentFSSpec.parID;
CopyString((**docH).fileName, documentFSSpec.name);
SetWTitle(targetWindow, documentFSSpec.name);
//ウインドウのタイトルを付けたファイル名に変更
}
er = NavDisposeReply(&reply);
AEDisposeDesc(&defLoc);
}
else { //すでに以前に1度保存している場合、ファイル名を整えて保存作業を行う
FSSpec documentFSSpec;
FSMakeFSSpec((**docH).vRefNum, (**docH).parID ,(**docH).fileName, &documentFSSpec);
SaveToFile(&documentFSSpec, targetWindow);
}
(**docH).isDarty = 2; //すでに保存を行ったことを示すフラグを立てる。修正フラグをクリアする
}
}

//以下はイベントプロシージャで、NavGetFileのサンプルと同じもの
void myNavEventProc(
NavEventCallbackMessage callBackSelector,
NavCBRecPtr callBackParms,
NavCallBackUserData callBackUD)
{
EventRecord* thisEvent = ((callBackParms->eventData).eventDataParms).event;
//イベント情報を取得しておく
MyUserData userData = *(MyUserDataPtr)callBackUD;
//ユーザデータを、コールバックルーチンで取り出す
switch (callBackSelector) { //イベントの種類に応じ
case kNavCBEvent: //一般的なイベントなら
switch (thisEvent->what) { //イベントの種類に応じ
case updateEvt: //アップデートイベントなら
break; //ここでは何もしないけど…
}
break;
case kNavCBCancel: //キャンセルボタンが押されたなら
SysBeep(1); //システム警告音を鳴らす
break;
} //…という風にイベントごとの処理を記述する
}
関連リンク