2011-05-19 110 views
0

此代碼從對話框中獲取一個字符串,並將其與列表中的數據進行比較,如果succesfull設置列表中元素的選擇。 我遇到的問題是,如果它工作,如果我只搜索第一個元素,如果我嘗試搜索任何其他的,它只是忽略如果條件,並一直走到列表的結尾。如果條件,沒有代碼正確執行代碼

void CMFC1Dlg::OnBnClickedButton6() 
{ 
    CString variable; 
    cautare.GetWindowTextA(variable); 
    variable = variable.MakeLower(); 

    if(variable!="") 
    { 
     list<Contact*>::iterator seek; 
     bool flag = TRUE; 
     int i = 0 ; 
     while(flag) 
     { 
      seek = agenda.first_element(); 

       if(((CString)((*seek)->getLastName().c_str())).MakeLower() == variable || 
        ((CString)((*seek)->getFirstName().c_str())).MakeLower() == variable || 
        ((CString)((*seek)->getFirstAndLastName().c_str())).MakeLower() == variable || 
        ((CString)((*seek)->getLastAndFirstName().c_str())).MakeLower() == variable) 
       { 
        contactsVariable.SetCurSel(i); 
        this->OnLbnSelchangeList1(); 
        flag=FALSE; 
       } 

       advance(seek,i); 
       i++; 
       if (i == agenda.list_size()) 
       { 
        flag = FALSE; 
       } 

     } 
    } 
    else 
     MessageBox("No text on input ", "Error", MB_ICONERROR | MB_OK); 

    cautare.SetFocus(); 
    cautare.SetWindowTextA(""); 
} 

回答

1

你永遠只比較第一元素移動advance(seek,i);這樣的:

while(flag) 
{ 
    seek = agenda.first_element(); 
    advance(seek,i); 
    ... 
2

您應該將seek = agenda.first_element();移出while循環。

+0

沒有,我需要尋求每次都被設置爲第一要素,所以當我前進時,我到達列表中的「我」元素 – Karudi 2011-05-19 16:33:30

+0

如果他這樣做,提前方法會導致非常奇怪的行爲。 – Osiris76 2011-05-19 16:33:59

+0

@Karudi:'advance(seek,i);我++;'應該在'if()'之前。 – 2011-05-19 16:42:33

4

在while循環的每次迭代開始時,您正在設置seek = agenda.first_element();。將該語句移到循環外面,它應該可以工作。

編輯:您還需要將seek調用更改爲只搜索1,而不是我,因爲您不再拋出以前的搜索結果。

+0

是的,thx :),雖然我也是自己想的。 – Karudi 2011-05-19 16:57:15

2

由於您正在迭代元素列表,爲什麼不使用關聯列表的begin()end()方法。所以你可以迭代每個元素,而不需要在每個循環中推進迭代器。

的代碼看起來是這樣的

list<Contract*>::iterator seek = agenda.begin(); 
while (flag && (seek != agenda.end())) { 
    // do the comparison 
    seek++; 
}