Symbian開發/視圖間參數傳遞

維基教科書,自由的教學讀本

在使用Series 60多視圖架構時我們經常需要在視圖間傳遞數據。多視圖架構提供了函數

CAknViewAppUi::ActivateLocalViewL(TUid aViewId, TUid aCustomMessageId,
    const TDesC8& aCustomMessage)

用於在激活某個視圖時傳入相應的參數。我們可以通過實現視圖類的

DoActivateL(const TVwsViewId& aPrevViewId,TUid aCustomMessageId,
    const TDesC8& aCustomMessage)

來進行參數的處理。

通過觀察上面這兩個函數發現我們可以利用aCustomMessageId和aCustomMessage來進行直接進行整數型和8位描述符的傳遞。但如果我們要在視圖間傳遞的參數有很多,這時怎麼辦?我們可能會想到把多個參數按一定順序格式化到aCustomMessage中,然後在接收方進行解析。這種方法會產生一個問題:當參數增加或減少時對參數組織和解析都會增加負擔。其時Symbian提供了TPckgBuf這個類來進行打包工作,通過它我們可以把一個簡單對象(通常是T類)包裝到8位描述符的緩衝區中。下面的代碼演示了如何利用TPckgBuf在視圖間傳遞簡單對象:

//Parameter class
class TViewPara
{
public:
    TInt32   iId;
    TBuf<32> iCode;
    TBuf<8>  iStatus;
    TTime    iDate;
};

傳遞參數:

_LIT(KCode, "1021568");
_LIT(KStatus, "N");
TViewPara info;
info.iId = 300125;
info.iCode.Copy(KCode);
info.iStatus.Copy(KStatus);
info.iDate.HomeTime();

TPckgBuf<TViewPara> package(info);
TBuf8<128> para; //要根据TViewPara所占的内存空间准备足够的缓冲区
para.Copy(package);
ui->ActivateLocalViewL(TUid::Uid(EBrowserViewId), TUid::Uid(0), para);

解析參數:

void CBrowserView::DoActivateL(const TVwsViewId& /*aPrevViewId*/,
    TUid aCustomMessageId,
    const TDesC8& aCustomMessage)
{
    if(aCustomMessage.Length())
        {
        TViewPara info;
        TPckgBuf<TViewPara> package(info);
        package.Copy(aCustomMessage);
        iInfo = package();  //iInfo是TViewPara类型的数据成员
        }
        //……………………………
}

備註:

為了示例簡單明了並沒有通過aCustomMessageId進行防禦性編碼。

上面的代碼在基於Series60 3rd的設備上進行了測試,TViewPara中的成員直接使用中文也是正常的。