MFC 的CList,CPtrList,CObList,CStringList 用法之CPtrList

CPtrList類支持void指針列表。CPtrList類的成員函數類似於CObList類的成員函數。由於這種類似性,可以使用CObList參考文檔作爲成員函數的說明。無論在任何時候使用一個CObject指針作爲函數參數或返回值,都可以將指針替換爲void。例如,CObject* & CObList::Gethead() const;
可以替換成:
void * CPtrList::Gethead() const;CPtrList嵌入了IMPLEMENT_DYNAMIC宏來支持運行類型訪問和轉儲到CDumpContext對象。如果應用程序需要轉儲各個指針列表元素,則必須將轉儲環境的深度設置爲1或大於1。指針列表不能爲NULL。

當一個CPtrList對象被刪除時,或當其元素被刪除時,只刪除指針,而指針所引用的實體並未被刪除。#include <afxcoll.h>

CPtrList類成員


CPtrList apStr;
CString str;

一個函數負責往CPtrList里加記錄:
apStr.AddTail((LPCSTR)str);

一個函數將CPtrList裏所有記錄讀出來:
POSITION pos apStr.GetHeadPosition();
while(pos != NULL)
{
    str = apStr.GetNext(pos);
    // 這裏,你就可以使用str了
}

上面有一句漏了=號:
POSITION pos = apStr.GetHeadPosition();

再請問CPtrList裏能存結構的指針嗎?

當然可以。
struct AAA
{
    int a;
    int b;
};
AAA * aa=new AAA;
CPtrList pList;
pList.AddTail(aa);

在使用CPtrList鏈表類時,其添加的對象常爲結構體。其使用的方法一般分爲三步:(1)分配空間,添加數據。
(2)初始化時,釋放空間。
(3)數據的使用。
下面舉一個具體的例子來說明:
1.定義一個結構體:
struct VocFile
{
 char vocPath[255];
 int vocId;
 char pwd[20];
};
一般爲全局變量。
2.定義結構體變量和鏈表變量。
 CPtrList vocFileList;
 struct VocFile *pVocFile;
3.在使用前如果分配空間,則釋放空間
 POSITION pos=NULL;
 pos=vocFileList.GetHeadPosition();
 while(pos!=NULL)
 {
  pVocFile=(struct VocFile*)vocFileList.GetNext(pos);
  free(pVocFile);
 }
 vocFileList.RemoveAll();
4.分配空間,添加到鏈表中。
 while(!m_pRecordset->adoEOF)//遍歷所有記錄
  {

  getnotice->pVocFile=(struct VocFile *)malloc(sizeof(struct VocFile));
  memset(getnotice->pVocFile,0,sizeof(struct VocFile));

   TheValue = m_pRecordset->GetCollect("序號");//
   if(TheValue.vt!=VT_NULL)
   {
   // pVocFile
    getnotice->pVocFile->vocId= atoi((char*)_bstr_t(TheValue));
   // getnotice->vocId[i] = atoi((char*)_bstr_t(TheValue));
   }
   TheValue = m_pRecordset->GetCollect("密碼");//
   if(TheValue.vt!=VT_NULL)
   {
    strcpy(getnotice->pVocFile->pwd,(char*)_bstr_t(TheValue));
    //strcpy(getnotice->pwd ,(char*)_bstr_t(TheValue));
   }
   TheValue = m_pRecordset->GetCollect("語音路徑");//
   if(TheValue.vt!=VT_NULL)
   {
    strcpy(getnotice->pVocFile->vocPath,(char*)_bstr_t(TheValue));
   // strcpy(getnotice->vocFile[i] ,(char*)_bstr_t(TheValue));
   // AfxMessageBox(getnotice->vocFile[i]);
   }
   getnotice->vocFileList.AddTail(getnotice->pVocFile);
   m_pRecordset->MoveNext();
  }

5.數據的使用

 POSITION pos=NULL;  
 pos=getnotice.vocFileList.GetHeadPosition(); 
while(pos!=NULL)

 {
        getnotice.pVocFile=(struct VocFile *)getnotice.vocFileList.GetNext(pos);
        SsmStopPlayFile(line_id);
        SsmAddToFileList(line_id,"C://VOICE//notice_split.wav",7,0,-1);
        SsmAddToFileList(line_id,getnotice.pVocFile->vocPath,7,0,-1);//這一行有用的行
     str.Format("update 自動通知表 set 通知狀態=1,實際通知時間='%s' where 序號=%d",time_str,getnotice.pVocFile->vocId);
        //log->AppendLog(str);
        db->OperateDb(str);
       }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章