ZalivkoDenis
Это точно, нужно за 2 события зацепляться OnDetailFirst и OnDetailIsCurrentQuery, при этом у детейл вью параметр DetailInSQLMode = true. Второе событие всегда вызывается при изменении текущей записи в детейле, чтобы определить - это та же мастер-запись или уже другая. Если событие вернет false, то тогда вызывается первое событыие для перечитки информации в соответствии с новой мастер-записью.
Например, у меня детейл DataSet - это процедура, как правило. В событии OnDetailIsCurrentQuery проверяю параметры процедуры: соответствуют ли они текущей мастер-записи
return DetailProc->ParamByName("@Name")->Value == AMasterDetailKeyValues;
В событии OnDetailFirst что-то типа:
if(DetailProc->ParamByName("@Name")->Value == AMasterDetailKeyValues)
{
DetailProc->First();
return;
}
DetailProc->DisableControls();
try
{
try
{
DetailProc->Close();
DetailProc->Params->ParamByName("@Name")->AsInteger = AMasterDetailKeyValues;
DetailProc->Open();
}
catch(...)
{
throw;
}
}
__finally
{
DetailProc->EnableControls();
}
AReopened = true;
Это точно, нужно за 2 события зацепляться OnDetailFirst и OnDetailIsCurrentQuery, при этом у детейл вью параметр DetailInSQLMode = true. Второе событие всегда вызывается при изменении текущей записи в детейле, чтобы определить - это та же мастер-запись или уже другая. Если событие вернет false, то тогда вызывается первое событыие для перечитки информации в соответствии с новой мастер-записью.
Например, у меня детейл DataSet - это процедура, как правило. В событии OnDetailIsCurrentQuery проверяю параметры процедуры: соответствуют ли они текущей мастер-записи
return DetailProc->ParamByName("@Name")->Value == AMasterDetailKeyValues;
В событии OnDetailFirst что-то типа:
if(DetailProc->ParamByName("@Name")->Value == AMasterDetailKeyValues)
{
DetailProc->First();
return;
}
DetailProc->DisableControls();
try
{
try
{
DetailProc->Close();
DetailProc->Params->ParamByName("@Name")->AsInteger = AMasterDetailKeyValues;
DetailProc->Open();
}
catch(...)
{
throw;
}
}
__finally
{
DetailProc->EnableControls();
}
AReopened = true;