トップ回答者
ダイアログUpdateData()で別のコントロールの値に更新されてしまう

質問
-
いつもお世話になっております。
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の存在など確かめましたが特に悪いように感じるところもなく、問題発生しないマシンもあるので検討がつきません。
ご教示いただきたく、どうぞ宜しくお願いいたします。
回答
-
こちらでも同様な問題が報告されておりました。
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
すべての返信
-
こちらでも同様な問題が報告されておりました。
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
-
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