感觉vc2015有bug,edit框赋值不变,updatedata后值自动变化

tiger波波 2019-12-18 02:17:54
环境:
win7 x64 + vs2015专业版64位,创建的MFC工程。


现象如下:
给对话框(CConfigDlg)添加新的edit框(standard(mm) )并绑定double类型的变量后,运行程序,在上一个edit框(compensation)内的值不变的情况下,执行UpdateData(TRUE);,compensation edit框绑定的值出现了变化。

条件:
(1)compensation edit框里的数字为0的时候,0.0或其他数值都没问题
(2)release版,x64平台

感觉不清楚的话请下载代码:https://github.com/tigerbobo/public
1,把ConfigDlg.cpp第40行的注释去掉,选择release版,x64平台,编译。
2,运行CircleMeasuring.exe, config.ini是配置文件,在CircleMeasuring\x64\Release下,功能就是通过界面修改配置文件。

操作步骤
1,选择菜单


2,界面显示当前配置文件的值,不做任何修改,点击OK


3,弹出对话框,显示UpdateData(TRUE)前变量的值:0.000(这是对的)


4,显示UpdateData(TRUE)后变量的值:错误


把ConfigDlg.cpp第40行的注释加上,解除绑定,则一切正常


编译配置


OK按钮代码如下:

void CConfigDlg::OnBnClickedBOk()
{
// TODO: Add your control notification handler code here
CString str;

str.Format(_T("%f"), m_compensation);
AfxMessageBox(str);

UpdateData(TRUE);

str.Format(_T("%f"), m_compensation);
AfxMessageBox(str);

m_config.m_auto_identification = m_auto_identification;
m_config.m_black_background = m_black_background;

m_config.m_color_threshold = m_color_threshold;

m_config.m_target_length = m_target_length;
m_config.m_length_per_pixel = m_length_per_pixel;
m_config.m_compensation = m_compensation;

m_config.set_config(_T("config.ini"));

OnOK();
}
...全文
534 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiger波波 2019-12-24
  • 打赏
  • 举报
回复
引用 30 楼 luj_1768 的回复:
问题出在命名上,standard可能有专用语意。0和0.0的区别在于0有可能被理解为null。
一开始起的名字是m_standard,后来觉着名字可能有问题,改成m_standard_length了。 控件绑定double后,显示的时候,0.00自动显示成0
香菜不加葱 2019-12-23
  • 打赏
  • 举报
回复
小白表示看不懂,一脸懵逼
是小七 2019-12-23
  • 打赏
  • 举报
回复
好牛啊啊啊啊
hsk1129 2019-12-23
  • 打赏
  • 举报
回复
Zxdfgh 我测试一下,看看能说话吗
ming520sen 2019-12-22
  • 打赏
  • 举报
回复
没有积分。 但是很需要makecab.exe 这个软件 谁愿意给我发一个呢 谢谢哈
forest502@163.com

我几年前编写的 C# 程序过期了 很困恼 觉得很难弄这个证书 帖子也看过了
还请高手指点哈

总不会重新建立1个程序 然后代码一页页复制吧 希望懂的人帮忙一下边哈

很喜欢做的一个财务管理系统 代码简单 就是证书困惑了 过期了呢
luj_1768 2019-12-21
  • 打赏
  • 举报
回复
问题出在命名上,standard可能有专用语意。0和0.0的区别在于0有可能被理解为null。
schlafenhamster 2019-12-20
  • 打赏
  • 举报
回复
调用
//}}AFX_DATA_MAP
DDX_DoubleEdit(pDX, IDC_EDIT6,m_dbEdit);
schlafenhamster 2019-12-20
  • 打赏
  • 举报
回复
例子
// Custom Exchange
void DDX_DoubleEdit(CDataExchange *pDX, int id, double &dbEdit)
{
CWnd *ctl=pDX->m_pDlgWnd->GetDlgItem(id);
CString str;
if (pDX->m_bSaveAndValidate)
{
ctl->GetWindowText(str);
dbEdit = (double)atof((LPSTR)(LPCSTR)str);
}
else
{
str.Format(_T("%8.3f"),dbEdit);
ctl->SetWindowText(str);
}
}
zgl7903 2019-12-20
  • 打赏
  • 举报
回复
在UpdateData(TRUE) 之前先设置一个断点, F5 调试运行, 界面填写数据, 点击OK, 在停到UpdateData时, 添加数据断点 &m_compensation (4字节), 然后继续运行, 被修改时就会弹窗提示,看调用堆栈,逐级分析
schlafenhamster 2019-12-20
  • 打赏
  • 举报
