使用UpdateData(true)为什么会运行出错?

xiaoyaox044 2008-05-11 09:15:53
在一个对话框的控件中定义了一个消息响应函数,

里面用UpdateData(true)来刷新控件对应的变量,

但运行总是出错,该内存不能为“read”云云。。。

通过调试可以确定就是运行到这一句时出错的。
...全文
804 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuliyong1990 2011-06-08
  • 打赏
  • 举报
回复
8楼答案有效,顶!非常感谢!
xiaoyaox044 2008-05-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 jennyvenus 的回复:]
用控件型的方便。
[/Quote]
如果实在是解决不了,也只能这样了
菜牛 2008-05-12
  • 打赏
  • 举报
回复
贴出代码来看。

在有些控件消息中调用UpdateData会造成错误,这是消息机制和数据交换机制冲突引起的。
用户 昵称 2008-05-12
  • 打赏
  • 举报
回复
用控件型的方便。
xiaoyaox044 2008-05-12
  • 打赏
  • 举报
回复
    DDX_Text(pDX, IDC_EDIT_21_1, m_edit_21_1);
DDX_Text(pDX, IDC_EDIT_21_2, m_edit_21_2);
DDX_Text(pDX, IDC_EDIT_21_3, m_edit_21_3);
DDX_Text(pDX, IDC_EDIT_21_4, m_edit_21_4);


经过调试,其中四个关联编辑框的变量更新时会出错,只有都删了才运行成功

问题是出在编辑框吗?
xiaoyaox044 2008-05-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 kugou123 的回复:]
DoDataExchange 看看控件和变量的映射是否有问题。


ON_EN_KILLFOCUS(IDC_EDIT_21_1, OnKillfocusEdit211)

看看IDC_EDIT21_1这个空间是否还存在,或者后面的OnKillfocusEdit211这个函数是否已经在代码中被删除或注释?
[/Quote]
这些问题似乎都没有诶,太诡异了
kugou123 2008-05-12
  • 打赏
  • 举报
回复
DoDataExchange 看看控件和变量的映射是否有问题。



ON_EN_KILLFOCUS(IDC_EDIT_21_1, OnKillfocusEdit211)

看看IDC_EDIT21_1这个空间是否还存在,或者后面的OnKillfocusEdit211这个函数是否已经在代码中被删除或注释?
xiaoyaox044 2008-05-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wuzongman 的回复:]
删除这个试试
ON_EN_KILLFOCUS(IDC_EDIT_21_1, OnKillfocusEdit211)
[/Quote]
删了这句出错行所在的响应函数就不会被执行了,这有什么意义呢?
xiaoyaox044 2008-05-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zgl7903 的回复:]
在DoDataExchange()中设置个断点调试一下
[/Quote]

DDX_Control(pDX, IDC_LIST_21, m_list_21);
DDX_Control(pDX, IDC_COMBO_21_2, m_combo_21_2);
DDX_Control(pDX, IDC_COMBO_21_1, m_combo_21_1);
DDX_DateTimeCtrl(pDX, IDC_DATETIME_21, m_datetime);
DDX_Text(pDX, IDC_EDIT_21_1, m_edit_21_1);
DDX_Text(pDX, IDC_EDIT_21_2, m_edit_21_2);
DDX_Text(pDX, IDC_EDIT_21_3, m_edit_21_3);
DDX_Text(pDX, IDC_EDIT_21_4, m_edit_21_4);


按你说的,我发现最后四个关联编辑框的变量更新时会出错,只有都删了才运行成功

但这四个编辑框都是存在的,为什么有这种情况?
izardMan 2008-05-12
  • 打赏
  • 举报
回复
删除这个试试
ON_EN_KILLFOCUS(IDC_EDIT_21_1, OnKillfocusEdit211)
zgl7903 2008-05-12
  • 打赏
  • 举报
回复
在DoDataExchange()中设置个断点调试一下
xiaoyaox044 2008-05-12
  • 打赏
  • 举报
回复
CDlg21::OnKillfocusEdit211() 里包含了出错行,这是当某个编辑框丢失输入焦点时的消息响应函数。
xiaoyaox044 2008-05-12
  • 打赏
  • 举报
