Cross-tab ручная настройка высоты строки
HunterNS
Таганрог
Доброго времени суток всем.
У меня возникла проблема при использовании компонента DB Cross-tab.
FastReport V 4.7.21
Настраиваю кросс-таблицу следующим образом: Autosize = false. Выставляю нужные размеры колонок. Но не могу выставить нужную высоту строк.
Суть проблемы в следующем: Так как стоит Autosize = false, то высота строк не растягивается до максимальной высоты.
Если играться со свойствами StretchMode у RowHeader и у Cell нужный эффект не достигается (см. картинки 1, 2, 3)
В службе поддержки подсказали использовать Autosize = true или обрабатывать событие OnCalcHeight.
Когда я делаю Autosize = true, высота строк, в которых есть данные, становиться слишком большой, хотя пустого места сверху и снизу от записей достаточно (см. рис. 4).
Пробовал использовать Autosize = False и обрабатывать событие OnCalcHeight. В этом событии можно указать Height строки вручную. Если бы знать максимальную высоту строки, которая будет после прорисовки ячеек этой строки, то можно было бы это значение присвоить параметру Height. Но как узнать значение Height строки после прорисовки. Служба поддержки посоветовала использовать двойной проход (DoublePass) отчета.
Я вижу решение таким: в первом проходе я заполняю переменную-массив, в котором находятся значения высоты каждой строки (после растягивания!!!) кросс-таблицы. Затем во втором проходе выставляю полученные высоты строк соответствующим строкам.
Это хорошая мысль, но всё равно у меня не получается получить значение максимальной высоты в строке.
Не подскажите, какое событие мне нужно отрабатывать, чтобы узнать конечную высоту определенной строки в кросс-таблице?
На рисунке 5 изображено, как должна выглядеть таблица (делаю это в обработчике события DBCross1OnCalcHeight. if RowIndex = 0 then Height := 82; if RowIndex = 3 then Height := 40;)
Рисунок 1: Без растягивания
Рисунок 2: Растягивание по высоте
Рисунок 3: Растягивание до максимальной высоты
Рисунок 4: Авто размер
Рисунок 5: Так должно быть
У меня возникла проблема при использовании компонента DB Cross-tab.
FastReport V 4.7.21
Настраиваю кросс-таблицу следующим образом: Autosize = false. Выставляю нужные размеры колонок. Но не могу выставить нужную высоту строк.
Суть проблемы в следующем: Так как стоит Autosize = false, то высота строк не растягивается до максимальной высоты.
Если играться со свойствами StretchMode у RowHeader и у Cell нужный эффект не достигается (см. картинки 1, 2, 3)
В службе поддержки подсказали использовать Autosize = true или обрабатывать событие OnCalcHeight.
Когда я делаю Autosize = true, высота строк, в которых есть данные, становиться слишком большой, хотя пустого места сверху и снизу от записей достаточно (см. рис. 4).
Пробовал использовать Autosize = False и обрабатывать событие OnCalcHeight. В этом событии можно указать Height строки вручную. Если бы знать максимальную высоту строки, которая будет после прорисовки ячеек этой строки, то можно было бы это значение присвоить параметру Height. Но как узнать значение Height строки после прорисовки. Служба поддержки посоветовала использовать двойной проход (DoublePass) отчета.
Я вижу решение таким: в первом проходе я заполняю переменную-массив, в котором находятся значения высоты каждой строки (после растягивания!!!) кросс-таблицы. Затем во втором проходе выставляю полученные высоты строк соответствующим строкам.
Это хорошая мысль, но всё равно у меня не получается получить значение максимальной высоты в строке.
Не подскажите, какое событие мне нужно отрабатывать, чтобы узнать конечную высоту определенной строки в кросс-таблице?
На рисунке 5 изображено, как должна выглядеть таблица (делаю это в обработчике события DBCross1OnCalcHeight. if RowIndex = 0 then Height := 82; if RowIndex = 3 then Height := 40;)
Рисунок 1: Без растягивания
Рисунок 2: Растягивание по высоте
Рисунок 3: Растягивание до максимальной высоты
Рисунок 4: Авто размер
Рисунок 5: Так должно быть
Комментарии
Autosize = false;
Cross1Cell0.StretchMode = smMaxHeight;
Report.EngineOption.DoublePass = true;
Так как высота ячеек кросс-таблицы устанавливается правильно при отключенном Авторазмере, то я просто при первом проходе отчета запоминаю высоты первой ячейки каждой строки (зная их левую границу, в моём случае 162). А на втором проходе применяю эти высоты в обработчике события OnCalcHeight.
qpi, спасибо за помощь.
В случае если не сортировать по полю NAME не факт, что ячейки объединятся правильно.
Если сортировать NAME ASC (и при условии, что есть пустые значения для этой ячейки), то перед значением всегда будет лишняя пустая строка.
1. Осутствие сортировки (ячейки не объединятся!!! Так как в самой первой ячейки будет пустая строчка над строчкой "Текст"):
2. Сортировка 2-ой и 3-ей колонки по возрастанию (Выведется дополнительная строчка над надписью "Текст"):
Правильный вариант
3. Сортировка 2-ой колонки по возрастанию, 3-ей по убыванию (Всё выведется корректно, без лишних строчек):
Опытным путём стало известно, что при выводе данных в ячейку, над ними выполняется операция rtrim (удаление всех пробелов справа).
Сначала была мысль в запросе генерировать разное количество пробелов в те ячейки, в которых ничего не нужно выводить. Но так как Cross-tab производит rtrim над содержимым ячеек до их вывода (см. мой пост выше), то в ячейках снова получалось по одному пробелу (или вообще ничего) и Cross-tab их объединял.
Один мой коллега подсказал "волшебный" символ -"Неразрывный пробел" (ALT + 255 на Num панели). Вот он-то меня и спас. Для этого символа RTRIM не срабатывает, поэтому в каждых соседних "пустых" ячейках получаются разные строки.