2012年8月14日 星期二

開新檔案/開啓舊檔/存檔/另存新檔,四大天王


  • 開新檔案  
  • 開啓舊檔 
  • 存檔 
  • 另存新檔

這四個是(SDI或MDI)很常見的程式段。
但是常見到網路上找不到,很多細節又...還是找不到。

所以貼一貼好了!
藍色部份為自己打的code。
黑色部份為系統生成code。
其它色彩為相對應呼叫的結構。

Sample Code:


開新檔案(3個副程式)

//開啓程式,第一個執行的檔案初始化(只執行一次)
BOOL CColorEyeIDoc::OnNewDocument()
{
    if (!CDocument::OnNewDocument())
        return FALSE;

    // TODO: add reinitialization code here
    // (SDI documents will reuse this document)
    //第一次執行時會執行這個
    NewOmdData();

    return TRUE;
}

//開新檔案的檔案初始化,按「開新檔案」時執行
void CColorEyeIDoc::OnFileNew()
{
    // TODO: Add your command handler code here
    //開新檔案
    SetPathName(" ");         //不可以丟空字串,會產生錯誤,看了Source Code才明白
    delete f_Omd;
    NewOmdData();           //叫新的Omd
    UpdateAllViews(NULL);  //更新畫面
}


void CColorEyeIDoc::NewOmdData()
{
    SetTitle("新的Omd檔");
    vChain1.clear();                    //清空記憶體空間vChain1
    f_Omd = new COmdFile1;   //新增Omd檔(刪掉會開不了)
}


開啟舊檔(1個副程式)

void CColorEyeIDoc::OnFileOpen()
{
    // TODO: Add your command handler code here
    CFileDialog aFileDialog (TRUE, NULL, NULL, OFN_SHAREAWARE | OFN_OVERWRITEPROMPT, m_strFilter);
    
    int nID = aFileDialog.DoModal();
    if (nID == IDOK)
    {
        RestructureVector();
        if(f_Omd->Open(aFileDialog.GetPathName()))
        {
            SetPathName(aFileDialog.GetPathName());
            SetTitle(aFileDialog.GetFileName());
        }
    }
    UpdateAllViews(NULL);
}


存檔和另存新檔(2個副程式)

void CColorEyeIDoc::OnFileSaveAs()
{
    // TODO: Add your command handler code here
    CFileDialog fSaveDlg (FALSE, "omd", "*.omd", OFN_SHAREAWARE, m_strFilter);  //存檔會自己加副檔名

    int nID = fSaveDlg.DoModal();
    if (nID == IDOK)
    {
        RestructureVector();
        if (f_Omd->Save(fSaveDlg.GetPathName()))
        {
            SetTitle(fSaveDlg.GetFileName());
            SetPathName(fSaveDlg.GetPathName());
        }
    }
}

void CColorEyeIDoc::OnFileSave()
{
    // TODO: Add your command handler code here
    if (vChain1.empty())            //若開了新檔
        OnFileSaveAs();             //就另存新檔
    else
        f_Omd->Save(GetPathName());
}


另外將vector放進Omd裡

void CColorEyeIDoc::RestructureVector()
{
    if (!vChain2.empty())
    {
        //在這時
        //vChain1是舊的
        //vChain2是新的
        std::vector<Cartridge>::iterator it2, itX;

        //remove & cut
        //在新的裡面,比對舊的,代表重覆
        //重覆量測去除掉
        for (it2 = vChain2.begin(); it2 != vChain2.end(); ++it2)
        {
            itX = std::remove(vChain1.begin(), vChain1.end(), *it2);
            vChain1.erase(itX, vChain1.end());
        }

        //將舊的掛在新的後面(讓空的放在第一個)
        //整串變成舊的那一串
        //放回Omd檔
        vChain2.insert(vChain2.end(), vChain1.begin(), itX);
        vChain1 = vChain2;
    }
    else if (vChain1.empty())
    {
        Cartridge x;
        vChain1.push_back(x);
    }
    f_Omd->SetMsrData(vChain1);
}

沒有留言:

張貼留言