Вопрос к знатокам - метод eval() у reportStringControl получает заранее рассчитанные данные или каждый раз вычисляет их заново? Если не вычисляет, то можно вообще вот такой метод вставить в Global и вызывать его из executeSection отчета, передавая ему текущую секцию:
X++:
static void prepareReportDynamicSection(ReportSection _section)
{
ReportControl reportControl;
ReportStringControl reportStringControl;
ReportShapeControl reportShapeControl;
Counter i;
int childNodesCount;
int maxHeight100mm = _section.height100mm(),
maxTop100mm;
childNodesCount = _section.AOTchildNodeCount();
for(i = 0; i < childNodesCount; i++) // step one
{
reportControl = _section.controlNo(i);
if(!reportControl || reportControl.handle() != classnum(ReportStringControl))
continue;
reportStringControl = reportControl;
maxHeight100mm = max(reportStringControl.heightOfWordWrappedString100mm(reportStringControl.eval()),
reportStringControl.heightOfWordWrappedString100mm(' '),
maxHeight100mm);
maxTop100mm = max(maxTop100mm, reportStringControl.top100mm());
}
for(i = 0; i < childNodesCount; i++) // step two
{
reportControl = _section.controlNo(i);
if (! reportControl)
continue;
if(reportControl.controlType() == ReportFieldType::Box)
{
reportShapeControl = reportControl;
if(reportShapeControl.type() != ShapeType::Horizontal)
{
reportShapeControl.height100mm(maxHeight100mm + 1 + maxTop100mm);
}
else
{
if(reportShapeControl.top100mm())
{
reportShapeControl.top100mm(maxHeight100mm + 1 + maxTop100mm);
}
}
}
else
{
reportControl.height100mm(maxHeight100mm);
}
}
}