2013-05-31 2 views
0

내 설명을 통해 모든 것이 명확 해지기를 바랍니다.ID_OKCANCEL이 설정된 MessageBox에서 "cancel button"을 올바르게 설정하십시오. 대화 상자 내 대화 상자

아이디어는 List Control (보고서)을 사용하고, 메뉴가 있으며, 외부 파일에 저장하고,로드 할 수있는 전화 번호부를 작성해야하며, 연락처를 수정하고 기존 연락처를 삭제합니다. 연락처를 추가하거나 편집 할 때 새 대화 상자를 사용해야합니다. 마찬가지로 "연락처 추가"라는 메뉴 버튼이있어 편집 상자 (이름, 성, 전화 번호 등)를 입력하는 새 대화 상자가 열립니다. 전화 번호부는 작동하지만 아무런 오류가 없지만 기능을 조금 향상시키고 자합니다.

이미 John Doe라는 연락처가 있습니다. 정확히 John Doe라는 연락처를 추가하려고하면 "추가"버튼을 클릭 할 때 프로그램에 나를 묻습니다 : "연락처 이름이 이미 존재하며 다른 세부 사항은 변경 될 것입니다"라는 메시지가 OK 및 CANCEL 옵션과 함께 표시됩니다. 확인을 클릭하면 모든 것이 작동합니다. 전화, 이메일, 주소 및 그룹 (나머지 정보)이 변경됩니다. 취소를 클릭하면 "추가"대화 상자가 사라지고 목록이 표시된 기본 대화 상자로 돌아갑니다. 그것은 또한 코드의 것이지만, 나는 그것을 아무 것도하지 않기를 원합니다. 취소를 클릭하면 내 "연락처 추가 대화 상자 창"으로 돌아가고 싶지만 편집 상자는 "추가"버튼을 누르기 전에 이미 완성 된 상태로 유지하면됩니다. 취소를 클릭하면 함수를 다시 호출 할 수 있기 때문에 빈 상자와 함께 새로운 "대화 상자 추가"를 얻을 수 있습니다. 그러면 실제로 원하는 것은 아닙니다. 새 연락처 (이름 및 성)를 삽입 할 때와 같은 일이 발생하지만 편집 상자에 설정된 전화 번호 및/또는 전자 메일이 이미 존재합니다. 마찬가지로, 메시지에 "전화 번호가 이미 있습니다."라고 표시됩니다. "확인"을 클릭하면 주 대화 상자 (목록, 보고서)로 돌아가지만, "취소"를 클릭하면 변경되지 않은 편집 상자가있는 "대화 상자 추가"로 돌아갑니다. 이름, 성, 전화 번호, 주소, 이메일, 그룹)은 변경되지 않았으므로 이미 존재하는 전화/이메일을 편집 할 수 있습니다.

여러분이 아이디어를 이해하시기 바랍니다. 나는 그것이 많은 텍스트라는 것을 안다. 그건 그렇고, 그룹이 중요한 경우 라디오 버튼으로 선택됩니다.

삽입 기능에 대한 코드는 다음과 같습니다. 나는 지금 영어로 변수를 번역하려고 했으므로 읽기가 더 쉽다. (나는 영어 원어민이 아니고 가능한 실수를해서 유감스럽게 생각한다);

void Phonebook::OnContactAdd() // keep in mind this is everything in the programs Dlg.cpp (PhonebookDlg.cpp) 
{ 
    Add newcontact; //the Add type, the class created for the add dialog, has some TCHAR* values FirstName, LastName etc. When I click "add button" in the add dialog, the text from the edit boxes goes accordingly to the TCHARs 
    if (newcontact.DoModal()==IDOK) 
    { 
     TCHAR getFirstName[20],getLastName[20],getPhoneNo[20],getAdr[100],getEmail[30]; //after the classes "newcontact" TCHARs are set, these strings from here get the values already in the list and it compares them 
     int i; 
     for(i=0;i<list.GetItemCount();i++) // it compares the values in the edit boxes typed in the "add dialog" with the ones in each line already in the list 
     { 
      list.GetItemText(i,0,getFirstName,20); //gets the first name from line i 
      list.GetItemText(i,1,getLastName,20);// gets last name from line i 
      if (strcmp(getFirstName,newcontact.FirstName)==0 && strcmp(getLastName,newcontact.LastName)==0) //compares the firstname and lastname introduced with those from the line i and if they're equal... 
       if (MessageBox("Contact name already exists; other details will be changed accordingly","Warning!",MB_ICONQUESTION | MB_OKCANCEL | MB_TOPMOST)==IDOK) 
       { 
        list.SetItemText(i,2,newcontact.PhoneNo); 
        prefix(i,newcontact.PhoneNo);//function that determines the operator, not relevant to the problem 
        list.SetItemText(i,4,newcontact.Adr); 
        list.SetItemText(i,5,newcontact.Email); 
        setgrup(i,newcontact.grup); // again, this is a function that sets the group in the list according to the radio button checked; ignore it, not relevant to the problem 
        return; // it found something, it changed, it exists 
       } 
       //else IDCANCEL; // this is the problem! else what? if I put "else return", it exists to the list, of course; if i set "else OnCancel()" it closes the whole program 
       list.GetItemText(i,2,getPhoneNo,20); // if the names are not equal, we go and check if the phone number already exists 
       if (strcmp(getPhoneNo,newcontact.PhoneNo)==0) 
       { 
        AfxMessageBox("Phone number already exists"); 
        OnContactAdd(); //it exists and now the function is called again; that's what I was saying, but it's not what I want, I want to "cancel" and go back to editing the text boxes 
        return; 
       } 

       list.GetItemText(i,5,getEmail,30);//same thing for the mail, as for the phone number 
       if (strcmp(getEmail,newcontact.Email)==0) 
       { 
        AfxMessageBox("Email already exists"); 
        OnContactAdd(); 
        return; 
       } 
     } 
     // if the names, phone number or email weren't already in the list, there is no special case, so we just add the input data to the top of the list 
     list.InsertItem(0,newcontact.FirstName); 
     list.SetItemText(0,1,newcontact.LastName); 
     list.SetItemText(0,2,newcontact.PhoneNo); 
     list.SetItemText(0,4,newcontact.Adr); 
     list.SetItemText(0,5,newcontact.Email); 
     prefix(0,newcontact.PhoneNo); 
     setgrup(0,newcontact.grup); 
    } 
} 

