2011-05-19 107 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++; 
}