Сложный заголовок таблицы

отредактировано 18:00 Раздел: FastReport 3.0
Добрый день! Имеется ли возможность вручную создать заголовок для табличных данных (примерный вид на рисунке)?

Комментарии

  • отредактировано 18:00
    Внесу уточнение. В принципе, как создать такой отчет с помощью cross-tab понятно. Интересует объединие ячеек в заголовке.
  • отредактировано 18:00
    А подогнать размеры (Height) вы не можете? Зачем объединение???

    Управляйте размерами Memo, это, на мой взгляд, очень просто.
  • отредактировано 18:00
    К сожалению, текст в ячейках заголовка может быть достаточно большим и без объединения заголовок таблицы получается весьма несимпатичным. Пробовал также вариант с эмуляцией объединения - отключить у верхней ячейки нижнюю линию, у и нижних верхнюю. Это не подходит. Нужно именно объединение ячеек, аналогично столбцу с итогами.
  • отредактировано 18:00
    Объединение можно сделать следущим способом:
    Есть Memo1, под ним Memo2 и слева от них Memo3, надо объединить Memo1 с Memo2 и Memo3.
    <span style='font-family:Courier'>
    |***Memo1***|********************|
    |*******Memo3********|
    |***Memo2***|********************|
    </span>
    Делаем следущее
    int iH = Memo2.Height;
    int iW = Memo3.Width;
    Memo2.Height = 0;
    Memo2.Width = 0;
    Memo2.Visible = false;
    Memo3.Height = 0;
    Memo3.Width = 0;
    Memo3.Visible = false;
    
    Memo1.Height = Memo1.Height + iH;
    Memo1.Width = Memo1.Width +iW;
    
    В итоге получим
    <span style='font-family:Courier'>
    |********************************|
    |*************Memo1**************|
    |********************************|
    </span>
  • SvetkinSvetkin СПб
    отредактировано 18:00
    А можно ли в MasterData такие же фокусы делать????
  • отредактировано 18:00
    Можно.
    В обработчике собы
  • отредактировано 18:00
    Что-то не получилось у меня дописать ;)

    В обработчике события (например, OnBeforePrint) выставляем все размеры, скрываем ненужные поля, варьируем рамками, шрифтом, цветом...

    OnBeforePrint, например, появляется перед отрисовкой каждой строки, можно каждой строчке задавать свой набор параметров.
  • SvetkinSvetkin СПб
    отредактировано 18:00
    написал:
    можно каждой строчке задавать свой набор параметров.

    Это самое интересное... если возможно, раскройте поподробнее...
  • отредактировано 18:00
    Вот несколько примеров реализации OnBeforePrint
    String sAgreement;
    String sName;
    String sLCN;
    void AgreementMemoOnBeforePrint(TfrxComponent Sender)
    {
      if (sAgreement == VarToStr (Get ("Agreement")))
        AgreementMemo.Frame.Typ = ftLeft + ftRight;
      else
        AgreementMemo.Frame.Typ = ftLeft + ftRight + ftTop;
      //----------------------------------------------------------------------
      m_pDataQuery.Next;
      if (m_pDataQuery.Eof)
        AgreementMemo.Frame.Typ += ftBottom;
      else
        m_pDataQuery.Prior;
      //----------------------------------------------------------------------
      sAgreement =  VarToStr (Get ("Agreement"));
      //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    void AgreementMemoOnBeforePrint(TfrxComponent Sender)
    {
      if (sAgreement == VarToStr (Get ("Agreement")))
        AgreementMemo.Frame.Typ = ftLeft + ftRight;
      else
        AgreementMemo.Frame.Typ = ftLeft + ftRight + ftTop;
      //----------------------------------------------------------------------
      m_pDataQuery.Next;
      if (m_pDataQuery.Eof)
        AgreementMemo.Frame.Typ += ftBottom;
      else
        m_pDataQuery.Prior;
      //----------------------------------------------------------------------
      sAgreement =  VarToStr (Get ("Agreement"));
      //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    void ClientMemoOnBeforePrint(TfrxComponent Sender)
    {
      if (sName == VarToStr (Get ("ClientName")))
        ClientMemo.Frame.Typ = ftLeft + ftRight;
      else
        ClientMemo.Frame.Typ = ftLeft + ftRight + ftTop;
      //----------------------------------------------------------------------
      m_pDataQuery.Next;
      if (m_pDataQuery.Eof)
        ClientMemo.Frame.Typ += ftBottom;
      else
        m_pDataQuery.Prior;
      //----------------------------------------------------------------------
      sName =  VarToStr (Get ("ClientName"));
      //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    void LCNMemoOnBeforePrint(TfrxComponent Sender)
    {
      if (sLCN == VarToStr (Get ("LCN")))
        LCNMemo.Frame.Typ = ftLeft + ftRight;
      else
        LCNMemo.Frame.Typ = ftLeft + ftRight + ftTop;
      //----------------------------------------------------------------------
      m_pDataQuery.Next;
      if (m_pDataQuery.Eof)
        LCNMemo.Frame.Typ += ftBottom;
      else
        m_pDataQuery.Prior;
      //----------------------------------------------------------------------
      sLCN =  VarToStr (Get ("LCN"));
      //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    {
      sAgreement   = "";
      sName        = "";
      sLCN         = "";
      //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    void FGRHeaderOnBeforePrint(TfrxComponent Sender)
    {
      switch (Get ("FGR"))
      {
        case -3: FGRMemo.Text = IntToStr (Get ("Item")) +
                   ".1. Реализация";
        //--------------------------------------------------------------------
        case -2: FGRMemo.Text = IntToStr (Get ("Item")) +
                   ".2. Приобретено товаров и услуг";
        //--------------------------------------------------------------------
        default: FGRMemo.Text = IntToStr (Get ("Item")) +
                   ".3. Операции";
        //--------------------------------------------------------------------
      }
      //----------------------------------------------------------------------
    }
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.