Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Ошибка при отрисовке ТП (число прочтений - 3070 )
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Ошибка при отрисовке ТП
04. Февраля 2007 :: 10:01
Печать  
Отловилась ошибка вот в таком месте
Код
Выбрать все
void CCursorGridCtrl::OnPaint()
{
	CPaintDC dc(this);

    if (m_bLockDrawing)
	  return;

    //Paint(&dc);
    CMemDC memDC(&dc);
    Paint(memDC);
}
 


Почему-то получается  memDC == NULL, и выполнение Paint(memDC);  естественно приводит к ошибке.
В dc.m_ps.hdc  тоже NULL.

Вылезло в ситуации, когда журналу документов на ТП очень часто сыпались события на обновление (конвертил документы, а они при записи автоматом посылают события в журнал).
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Ошибка при отрисовке ТП
Ответ #1 - 12. Февраля 2007 :: 07:41
Печать  
Ещё одна ошибочка.
Состояние стека
Код
Выбрать все
CProviderRS::InjectParamValues(CString & {"....", CV7ODBCDataRow * 0x00000000) line 581
CProviderRS::ExecuteQuery(CV7ODBCDataRow * 0x00000000, int 0) line 633
CV7ODBCProvider::RefreshRow(CDataRow * 0x00000000) line 780 + 20 bytes
CCursorGridCtrl::Update() line 3689 + 27 bytes
CCursorGridCtrl::OnTimer(unsigned int 1) line 4647
 



Ошибка начинается по видимому здесь
Код
Выбрать все
void CCursorGridCtrl::Update()
....
		if (m_nCurrentDataRowIndex == -1)
		{
		    if (!m_pProvider->RefreshRow(m_pCurrentDataRowOutOfWindow)) //m_pCurrentDataRowOutOfWindow == NULL
			  SetCurrentCell(0, m_nCurrentColumn);
		}
 



Обычно условие if (m_nCurrentDataRowIndex == -1)  везде пишется как if (m_nCurrentDataRowIndex == -1 && m_pCurrentDataRowOutOfWindow). Может и в данном случае нужно его так же ставить?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка при отрисовке ТП
Ответ #2 - 12. Февраля 2007 :: 08:48
Печать  
А эта как проявлялась?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Ошибка при отрисовке ТП
Ответ #3 - 12. Февраля 2007 :: 08:53
Печать  
А тоже при странных стечениях обстоятельств.  Видимо тоже связано с принудительным обновлением, но неясно как.  Делал одинаковые действия  (провожу документ, он не проводится, принудительно обновляется журнал, выдаётся 1С-овское предупреждение что док. не провёлся).  Валилось через раз.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Ошибка при отрисовке ТП
Ответ #4 - 06. Апреля 2007 :: 05:37
Печать  
А вот ещё ошибка с падением.  Возникает при ОбновитьСтроки(). Эту ошибку, кстати, я славливал неоднократно, с таким же примерно стеком.
Стек такой:

Код
Выбрать все
BKEND! 200014f2()
CProviderRS::InjectParamValues(CString & {"select top 23 ...", CV7ODBCDataRow * 0x0510ead8) line 574 + 30 bytes
CProviderRS::ExecuteQuery(CV7ODBCDataRow * 0x0510ead8, int 23) line 633
CV7ODBCProvider::QueryRows(CDataRow * 0x0510ead8, int 23, int 23) line 738 + 22 bytes
CCursorGridCtrl::Reset(CDataRow * 0x0510ead8) line 3778
CCursorGridCtrl::ActivateRow(CDataRow * 0x0510ead8) line 3764
CV7CursorGridCtrl::SetCurrentRow(const CValue & {...}) line 409
CV7TableField::SetPropCurrentRow(const CValue & {...}) line 1161
CMyContextBase::SetPropVal(int 21, const CValue & {...}) line 269
CComponentClass::SetPropVal(int 22, const CValue & {...}) line 1356 + 22 bytes
CComponentClass::SetPropVal(int 43, const CValue & {...}) line 1356 + 22 bytes
BLANG! 2100907d()
 



Ошибка судя по всему в CProviderRS::InjectParamValues(), в строке
pRowFrom->SQLFormatValue(*pRowFrom->m_values[pParam->m_nFieldIndex], strTmp);
Здесь pRowFrom->m_values - это CPtrArray, размер его 8, и pParam->m_nFieldIndex - равно 8. Получаем выход за границу массива, и падение. Почему так получается, я понять не могу.  Может, кого-нибудь (скажем trad'а или DmitrO Улыбка )  это наведёт на какие-нибудь мысли?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Ошибка при отрисовке ТП
Ответ #5 - 07. Апреля 2007 :: 06:15
Печать  
С помощью trad'a удалось выяснить, что вся фишка была в том, что при установке ключа порядка в поставщике данных я не отключал ТП от поставщика. После надлежащей правки все странные падения прекратились.
В общем, тема видимо для FAQ'а
Q: у меня загадочным образом вылетает 1С при некоторых манипуляциях с табличным полем, как программных, так и интерактивных. В чём дело, товарищи?
A: вероятно ты используешь ТП с поставщиком данных ODBC, и устанавливаешь ключ порядка в поставщике, когда он подключен к ТП. Для верности, при установке КП используй такой примерно код:
Код
Выбрать все
	ТП.ПоставщикДанных = "";
	оПоставщикДанных.УстКлючПорядка(стрСортировка+" ROW_ID");
	ТП.ПоставщикДанных = оПоставщикДанных;
 


То же самое касается любых других манипуляций с поставщиком данных.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка при отрисовке ТП
Ответ #6 - 07. Апреля 2007 :: 10:41
Печать  
Наверное проще так:

ПоставщикДанных = Сам().ПоставщикДанных;
Сам().ПоставщикДанных = "";
ПоставщикДанных.УстКлючПорядка(стрСортировка);
Сам().ПоставщикДанных = ПоставщикДанных;

Не надо поставщика в переменной держать...

P.S. Эту особенность еще вроде ДмитрО сто лет назад описывал как решать.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать