Показать сообщение отдельно
Старый 02.04.2009, 09:08   #18  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
Вопрос к знатокам - метод 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);
        }
    }
}