VC6とVC7.1のDDX/DDV挿入の違い

[戻る]
たかはし 2005/09/08(木) 18:45:08
以下の例は周知な事なのでしょうか?

ダイアログにエディットコントロールを複数置きます。
VC6のClassWizardやVC7.1のコントロール右クリックから
CStringの変数を最大文字長を指定せず追加します。
ソース上には DDX_Text(pDX, ...) が追加されるはずです。
それを複数のエディット分行います。

次に各エディットのCStringに文字数を設定するために
VC6/ClassWizardやVC7.1/コントロール右クリックで最大文字数を設定します。
するとソースには DDV_MaxChars(pDX, ... ) が追加されます。

VC6の場合
    DDX_Text(pDX, IDC_EDIT1, m_sEdit1);
    DDV_MaxChras(pDX, m_sEdit1, 20);
    DDX_Text(pDX, IDC_EDIT2, m_sEdit2);
    DDV_MaxChras(pDX, m_sEdit2, 20);

VC7.1の場合
    DDX_Text(pDX, IDC_EDIT1, m_sEdit1);
    DDX_Text(pDX, IDC_EDIT2, m_sEdit2);
    DDV_MaxChras(pDX, m_sEdit1, 20);
    DDV_MaxChras(pDX, m_sEdit2, 20);

上記のように VC6 では後から文字長を指定しても
DDX と DDV が対になって挿入されます。
VC7.1 の場合は対になりません。

このせいで VC7.1 の場合はエディットの入力文字数制限が効かなくなっていました。

原因がわかってしまえばなんて事はないんですが
わかるまでかなり時間を費やしてしまいました・・・

REE 2005/09/09(金) 10:30:56
>このせいで VC7.1 の場合はエディットの入力文字数制限が効かなくなっていました。
本当にその順番のせいなのですか?
VC7.1のソースの順番を変えてみて試しましたか?

PATIO 2005/09/09(金) 10:40:59
私の場合、指摘されて始めて知りました。
まさかここの並びが影響するとは思ってなかったですね。
確かに.NET2003では指摘されているような現象が起きるみたいです。
上記の場合、IDC_EDIT1の入力制限が効かないみたいですね。
IDC_EDIT2の方は効くみたいなんですが。
ただ、私の場合はDDXやDDVを実際のアプリケーションで使うことがほとんどないので
まったく気が付きませんでした。
アプリケーションの場合はエラー表示やエラー時の動作は独自で構築する事がほとんどなので
DDXやDDVをまず使わないためです。
多分、不具合ではあると思うのでMSには何とかしてほしいところですね。
現状だと一旦、変数を削除して追加しなおすか、手動で修正するしかないようですね。

PATIO 2005/09/09(金) 10:41:58
ちなみにソース上の並びをVC++6にあわせてみたら、
IDC_EDIT1も効くようになりました。

たかはし 2005/09/09(金) 10:44:11
上記のVC7.1の例だとわかりにくいので以下のようにした場合

    DDX_Text(pDX, IDC_EDIT1, m_sEdit1);
    DDX_Text(pDX, IDC_EDIT2, m_sEdit2);
    DDV_MaxChras(pDX, m_sEdit2, 10);
    DDV_MaxChras(pDX, m_sEdit1, 20);

IDC_EDIT1 の入力文字数制限が効かなくなり
IDC_EDIT2 の文字数制限が 10 では無く 20 になります。

なおこれは VC6 でもエディタで順番を入れ替えると同じ現象になります。

たかはし 2005/09/09(金) 10:45:21
>>まさかここの並びが影響するとは思ってなかったですね。

そうなんですよ。並び順で変わってくるなんて・・・

たかはし 2005/09/09(金) 10:50:50
追記です。

私の 10:44:11 の投稿の例の場合で IDC_EDIT1 に 20 文字以上入力し
UpdateData() を通すと 20 文字以内で入力してください と怒られます(^^;

エディットの入力制限は対になってないといけないみたいですが
CString の最大文字数は対になっていなくとも効く様です。

Kerry 2005/09/09(金) 11:22:41
見たところMSDNのKnowledge Baseには上がっていないようですので
MSにバグ報告してみてはいかがでしょうか?

PATIO 2005/09/09(金) 11:26:44
結局、DDVによる入力チェックは直前の一番最後にDDXされたものに対して設定される
という規則みたいですね。DDVが二つ続いても上書きされるだけと。
この辺の管理は、CDataExchangeがやっていそうなので内部的には、上で書いたような
順番でやっているのだろうと推測されますね。
DDXではIDC_EDIT1が渡されているのにDDVではIDC_EDIT1が渡されていないので
識別する手段がなくてこんな動作になっているのかも。
いずれにせよ、順番が依存するような実装なのであれば、
.NET2003側を直すべきでしょうね。
たかはしさん、MSに報告しませんか。
既に報告済みの事例でも声が多い方がMSも動きやすそうだし。

たかはし 2005/09/09(金) 15:57:37
[[解決]]
.NET2003側の不具合の可能性が高いと言うことで解決とさせていただきます。
MSへのバグ報告も窓口を見つけ次第やってみたいと思います。
ありがとうございました。

古いスレッドには追加発言できません。