Правильно установите "кнопку отмены" в 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 (), но я бы выбрал эту функцию. Поместите функцию в диалоговое окно "Добавить", чтобы она могла выполнить все необходимые проверки внутри этого экземпляра класса "Добавить".

Другие вопросы по тегам