0

私の説明がすべてをより明確にすることを願っています。

リスト コントロール (レポートとして) を使用し、メニューがあり、(外部ファイルに) 保存したり (外部ファイルから) ロードしたり、新しい連絡先を追加したり、編集したり、既存の連絡先を削除します。連絡先を追加および編集するときに、新しいダイアログを使用する必要があります。同様に、「連絡先を追加」という名前のメニュー ボタンがあり、編集ボックス (名、姓、電話番号などを入力する) を含む新しいダイアログが開きます。電話帳は機能し、エラーはありませんが、もう少し機能的に改善したいと考えています。

John Doe という名前の連絡先が既にあるとします。John Doe という正確な名前の連絡先を追加しようとすると、[追加] ボタンをクリックすると、[OK] および [キャンセル] オプションを使用して、「連絡先名は既に存在します。その他の詳細はそれに応じて変更されます」と尋ねるようにプログラムを設定します。もちろん、[OK] をクリックすると、すべてが機能します。電話、電子メール、アドレス、およびグループ (残りの情報) が変更されます。[キャンセル] をクリックすると、「追加」のダイアログが消えて、リストを表示するメイン ダイアログに戻ります。それはコードのことでもありますが、私はそれを望んでいます...何もしません。そのキャンセルをクリックすると、「連絡先の追加ダイアログウィンドウ」に戻りたいのですが、「追加」ボタンを押す前のように、編集ボックスをすでに完成させたままにします。キャンセルをクリックすれば関数を再度呼び出すことができるので、しかし、そのようにして、空の編集ボックスを備えた新しい「追加ダイアログ」を取得するだけで、それは本当に私が望むものではありません。新しい連絡先 (姓名) を挿入したときに同じことをしたいのですが、編集ボックスに設定した電話番号や電子メールが既に存在します。同様に、「電話番号は既に存在します」というメッセージが表示されます。「OK」をクリックすると、メインダイアログ(リスト、レポート)に戻るだけですが、「キャンセル」をクリックすると、変更されていない編集ボックス(入力前の最初の名前、姓、電話、住所、電子メール、グループ) は変更されていないため、既存の電話/電子メールのみを編集できます。新しい連絡先 (姓名) を挿入したときに同じことをしたいのですが、編集ボックスに設定した電話番号や電子メールが既に存在します。同様に、「電話番号は既に存在します」というメッセージが表示されます。「OK」をクリックすると、メインダイアログ(リスト、レポート)に戻るだけですが、「キャンセル」をクリックすると、変更されていない編集ボックス(入力前の最初の名前、姓、電話、住所、電子メール、グループ) は変更されていないため、既存の電話/電子メールのみを編集できます。新しい連絡先 (姓名) を挿入したときに同じことをしたいのですが、編集ボックスに設定した電話番号や電子メールが既に存在します。同様に、「電話番号は既に存在します」というメッセージが表示されます。「OK」をクリックすると、メインダイアログ(リスト、レポート)に戻るだけですが、「キャンセル」をクリックすると、変更されていない編集ボックス(入力前の最初の名前、姓、電話、住所、電子メール、グループ) は変更されていないため、既存の電話/電子メールのみを編集できます。

皆さんがその考えを理解してくれることを願っています。私はそれがたくさんのテキストであることを知っています。ちなみに、グループはラジオボタンで選択します。

挿入関数のコードは次のとおりです。今のところ変数を英語に翻訳しようとしたので、読みやすくなっています (私は英語を母国語としないため、間違いがあった場合は申し訳ありません)。

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);
    }
}

// ここで、もう 1 つの質問 (二次) です。誰かがそれを知っていて、ランダムにここに入力します。

「入力と同時に検索」オプションを作成する必要があります。私はそれをしました。ただし、見つかったテキストにも色を付ける必要があります。「Jo」を検索していて、「John」と「Joanne」があると仮定すると、それらの行 (すべての列、情報、見つかった名前に固有) のみが表示されます。問題ありません、私はそれをしました。しかし、ジョンとジョアンのジョーだけを色付け/太字/強調する方法はありますか? Jo-es の赤と残りの部分を取得します ('hn' と 'anne' は黒のままです)。または、少なくともテキスト全体に色を付けますが、他の列のテキストはデフォルトで黒のままにします。検索には、編集ボックスのイベント ハンドラーを使用し、ボックスのテキストをリストのすべての列と 1 行ずつ比較します。一致する場合、その行はデフォルトで非表示になっている新しいリスト コントロールに追加され、前面に表示されます。これを理解してください。

4

1 に答える 1

0

Add クラスをここに投稿できますか? 「追加」CDialogクラス内で連絡先を保存する必要があると思います。

[OK] ボタンを押して OnOk() (IDOK) 関数を呼び出すと、ダイアログ ウィンドウのクローズが開始されます。EndDialog() 関数を押して呼び出しており、その内部でイベントを処理していないため (ダイアログを閉じた後、ダイアログの外側で実行しています)、ダイアログが閉じ始めます。この素敵な例を確認してください。それは本当に要点を示しています: http://msdn.microsoft.com/en-US/library/wddd3ztw(v=vs.80).aspx .

このメッセージ ボックスを表示するときに OnCancel() を呼び出すまでに、""連絡先名は既に存在します。他の詳細はそれに応じて変更されます」メイン ダイアログの OnCancel() は、既に [追加] ダイアログ スコープを離れているため、呼び出されます。もう一度、「追加」クラス内で連絡先の保存を処理することをお勧めします。関数を作成してみてください。すべての条件をチェックして適切なアクションを実行する「保存」ボタンを処理する. OnOk() 関数をオーバーライドすることもできますが、私は関数を使います. 関数を「追加」ダイアログボックス内に配置して、それができるようにします. 「Add」クラスのこのインスタンス内で必要なすべてのチェックを実行します。

于 2013-06-01T18:50:20.323 に答える