Правильно установите "кнопку отмены" в MessageBox с ID_OKCANCEL; диалог в диалоге
Надеюсь, мое описание прояснит все.
Идея состоит в том, чтобы создать телефонную книгу, которая использует List Control (как отчет), имеет меню и может быть сохранена (во внешний файл), загружена (из одного), и вы можете добавлять новые контакты, редактировать и удалить существующие контакты. Я должен использовать новые диалоги при добавлении и редактировании контактов. Например, у меня есть кнопка меню с именем "добавить контакт", которая открывает новое диалоговое окно с полями редактирования (в которых вы вводите имя, фамилию, номер телефона и т. Д.). Телефонная книга работает, ошибок нет, но хочу сделать ее чуть лучше, функциональнее:
Допустим, у меня уже есть контакт по имени Джон Доу. Если я пытаюсь добавить контакт с именем точно Джона Доу, когда я нажимаю кнопку "Добавить", я задаю программе запрос: "Имя контакта уже существует; другие данные будут изменены соответствующим образом" с помощью параметров "ОК" и "ОТМЕНА". Если я нажимаю ОК, все работает, конечно. Телефон, электронная почта, адрес и группа (это остальная часть информации) изменены. Если я нажму "Отмена", диалоговое окно для "добавления" просто исчезнет, и оно вернется к моему основному диалоговому окну, в котором будет показан список. Это тоже дело кода, но я хочу, чтобы он... ничего не делал. Если я щелкну этот ОТМЕНА, я хочу, чтобы он вернулся в мое "диалоговое окно добавления контакта", но сохраняя поля редактирования уже заполненными, как до того, как я нажал кнопку "добавить". Потому что я могу просто вызвать функцию снова, если нажму кнопку "Отмена", но тогда я получу новый "диалог добавления" с пустыми полями редактирования, а это не совсем то, что я хочу. То же самое происходит, когда я вставляю новый контакт (имя и фамилию), но номер телефона и / или адрес электронной почты, который я указал в полях редактирования, уже существуют. Мол, в сообщении будет сказано: "Номер телефона уже существует"; и если я нажимаю "ОК", он должен просто вернуться в главное диалоговое окно (список, отчет), но если я нажму "ОТМЕНА", я хочу, чтобы он вернулся в "диалоговое окно добавления" с неизмененными полями редактирования (предварительно набранный первым). имя, фамилия, телефон, адрес, электронная почта, группа) без изменений, поэтому я могу просто изменить телефон / электронную почту, которая уже существовала.
Я надеюсь, что вы, ребята, понимаете идею. Я знаю, что это много текста. Кстати, группа выбирается с помощью переключателей, если это имеет значение.
Код для функции вставки приведен ниже; Я попытался перевести переменные на английский сейчас, чтобы их было легче читать (я не являюсь носителем английского языка, извините за возможные ошибки);
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", чтобы остаться черными). Или, по крайней мере, чтобы весь текст был цветным, но текст другого столбца остался черным, по умолчанию. Для поиска я использую обработчик событий из поля ввода, построчно сравниваю текст из поля с каждым столбцом в списке. Если есть совпадение, строка добавляется в новый элемент управления списком, который по умолчанию скрыт, и теперь он появляется впереди. Надеюсь, вы понимаете это. Возможно, я сделаю еще одну тему для этого.
1 ответ
Можете ли вы опубликовать свой класс Add здесь? Я думаю, что вы должны справиться с сохранением контакта внутри класса "Add" CDialog.
Нажатие кнопки "ОК" и вызов функции OnOk() (IDOK) начинает закрывать диалоговое окно. Вы вызываете функцию EndDialog(), нажимая ее, и вы не обрабатываете какие-либо события внутри нее (вы делаете это вне диалога - после закрытия), поэтому диалог начинает закрываться. Посмотрите на этот хороший пример, он действительно показывает суть: http://msdn.microsoft.com/en-US/library/wddd3ztw(v=vs.80).aspx.
К тому времени, когда вы вызываете OnCancel() при отображении этого окна сообщения "" Имя контакта уже существует; другие детали будут изменены соответственно "OnCancel() главного диалога будет вызываться так, как вы уже вышли из области добавления диалога. Еще раз, я бы посоветовал вам обработать сохранение контакта внутри класса" Добавить ". Попробуйте создать функцию обработка кнопки "Сохранить", которая проверит все условия и выполнит соответствующее действие. Вы также можете попробовать переопределить функцию OnOk (), но я бы выбрал эту функцию. Поместите функцию в диалоговое окно "Добавить", чтобы она могла выполнить все необходимые проверки внутри этого экземпляра класса "Добавить".