// 지금 하나 개 더 질문 (보조)는, 어쩌면 누군가가 그것에 대해 알고 무작위로 여기에 들어갑니다

가 나는 "당신이 옵션을 입력 검색"을해야한다. 내가 그거 했어. 그러나 발견 된 텍스트의 색을 지정해야합니다. "조"를 검색 중이라고 가정하고 "존"과 "조앤"이 있다고 가정하면 그 줄 (모든 열, 정보, 발견 된 이름에 알맞음) 만 나타나야합니다. 문제 없어, 그랬어. 그러나 존과 조앤의 조만 색칠/굵게/강조 표시하는 방법이 있습니까? Jo-es 빨강과 나머지는 검정색을 유지하기 위해 'hn'과 'anne'을 얻는 것과 같습니다. 또는 최소한 전체 텍스트를 컬러로 채우지 만 다른 컬럼 텍스트는 흑백으로 유지됩니다. 검색 용 입력란의 이벤트 처리기를 사용하여 상자의 텍스트를 목록의 모든 열과 행별로 비교합니다. 일치하는 항목이 있으면 기본적으로 숨겨진 새 목록 컨트롤에 줄이 추가되고 바로 앞에옵니다. 당신이 이것을 이해하기를 바랍니다. 아마 이것에 대해서 또 다른 주제를 만들 것입니다.

답변

0

여기에 수업을 추가 할 수 있습니까? 나는 당신이 "Add"CDialog 클래스 안에 연락처를 저장하는 것을 처리해야한다고 생각한다.

"확인"버튼을 누르고 OnOk() (IDOK) 함수를 호출하면 대화 상자 창이 닫힙니다. EndDialog() 함수를 눌러서 EndDialog() 함수를 호출하고 그 내부의 이벤트를 처리하지 않습니다 (대화 상자 외부에서 - 이벤트를 닫은 후 - 이벤트를 처리하고 있으므로 대화 상자가 닫히기 시작합니다). 이 좋은 예를 보면, 실제로 포인트를 보여줍니다 : http://msdn.microsoft.com/en-US/library/wddd3ztw(v=vs.80).aspx.

이 메시지 상자를 표시 할 때 OnCancel()을 호출 할 때까지 연락처 이름이 이미 있습니다. 다른 세부 사항이 그에 따라 변경 될 것입니다. "당신은 이미 Add 대화 상자 범위를 벗어나지 않았으므로 주 대화 상자의 OnCancel()이 호출 될 것입니다. 다시 한 번,"Add "클래스 내에 연락처를 저장하는 것을 권할 것입니다. 모든 조건을 검사하고 적절한 작업을 수행하는 "저장"버튼을 처리하십시오. 또한 OnOk() 함수를 재정의 할 수 있지만 기능을 사용할 수 있습니다. "추가"대화 상자 안에 함수를 넣으십시오.

+0

그래, 두려운 것이 문제 였어. 해결 방법으로 편집 상자에서 텍스트를 매개 변수로받는 "예외"함수를 만들었습니다. ; 그것은 기본적으로 "AddContact"함수에 대한 또 다른 호출이지만 편집 상자의 시작 부분에서 설정할 매개 변수를 사용하고, "Exception()"을 호출 한 직후에 복귀가 있으므로 ADD 함수는 끝내기 (계단식으로). 그것은 꽤 아니지만, ADD dialog.cpp에서 모든 것을하려고하면 내 코드의 좋은 부분을 다시 작성해야한다는 것을 의미합니다. 먼저 시도했지만 연락처가 목록 컨트롤에 저장되어 있기 때문에 할 수 없습니다. – RaduPrider