Была такая тема.
По нарушению контекста.
Проблема, как всегда, оказалась рядом.
Текущая схема такая:
В нормальных условиях при запуске обработки из документа по кнопке или из меню СЗ процедуры отрабатывают в следующем порядке:
Цитата:ПриНажатииЛевойКнопки - форма1
ПриОтжатииЛевойКнопки - форма1
ПриИзмененииРазмераОкна - форма2
ПослеСозданияФормы -форма2
ПослеОткрытия - форма2
ПриДвиженииМыши - форма1
ПриДвиженииМыши - форма1
При запуске же через Сервис::ВыбратьЗначение() паразитные хуки ПриДвиженииМыши в форме1 не отрабатываются.
В итоге, callback не может удалять строки.
То же самое происходит, если закомментировать хук "ПриДвиженииМыши" -
все варианты вызова обработчика будут обламываться с удалением строк.
До тех пор, пока не будет вызвана любая функция в _CallModuleProc() в контексте форма1 (например. по щелчку мыши или по движению, если хук не закомментарен).
Тогда начинают работать все методы вызова, в том числе и из меню.
То же самое, когда мы раскомментариваем вызовы "ПослеОбновленияФормы".
В итоге, думаю, вся причина вот в этом полезном коде в _CallModuleProc():
Цитата:for(int i = 0; i<pCont->GetSize(); i++)
{
pCont0 = pCont->GetContext(i);
if(!strcmp(pCont0->GetRuntimeClass()->m_lpszClassName,"CDocContext"))
((CDocContext*)pCont0)->SetEnableNewLine(1);
}
alf, придумай, плз, как грамотно его вызвать в контексте
вызывающей формы после запуска вызываемой формы.
P.S. С этим, видимо, связана и нестабильность появления проблемы:
при разном положении форм, иногда у меня отрабатывались хуки на "ПриДвиженииМыши" в вызывающей форме, а иногда нет.
Если привильно сделать принудительный SetEnableNewLine(1), все будет работать стабильно.
alfВ общем, перед вызовом контекста документа нужно разрешать добавление строк.
Если ничего лучше не придумается, предлагаю сделать новую процедуру, которую нужно будет вызывать в обработчике перед вызовом callback методов контекста документа.
Подумай, плз, найдется ли ей место в FormEx? Если нет, добавлю в CSystem, хотя это не в тему будет.
BOOL CSystem::procEnableNewLine(CValue& RetVal, CValue **params)
{
CGroupContext *pGroupCont = (CGroupContext *)params[0]->GetContext();
if(pGroupCont)
{
CBLContext *pCont;
for(int i = 0; i < pGroupCont->GetSize(); ++i)
{
pCont = pGroupCont->GetContext(i);
LPCSTR pName = pCont->GetRuntimeClass()->m_lpszClassName;
if(!strcmp(pName, "CDocContext"))
((CDocContext*)pCont)->SetEnableNewLine(1);
}
}
return TRUE;
Использование:
Процедура Выполнить(__число)
Если ТипЗначения(_конт) =100 Тогда
_система =СоздатьОбъект("Система");
_система.EnableNewLine(_конт);
_конт.Обработчик(__число);
КонецЕсли;
КонецПроцедуры
Проблема возникла после того, как Альф убрал тормозную отработку ПослеОбновленияФормы().
В качестве временного решения сделана затычка Система::EnableNewLine().
Поскольу я уже в сотне мест прописал этот код, менять что-то уже не собираюсь - поздняк метацца