hur.cn - 华软网

 热门搜索

在动态创建的CEdit中使用GetWindowTextW函数程序崩溃

  作者:未知    来源:网络    更新时间:2011/8/13
for( int i = 0; i < index; i++ )
   m_editCtrl[ i ].GetWindowTextW ( m_str[ i ] );
动态创建了10个CEdit,在模式对话框中输入内容,点确定后一次读取每个编辑框中的内容,但是这个一执行程序就崩溃了,是什么原因?
---华软 网友回答---
m_editCtrl[ i ]这个有效吗?
---华软网友回复---
有啊,这个m_editCtrl[10]是在类中声明的,是不是模式对话框消失了他们也就被销毁了,因为我看异常里面有个ASSERT( ::IsWindow( m_hwnd )这个报错
---华软网友回复---
你给的代码太少了,按你的代码来看,m_editCtrl应该是CEdit类变量,关键是这个变量对应的控件它实际存在吗?有没有被释放掉?
---华软网友回复---
用debug方式执行,崩溃时进入断点,找到崩溃的语句,再查看相关变量,如edit空间的m_hWnd的句柄是否有效,等等。
---华软网友回复---
m_editCtrl[ count ].Create( ... ); 这个是在OnInitDialog中用for循环10次创建的
然后声明一个这个类的变量Dlg,然后
if( IDOK == Dlg.DoModal() )
{
   for( int i = 0; i < index; i++ )
       m_editCtrl[ i ].GetWindowTextW ( m_str[ i ] );
}
---华软网友回复---
当然声明Dlg变量是在视图类中
---华软网友回复---
if( IDOK == Dlg.DoModal() )
=========
DoModal会阻塞住,当你关闭对话框之后才能继续下去,但是,此时对话框已经销毁了,GetWindowTextW当然会出错。
---华软网友回复---
那我怎么获取我在CEdit中的数据呢?
---华软网友回复---
我改成无模式对话框还是一样的
---华软网友回复---
引用 9 楼 x309374055 的回复:
我改成无模式对话框还是一样的

你的意思是对话框没有被销毁,这些EDIT也存在,结果还是出错吗?
---华软网友回复---
无模式对话框点了确定只是隐藏,这些Edit应该存在啊,因为他们是对话框类的成员,对话框对象还在,他们也应该在,结果就是不对
---华软网友回复---
引用 11 楼 x309374055 的回复:
无模式对话框点了确定只是隐藏,这些Edit应该存在啊,因为他们是对话框类的成员,对话框对象还在,他们也应该在,结果就是不对

晕!
---华软网友回复---
引用 12 楼 wltg2001 的回复:
引用 11 楼 x309374055 的回复:
无模式对话框点了确定只是隐藏,这些Edit应该存在啊,因为他们是对话框类的成员,对话框对象还在,他们也应该在,结果就是不对

晕!

可能这个关系当时没学好,给解释下
怎么样可以点确定后得到CEdit中的值
---华软网友回复---
如果你非要在对话框不显示时得到这些东西的话,你可以给对话框定义一个CString 数组m_str,然后给那个按钮加一个处理函数,在这个函数里用上面的代码,那么关闭对话框之前就得到你要的东西。
你可以在别的地方用对话框类对象来访问m_str得到你要的东西。
---华软网友回复---
好吧,看来也只有这样了
---华软网友回复---
引用 14 楼 wltg2001 的回复:
如果你非要在对话框不显示时得到这些东西的话,你可以给对话框定义一个CString 数组m_str,然后给那个按钮加一个处理函数,在这个函数里用上面的代码,那么关闭对话框之前就得到你要的东西。
你可以在别的地方用对话框类对象来访问m_str得到你要的东西。

还是不行啊,在对话框上加了一个按钮,放入
for( int i = 0; i < index; i++ )
   m_editCtrl[ i ].GetWindowTextW ( m_str[ i ] );代码
在对话框上点这个按钮就崩了,这个时候对话框还在的。
---华软网友回复---
引用 16 楼 x309374055 的回复:
引用 14 楼 wltg2001 的回复:

如果你非要在对话框不显示时得到这些东西的话,你可以给对话框定义一个CString 数组m_str,然后给那个按钮加一个处理函数,在这个函数里用上面的代码,那么关闭对话框之前就得到你要的东西。
你可以在别的地方用对话框类对象来访问m_str得到你要的东西。

还是不行啊,在对话框上加了一个按钮,放入
for( int i = 0; i < i……

你加在哪个对话框上了?你应该加在有EDIT的对话框上。
---华软网友回复---
嗯,就是加在有Edit的对话框上的
---华软网友回复---
改成模式对话框了,在模式对话框上加的按钮来处理的
---华软网友回复---
多贴出点代码出来看看。
---华软网友回复---
这个是CDLGADDFEATURE::OnInitDialog()中的
C++">
int i(0),count(0);
int Width, Height;
int LineHeight, LineWidth;
CRect WndRect;

GetClientRect( &WndRect );
Height = WndRect.Height ();
Width = WndRect.Width ();
int linenum = index / 3 + index % 3;
LineHeight = WndRect.Height () / linenum;
LineWidth = WndRect.Width () / 3;

for( i = 0; i < 3; i++ )
{
   for( int j = 0; j < linenum; j++ )
   {
m_static[ count ].Create ( m_pstrFields[ count ] + L":", WS_CHILD|WS_VISIBLE|SS_CENTER, CRect( i * LineWidth + 5, j * LineHeight, i * LineWidth + 90, j * LineHeight + 20  ), this );
m_editCtrl[ count ].Create( ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,CRect( i * LineWidth + 85, j * LineHeight, i * LineWidth + 270, j * LineHeight + 20 ), this, count );
count++;
   }
if( count == index - 1 ) break;
}


C++">
CDLGADDFEATURE DlgAF;
if( IDOK == DlgAF.DoModal () )
   {

   }


这个是加在模式对话框上的一个按钮
C++">
void CDLGADDFEATURE::OnBnClickedButton1()
{
   for( int i = 0; i < index; i++ )
m_editCtrl[ i ].GetWindowTextW ( m_str[ i ] );
}

一点这个按钮就崩了
---华软网友回复---
引用 5 楼 x309374055 的回复:
m_editCtrl[ count ].Create( ... ); 这个是在OnInitDialog中用for循环10次创建的
然后声明一个这个类的变量Dlg,然后
if( IDOK == Dlg.DoModal() )
{
  for( int i = 0; i < index; i++ )
  m_editCtrl[ i ].GetWindowTextW ( m_str[ i ] ……



i等于几时,程序崩溃??
---华软网友回复---
等于0的时候就崩溃!
---华软网友回复---
给每一个m_editCtrl[ i ]设置个初始值,试一下看看!
m_editCtrl[ i ]..SetWindowTextW()
---华软网友回复---
这样没问题,就是读的时候有问题
---华软网友回复---
m_editCtrl[ count ].Create( ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,CRect( i * LineWidth + 85, j * LineHeight, i * LineWidth + 270, j * LineHeight + 20 ), this, count );   

你换ID号看看,感觉ID号从0开始有问题,你换大一点。 我观察我们自己放的控件ID VC都是1000开始的,可试试看
    
---华软网友回复---
引用楼主 x309374055 的回复:
for( int i = 0; i < index; i++ )
   m_editCtrl[ i ].GetWindowTextW ( m_str[ i ] );
动态创建了10个CEdit,在模式对话框中输入内容,点确定后一次读取每个编辑框中的内容,但是这个一执行程序就崩溃了,是什么原因?

你应根据将你上面的代码放到你的模态对话框类的确定按钮的BN_CLICKED响应函数中去做~
---华软网友回复---
应该没有问题的,最大的可能是数组越界了。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。