2011-06-27 58 views
3

言語:C++にupdateData MFCで

開発環境:のMicrosoft Visual C++を使用し

ライブラリ:MFC

問題:私は好みの設定アプリケーションを作成しました。左側には、変更可能な設定の「親」カテゴリのリストボックスがあり、クリックすると、変更可能な設定が、多くの大きな環境設定ダイアログのようにリストボックスの右側に表示されます。私はすべてのコントロールをDDXデータ交換でセットアップしています(注:各サブダイアログ/環境設定ページのcppファイルがあります)ので、すべての基本設定があります。

ここは私の問題です。私は、親ダイアログボックスの子であり、ダイアログのピクチャコントロールにバインドされているだけなので、環境設定ダイアログボックスでDoModal()を実際に呼び出すことはないため、UpdateDataを使用するのは苦労しています。ユーザーがリストボックスをクリックすると、フォーカスの設定とサブダイアログの表示/非表示の組み合わせが実行されます。

ユーザーが「これらを保存」を選択すると、保存する(XML構成ファイルを生成する)特定の環境設定ペインを確認できる別のダイアログが表示されます。明らかに私は入力のためにダイアログをスクラップする必要がありますが、プログラムがUpdateDataを呼び出すコードのポイントに達すると、DoModal()を呼び出す前にUpdateDataを呼び出しているのでプログラムが失敗します。

今、値を取得する方法についてはわかりません。それは、私がMFCを非常に新しくしたことにも役立ちません。だからそれがある。とにかく、私は誰でも提供できる助けに感謝します。

答えて

1

CTabCtrlを使用することで、ユーザーエクスペリエンスが向上する可能性があります。これは、実装しているような機能を提供します。一般的に

ますが、これはモーダルダイアログのために保存するようにロードしOnOKするOnInitDialogによって呼び出されたフレームワークの整備士で、ほとんどの場合、直接UpdateDataを呼び出すためのものではありません。これはあなたが考えるかもしれない意味での読み込みと保存ではありません。それは、リソースまたはメンバー変数のコントロール値をOnInitDialogにロードし、ユーザーが[OK]をクリックするとダイアログのコントロールの値をメンバー変数に保存して保存することです。これは、ダイアログを再オープンしたときに以前の値を表示したり、閉じた後に値を取り出すことを可能にするメカニックです。

CArchiveを参照してダイアログをシリアル化することができますが、特にXML設定ファイルを扱う場合は、独自の保存/読み込みフレームワークを作成することをお勧めします。

+0

可能であれば、部分的にUIをやり直す必要はありません。私はそれがUpdateDataを呼び出すことがわかっているので、私のアプリケーションが動作する方法のために、私がやろうとしているものが好きではないので、OnOK()を使って試しました。基本的には、「すべて保存」ボタンと「保存」ボタンがあり、どのサブダイアログが保存されるかを指定します。SaveTheseはチェックボックスでダイアログをポップアップし、どのペインを保存するかを指定できるようになります。このチューザの解約(OnOK)には、情報を保存する必要があります。すべての値を取得する必要があります。サブダイアログでOnOKを呼び出すだけで無駄になりました。 – Jon

+0

コードを見ることなく、各ペインのデータ構造と、関連しないダイアログから保存/ロードするために使用できるこれらのデータ構造のコレクションを持つことができるインターフェイスが必要なように聞こえます。私は、これらのペインがモードレスであると仮定しているため、インターフェイスを使用すると、繰り返し実行できるペインポインターのコレクションを持たせることもできます。 – AJG85

+0

ええと、私はそれを研究しなければならないでしょう...私はあなたが各ペインのためのインターフェイスによって何を意味するか分かりません。私はVisual C++とMFCにはかなり新しいので、これまでのところこれを得るのは難しかったです。助言がありますか?あまりにも多くの時間を費やしたくない... – Jon

3

サブダイアログの1つを表示する直前に、UpdateData(FALSE)関数を呼び出してそのコントロールに値を設定する必要があります。これは、外部ダイアログのOnInitDialog、およびカテゴリを切り替えるコードで行う必要があります。サブダイアログ(カテゴリー変更またはOnOKのいずれか)から切り替える直前にUpdateData(TRUE)を呼び出して、サブダイアログから変更を取り戻す必要があります。 UpdateDataがFALSEを返す場合は、カテゴリを変更したり、ダイアログを閉じることを許可しないでください。

+0

私は2つのテキストフィールドT1とT2を持つフォームを持っています。ユーザーはT1を変更します。 T2には右側に '... 'ボタンがあり、モーダルダイアログを開き、T2を変更します。ユーザーは '...'に行き、OKをクリックします。 T2を更新する必要があります。新しい値をT2関連の変数に代入した後は、T1のユーザーが行った変更が消えるため、私は 'Updatedata(FALSE)'を実行できません。私はこの問題を解決するために2つのアプローチを見ています。 1: 'T2-> SetWindowText(new_text);' 2: 'CDataExchange dx(this、FALSE);'変数を宣言し、T2の 'DDX_Text'だけを実行します。最善のアプローチは何ですか? – sergiol

+0

@sergiol私はT1が親ダイアログの一部だと思いますが、正しいですか?この回答は、T1に影響を及ぼさないT2の子ダイアログで 'UpdateData'を呼び出すことに関するものです。子ダイアログを呼び出したコードは、そのダイアログのデータをテキストコントロールにコピーします。 –