none
ダイアログUpdateData()で別のコントロールの値に更新されてしまう RRS feed

  • 質問

  • いつもお世話になっております。

    VS2015UD2で作業しております。

    Releaseにて出力したアプリを、Win10、Win8.1のそれぞれ一部のマシンで、表題のようにあるダイアログでDoDataExchange()で定義してあるコントロールと変数が、UpdateData()で別のEditコントロールの値に更新されてしまいます。
    そのダイアログにはいくつものEditコントロールを使用していますが、現象がでるのは一部です。しかも小数点以下の値をとってきます。

    インストーラではVS2015ランタイムなど、配布すべきものは配布しているつもりですが、、。


    class CSMenuPage3 : public CPropertyPage
    {
    	DECLARE_DYNCREATE(CSMenuPage3)
    	enum { IDD = IDD_SMENU3 };
    	float	m_H;
    	float	m_W;
    	float	m_Gap;
    	float	m_Ang;
    	float	m_Dh;
    ...
    	protected:
        afx_msg void OnGap();
    ...
    }
    
    CSMenuPage3::CSMenuPage3() : CPropertyPage(CSMenuPage3::IDD)
    {
    	//{{AFX_DATA_INIT(CSMenuPage3)
    	m_H   = 0.0;
    	m_W   = 0.0;
    	m_Gap = 0.0;
    	m_Ang = 0.0;
    	m_Dh  = 0.0;
    	m_PuncFig = true;
    	m_Fn = 0;
    	m_Dh2 = 0.0;
    	m_BFlag = true;
    	m_SAngView = true;
    	//}}AFX_DATA_INIT
    }
    
    
    void CSMenuPage3::DoDataExchange(CDataExchange* pDX)
    {
    	CPropertyPage::DoDataExchange(pDX);
    
    	//{{AFX_DATA_MAP(CSMenuPage3)
    	DDX_Text(pDX, IDC_EDIT1, m_H);
    	DDV_MinMaxFloat(pDX, m_H, 0.01f, 99999.f);
    	DDX_Text(pDX, IDC_EDIT2, m_W);
    	DDV_MinMaxFloat(pDX, m_W, 0.01f, 99999.f);
    	DDX_Text(pDX, IDC_EDIT3, m_Gap);
    	DDV_MinMaxFloat(pDX, m_Gap, -99999.f, 99999.f);
    	DDX_Text(pDX, IDC_EDIT4, m_Ang);
    	DDV_MinMaxFloat(pDX, m_Ang, -45.f, 45.f);
    	DDX_Text(pDX, IDC_EDIT5, m_Dh);
    	DDV_MinMaxFloat(pDX, m_Dh, 0.f, 200.f);
    	DDX_Check(pDX, IDC_PUNCFIG, m_PuncFig);
    	DDX_Text(pDX, IDC_EDIT7, m_Fn);
    	DDV_MinMaxInt(pDX, m_Fn, 0, 8);
    	DDX_Text(pDX, IDC_EDIT6, m_Dh2);
    	DDV_MinMaxFloat(pDX, m_Dh2, 0.f, 200.f);
    	DDX_Check(pDX, IDC_BFONT, m_BFlag);
    	DDX_Check(pDX, IDC_ANGVIEW, m_SAngView);
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CSMenuPage3, CPropertyPage)
    	//{{AFX_MSG_MAP(CSMenuPage3)
    	ON_EN_CHANGE(IDC_EDIT3, OnGap)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    void CSMenuPage3::OnGap() 
    {
    	char mbuf[256];
    	sprintf(mbuf, "0 m_Gap = %f", m_Gap);
    	MessageBox(mbuf); //更新前
    
    	UpdateData();
    
    	sprintf(mbuf, "UpdateData() m_Gap = %f", m_Gap);
    	MessageBox(mbuf); //更新されない
    }
    

    this->GetDlgItem(IDC_EDIT3)->UpdateData();
    と明示的に指定しても結果は同じです。

    配布物が足りないのか設定がおかしいのか、ターゲットやmfcのdllの存在など確かめましたが特に悪いように感じるところもなく、問題発生しないマシンもあるので検討がつきません。

    ご教示いただきたく、どうぞ宜しくお願いいたします。

    2016年5月14日 6:17

回答

すべての返信

  • こちらでも同様な問題が報告されておりました。

    http://ja.stackoverflow.com/questions/16592/vc2015%E3%81%A7-double%E5%A4%89%E6%95%B0ddx-text%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB

    https://connect.microsoft.com/VisualStudio/feedback/details/1773279/bug-in-sntscanf-s

    マクロソフトではこのバグを把握しているということですので、アップデートで修正されると思われます。

    現在のところはDDX_Textの処理を自分で書き直しする方法しかないかもしれません。


    • 編集済み kenjinoteMVP 2016年5月14日 6:37
    • 回答としてマーク SHIN109 2016年5月14日 7:24
    2016年5月14日 6:37
  • kenjinote 様

    レスありがとうございます。

    やはり未だ改善されていないということですね。
    UD1以前での報告で、普通に使用される処理だから当然プライオリティ高く修正されていると思っておりましたが、、。

    自前DDX_Text、頑張ってみます。

    ありがとうございました。
    2016年5月14日 7:23
  • kenjinoteさんがコメントされていますがもう少し詳しく

    http://ja.stackoverflow.com/a/16697/4236 のコメントで挙げられているコードを試してみてください。手元のVisual Studio 2015 Update2の環境ではおおよそ修正されています。具体的には

    • Target Platform Version 8.1、static link 未修正
    • Target Platform Version 8.1、dynamic link 修正済み
    • Target Platform Version 10.0.10586.0、static link 修正済み
    • Target Platform Version 10.0.10586.0、dynamic link 修正済み

    のようです。

    DLLの確認などされているようですが、そもそもコンパイルオプションが不適切で最新のDLLを使用されていないということはありませんか?

    • 回答の候補に設定 佐祐理 2016年5月20日 4:18
    2016年5月14日 23:37
  • 佐祐理 様

    レスありがとうございました。返事遅くなりすみません。

    10586での修正済みを確認いたしました。
    無事動作し安心いたしました。

    ありがとうございました。
    2016年5月20日 2:12