回复
代码作了简化,还是会出错的:

// Dlg21.cpp : implementation file
//

#include "stdafx.h"
#include "storagemanage.h"
#include "Dlg21.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlg21 dialog


CDlg21::CDlg21(CWnd* pParent /*=NULL*/)
: CDialog(CDlg21::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlg21)
m_datetime = 0;
m_edit_21_1 = _T("");
m_edit_21_2 = _T("");
m_edit_21_3 = _T("");
m_edit_21_4 = 0;
//}}AFX_DATA_INIT

m_AdoConn.OnInitADOConn(); // 连接数据库
}


void CDlg21::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlg21)
DDX_Control(pDX, IDC_LIST_21, m_list_21);
DDX_Control(pDX, IDC_COMBO_21_2, m_combo_21_2);
DDX_Control(pDX, IDC_COMBO_21_1, m_combo_21_1);
DDX_DateTimeCtrl(pDX, IDC_DATETIME_21, m_datetime);
DDX_Text(pDX, IDC_EDIT_21_1, m_edit_21_1);
DDX_Text(pDX, IDC_EDIT_21_2, m_edit_21_2);
DDX_Text(pDX, IDC_EDIT_21_3, m_edit_21_3);
DDX_Text(pDX, IDC_EDIT_21_4, m_edit_21_4);
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlg21, CDialog)
//{{AFX_MSG_MAP(CDlg21)
ON_EN_KILLFOCUS(IDC_EDIT_21_1, OnKillfocusEdit211)
ON_BN_CLICKED(IDC_BTN_21_ADD, OnBtn21Add)
ON_BN_CLICKED(IDC_BTN_21_CANCEL, OnBtn21Cancel)
ON_BN_CLICKED(IDC_BTN_21_OK, OnBtn21Ok)
ON_BN_CLICKED(IDC_BTN_21_EDIT, OnBtn21Edit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlg21 message handlers

BOOL CDlg21::OnInitDialog()
{
CDialog::OnInitDialog();

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

CDlg21::~CDlg21()
{
// 断开与数据库的连接
m_AdoConn.ExitConnect();
}



void CDlg21::OnKillfocusEdit211()
{
// TODO: Add your control notification handler code here


_bstr_t vSQL;
_RecordsetPtr m_pRecordSet;

UpdateData(true); //出错行

if(0!=m_edit_21_1.Compare(""))
{
vSQL = "select * from 入库信息 where 入库单号='"+m_edit_21_1+"'";
m_pRecordSet = m_AdoConn.GetRecordSet(vSQL);
if(!m_pRecordSet->adoEOF)
{
GetDlgItem(IDC_EDIT_21_1)->SetFocus();
}
}

}

void CDlg21::SetEnableWindow(bool IsEnable)
{

}

void CDlg21::OnBtn21Add()
{

}


void CDlg21::OnBtn21Cancel()
{

}

void CDlg21::OnBtn21Ok()
{

}

void CDlg21::OnBtn21Edit()
{

}

Eleven 2008-05-12
  • 打赏
  • 举报
回复
up
Quebradawill 2008-05-12
  • 打赏
  • 举报
回复
学习
方舟20 2008-05-11
  • 打赏
  • 举报
回复
同意一楼答案,出现错误提示框时按“重试”然后按F7键。Rebuild All再看看。
yebeans 2008-05-11
  • 打赏
  • 举报
回复
vc里面可以看,调试的时候你找找菜单,版本不同地方不一样,具体忘记了哪一项了。
xiaoyaox044 2008-05-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yebeans 的回复:]
你看一下报错时的函数堆栈,看是在哪个地方。UpdateData里面很多层的。
[/Quote]
函数堆栈,不会弄啊
yebeans 2008-05-11
  • 打赏
  • 举报
回复
你看一下报错时的函数堆栈,看是在哪个地方。UpdateData里面很多层的。
xiaoyaox044 2008-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dianhui 的回复:]
看看你给控件添加的对应变量是否还在!
如果还找不到原因,就把每个控件所映射的变量删除再重新添加一次!
[/Quote]
试过了,还是不行啊
加载更多回复(3)

16,466

社区成员

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

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

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