Как сделать "навороченную шапку"?

TopCoreTopCore Мариуполь
отредактировано 18:52 Раздел: FastReport 4.0
Здравствуйте все! Есть ли возможность сделать сложную шапку у DBCrossTab?
Заранее спасибо!
«1

Комментарии

  • gpigpi
    отредактировано 18:52
    Подозреваю, что именно такую сложную шапку, как Вы хотите, сделать нельзя
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    Вчера нужно было переделать отчёт и я решил добавить новые поля в DBCrossTab. Вот что вышло (шапка усложнилась, но как это получилось?):
    iOmPd63e.png
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    Получилась вышепоказанная шапка приблизительно следующим образом: в датасете было одно поле <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Х<!--fontc--></span><!--/fontc--> вместо полей <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->С5 - С10<!--fontc--></span><!--/fontc-->. Добавил эти поля, удалил поле <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Х<!--fontc--></span><!--/fontc-->, обновил <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->frxDataSet<!--fontc--></span><!--/fontc-->. В <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->frxRepot<!--fontc--></span><!--/fontc--> в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab<!--fontc--></span><!--/fontc-->`е всё ещё находилось несуществующее поле <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Х<!--fontc--></span><!--/fontc--> ("Количество актов"). Я его "бахнул" и добавил <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->С5 - С10<!--fontc--></span><!--/fontc-->. Вот они и залезли под существующую шапку. Т.е. есть варианты (через ж...) сделать сложную шапку у <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab<!--fontc--></span><!--/fontc-->.
    А почему разработчики не хотят сделать возможность делать сложные шапки у этого прекрасного элемента?
  • gpigpi
    отредактировано 18:52
    написал:
    Вот что вышло (шапка усложнилась, но как это получилось?):
    Объясните Ваше высказывание. Текущая шапка Вас устраивает?
    Она и должна была получиться после следующих Ваших действий:
    написал:
    Получилась вышепоказанная шапка приблизительно следующим образом: в датасете было одно поле Х вместо полей С5 - С10. Добавил эти поля, удалил поле Х, обновил frxDataSet. В frxRepot в DBCrossTab`е всё ещё находилось несуществующее поле Х ("Количество актов"). Я его "бахнул" и добавил С5 - С10. Вот они и залезли под существующую шапку.
    написал:
    Т.е. есть варианты (через ж...) сделать сложную шапку у DBCrossTab.
    Этот вариант и есть правильным
    написал:
    А почему разработчики не хотят сделать возможность делать сложные шапки у этого прекрасного элемента?
    Какой вариант Вы предлагаете?
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    написал:
    Объясните Ваше высказывание. Текущая шапка Вас устраивает?
    Почти, но... я же не буду каждый раз для этого добавлять в датасет фиктивные поля, чтобы получить сложную шапку. Сейчас я вообще убрал шапку <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab<!--fontc--></span><!--/fontc-->`а и сделал её в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Header<!--fontc--></span><!--/fontc-->`е. Но теперь в коде нужно писать приравнивание ширины каждого заголовка строки и каждой ячейки к ширинам <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Memo<!--fontc--></span><!--/fontc--> в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Header<!--fontc--></span><!--/fontc-->`е.
    написал:
    Этот вариант и есть правильным
    По-моему, это вариант не есть правильным.
    Это не из-за лени я предлагаю, а потому, чтобы ещё более универсальным сделать элемент.
    написал:
    Какой вариант Вы предлагаете?
    Я предлагаю сделать ручное строительство шапки <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab<!--fontc--></span><!--/fontc-->`а как второй вариант после автоматического.
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    А как мне быть независимым от ширины каждого столбца в шапке?
    o4DBJR3j.png
    Я управляю шириной строчных заголовков, а <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->ColumnHeader<!--fontc--></span><!--/fontc-->, всё равно держит ширину каждого столбца свою.
    Спасибо.
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    В общем разбирался я разбирался. Убирал я галочки с ShowTitle, ShowCorner, ColumnHeader - ничего не помогает. Ширина RowHeader`ов как регулировалась, так и регулируется, а Corner`а не регулируется. Как убрать зависимость от ширины Corner?
    Кстати, со сложной шапкой это я гнал: это Title там наверху, а я думал это сложная шапка.
  • HunterNSHunterNS Таганрог
    отредактировано 18:52
    Ваши картинки ужасно неудобно открывать. Точнее я не могу их открыть вообще. Почему нельзя было залить их стандартными средствами форума?
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    HunterNS написал: »
    Ваши картинки ужасно неудобно открывать. Точнее я не могу их открыть вообще. Почему нельзя было залить их стандартными средствами форума?
    Как сделать превью по клику средствами форума не нашёл или не понял.
    o4DBJR3j.png
    iOmPd63e.png
  • gpigpi
    отредактировано 18:52
    Почему Вы не хотите просто установить заголовки строк и заголовки ячеек прямо в кроссе без использования Header?
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    gpi написал: »
    Почему Вы не хотите просто установить заголовки строк и заголовки ячеек прямо в кроссе без использования Header?
    А как можно провернуть такое?
    o5o2pRRc.png
  • HunterNSHunterNS Таганрог
    отредактировано 18:52
    Судя по вашей шапке, не понятно, зачем вам нужен именно DBCrossTab. Какие колонки у вас будут динамические? Может вам и не стоит заморачиваться с этим компонентом?
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    HunterNS написал: »
    Судя по вашей шапке, не понятно, зачем вам нужен именно DBCrossTab. Какие колонки у вас будут динамические? Может вам и не стоит заморачиваться с этим компонентом?
    Я почему-то предполагал, что <!--fonto:Courier New--><span style="http://www.fast-report.com/en/forum/?p=/discussion/comment/30533"; ] Subreport[/url][/i]<!--fontc--></span><!--/fontc-->. Но не всё так гладко.
  • gpigpi
    отредактировано 18:52
    Вам нужно использовать обычный TfrxMasterData и устанавливать границы мемо в скрипте
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    gpi написал: »
    Вам нужно использовать обычный TfrxMasterData и устанавливать границы мемо в скрипте
    Просто положить все <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Memo <!--fontc--></span><!--/fontc-->на <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->MasterData<!--fontc--></span><!--/fontc-->? Но мне нужно, чтобы текст в растянутом на высоту листа <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Memo<!--fontc--></span><!--/fontc--> был по середине. А управление границами этого не даст.
  • gpigpi
    отредактировано 18:52
    Тогда Вам придётся заморачиваться со скриптом: либо выводить значение в средней ячейке на втором проходе, либо выводить мемо необходимой высоты, а последующие скрывать (тоже на втором проходе)
    Ну, или ждать FR5. В нём обещают полноценное объединение ячеек
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    gpi написал: »
    Ну, или ждать FR5. В нём обещают полноценное объединение ячеек
    Да уже почти год все ожидают этого чуда. А делать нужно сейчас.
    Значит в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab<!--fontc--></span><!--/fontc--> никак не получится управлять шириной <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Corner<!--fontc--></span><!--/fontc-->`ов?
  • gpigpi
    отредактировано 18:52
    Если устроит, можно отключить AutoSize у кросса и использовать заголовки фиксированной ширины
    Или сделать с вложенным отчётом без повторения значений на новой странице, или с мастердата со значениями в первой строке - вполне рабочий вариант. А если реализовывать все хотелки юзеров - тогда только скрипт
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    Скажите, пожалуйста, почему следующий код не отрабатывает (у <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab AutoSize = false<!--fontc--></span><!--/fontc-->):
    procedure dbcCorner3OnBeforePrint(Sender: TfrxComponent);
    begin
      dbcCorner3.Width := Memo2.Width;                                                    
    end;
    
    procedure dbcCorner4OnBeforePrint(Sender: TfrxComponent);
    begin
      dbcCorner4.Width := Memo3.Width;  
    end;
    
    ey2NUGyf.png
  • gpigpi
    отредактировано 18:52
    Перенесите код в событие OnBeforePrint кросса
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    qpi, перенёс - не помогло:
    procedure dbcOnBeforePrint(Sender: TfrxComponent);
    begin
      dbcCorner3.Width := Memo2.Width;
      dbcCorner4.Width := Memo3.Width;      
    end;
    
    Результат:
    49LBAi4G.png
  • gpigpi
    отредактировано 18:52
    У меня работает
    procedure Cross1OnBeforePrint(Sender: TfrxComponent);
    begin
         Cross1Corner3.Width := 200;                                
    end;
    
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    qpi, огромное Вам спасибо! Всё работает. Я думал, что не работает, а уменьшению <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Corner<!--fontc--></span><!--/fontc-->`ов мешали <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->Row<!--fontc--></span><!--/fontc-->`ы. Вот что в итоге сделал:
    procedure dbcOnBeforePrint(Sender: TfrxComponent);
    begin
      dbcCorner3.Width := Memo2.Width;
      dbcCorner4.Width := Memo3.Width;
      dbcCorner5.Width := Memo4.Width;
      dbcCorner6.Width := Memo5.Width;
      dbcCorner7.Width := Memo6.Width;
      dbcRow0.Width := Memo2.Width;
      dbcRow1.Width := Memo3.Width;
      dbcRow2.Width := Memo4.Width;
      dbcRow3.Width := Memo5.Width;
      dbcRow4.Width := Memo6.Width;      
    end;
    
    Но остался последний момент. Как можно управлять высотой строк в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTab<!--fontc--></span><!--/fontc-->`е при <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->ActualSize = false<!--fontc--></span><!--/fontc-->?
  • TopCoreTopCore Мариуполь
    отредактировано July 2011
    Очень странное дело: ширина ячеек таблицы со значениями не регулируется в событии <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->OnCalcWidth<!--fontc--></span><!--/fontc--> при реализованном выше методе <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrosstab1OnBeforePrint<!--fontc--></span><!--/fontc-->. Но если добавить две строки в последнее событие, то всё работает:
    procedure dbcOnBeforePrint(Sender: TfrxComponent);
    begin
      dbcCorner3.Width := Memo2.Width;
      dbcCorner4.Width := Memo3.Width;
      dbcCorner5.Width := Memo4.Width;
      dbcCorner6.Width := Memo5.Width;
      dbcCorner7.Width := Memo6.Width;
      dbcRow0.Width := Memo2.Width;
      dbcRow1.Width := Memo3.Width;
      dbcRow2.Width := Memo4.Width;
      dbcRow3.Width := Memo5.Width;
      dbcRow4.Width := Memo6.Width;
    
      dbcCellHeader0.Left := Memo10.Left;
      dbcCellHeader0.Width := Memo10.Width;
    end;
    
    Почему не отрабатывает как положено в <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->OnCalcWidth<!--fontc--></span><!--/fontc-->? Или как узнать, что текст не влез полностью в поле?
  • gpigpi
    отредактировано 18:52
    При AutoSize = False OnCalcWidth не обрабатывается
  • TopCoreTopCore Мариуполь
    отредактировано July 2011
    Понятно. Спасибо.
    А как подогнать высоту полей под текст, который не влазит? <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->StretchMode = smActualHeight<!--fontc--></span><!--/fontc--> не поможет:
    sW1il0bx.png
    <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->StretchMode = smMaxHeight<!--fontc--></span><!--/fontc-->: текст вообще куда-то исчезает в полях и заголовках.
    Может есть какое-нибудь свойство типа <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->TextWidth<!--fontc--></span><!--/fontc-->?
  • gpigpi
    отредактировано 18:52
    Попробуйте на первом проходе в OnPrintCell определять максимальную высоту для каждой строки при помощи Memo.CalcHeight, а на втором проходе выставлять эту высоту в OnCalcHeight
  • TopCoreTopCore Мариуполь
    отредактировано 18:52
    Спасибо, qpi!
    Событие <!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->DBCrossTabOnPrintRowHeader<!--fontc--></span><!--/fontc--> происходит один раз для одной строки? Или несколько раз для одной строки в зависимости от количества уровней заголовков строк?
  • gpigpi
    отредактировано 18:52
    несколько раз для одной строки в зависимости от количества уровней заголовков строк
  • HunterNSHunterNS Таганрог
    отредактировано 18:52
    Насчёт высоты строк, почитайте мою тему.
    http://www.fast-report.com/en/forum/?p=/discussion/8117
    У меня там была аналогичная проблема.

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

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