回复
[url=https://www.cnblogs.com/dongzhiquan/archive/2010/08/22/1994573.html]
schlafenhamster 2019-12-20
  • 打赏
  • 举报
回复
能不能 写一个 自己的 DDX_Text
tiger波波 2019-12-20
  • 打赏
  • 举报
回复
引用 10 楼 zgl7903 的回复:
DDX_Text之前设置断点, 单步调试进入看下
跟不出来,因为只是一句UpdateData(TRUE)造成的,没有详细的源代码,有限的代码也是一进来变量就变了,所以我才怀疑出bug了。
chixiang1111 2019-12-20
  • 打赏
  • 举报
回复
看看m_standard_length的定义。
schlafenhamster 2019-12-20
  • 打赏
  • 举报
回复
AfxTextFloatFormat 出错?
自己写 的 不要 这个
tiger波波 2019-12-20
  • 打赏
  • 举报
回复
引用 23 楼 fuck_csdn_mother 的回复:
试了一个下午,发现是平台工具集版本的问题,我电脑上只有vs2013和2017,2013怎么弄都没问题,2017如果使用默认的v141工具集编译,该bug会出现,使用v120编译则不会,调试发现是DDX_Text(pDX, IDC_E_COMPENSATION, m_compensation);这句造成的,跟踪进去,到这个函数AfxTextFloatFormat引起的,不过奇怪的是,我把这个函数里面的代码拷贝出来运行却没问题
多谢帮助。奇怪的是去掉DDX_Text(pDX, IDC_E_STANDARD_LENGTH, m_standard_length);后就没问题了,加上以后才出问题。一般都是前边影响后边,现在是后边影响前边
fuck_csdn_mother 2019-12-20
  • 打赏
  • 举报
回复
void AFXAPI AfxTextFloatFormat(CDataExchange* pDX, int nIDC, void* pData, double value, int nSizeGcvt) { ASSERT(pData != NULL); pDX->PrepareEditCtrl(nIDC); HWND hWndCtrl; pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl); const int TEXT_BUFFER_SIZE = 400; TCHAR szBuffer[TEXT_BUFFER_SIZE]; // 这里跟踪进去就是0.0069039380017830001 if (pDX->m_bSaveAndValidate) { ::GetWindowText(hWndCtrl, szBuffer, _countof(szBuffer)); double d; // 这里也是0.0069039380017830001 if (_sntscanf_s(szBuffer, _countof(szBuffer), _T("%lf"), &d) != 1) //运行完这句变成6903938001783.000 { AfxMessageBox(AFX_IDP_PARSE_REAL); pDX->Fail(); // throws exception } if (nSizeGcvt == FLT_DIG) *((float*)pData) = (float)d; else *((double*)pData) = d; // 绑定的值修改为6903938001783.000 } else { ATL_CRT_ERRORCHECK_SPRINTF(_sntprintf_s(szBuffer, _countof(szBuffer), _countof(szBuffer) -1, _T("%.*g"), nSizeGcvt, value)); AfxSetWindowText(hWndCtrl, szBuffer); } }
fuck_csdn_mother 2019-12-20
  • 打赏
  • 举报
回复
试了一个下午,发现是平台工具集版本的问题,我电脑上只有vs2013和2017,2013怎么弄都没问题,2017如果使用默认的v141工具集编译,该bug会出现,使用v120编译则不会,调试发现是DDX_Text(pDX, IDC_E_COMPENSATION, m_compensation);这句造成的,跟踪进去,到这个函数AfxTextFloatFormat引起的,不过奇怪的是,我把这个函数里面的代码拷贝出来运行却没问题
tiger波波 2019-12-20
  • 打赏
  • 举报
回复
引用 20 楼 vcf_reader 的回复:
没用过这个版本,不过VS出BUG也不奇怪。 我在2008版就遇到过比这个更奇怪的bug,自动生成的代码,没有用手键入任何一句代码、一个符号,居然编译还出错。 事情是大致这样的: vc2008生成一个对话框程序,添加listview控件,给这个控件添加鼠标相应函数(左键、邮件、双击不限),自始至终没有手动键入任何代码,编译出错。
我以前也有几次怀疑vs出bug,不过后来都证明自己的代码有问题,就感觉vs还是挺好的,就这次代码上实在没啥怀疑的地方,就是最基础的edit控件应用。
tiger波波 2019-12-20
  • 打赏
  • 举报
回复
引用 20 楼 vcf_reader 的回复:
没用过这个版本,不过VS出BUG也不奇怪。 我在2008版就遇到过比这个更奇怪的bug,自动生成的代码,没有用手键入任何一句代码、一个符号,居然编译还出错。 事情是大致这样的: vc2008生成一个对话框程序,添加listview控件,给这个控件添加鼠标相应函数(左键、邮件、双击不限),自始至终没有手动键入任何代码,编译出错。
你这种情况应该是安装的有问题吧
加载更多回复(13)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