Всем доброго времени суток! Кратко опишу ситуацию: имеется задача в рамках которой нужно формировать таблицу в StringGrid, есть закрепленный FixedCols (1 шт.) с заголовками столбцов и FixedRows (1 шт.) с номерами строк. Требуется в нескольких последних строках в таблице выводить сводные показатели по столбцам (н.р.: сумма, число пропусков, мах, min, ... и т.д.).
Можно ли каким-либо образом закрепить эти последние строки, чтобы при прокрутке они всегда были видны?
Закрепленные области в StringGrid
Модератор: Модераторы
Надо отрисовывать в OnDrawCell последнюю(ие) строку(и).
И еще: Если надо отрисовать (к примеру) 2 последние строки, то в TStringGrid к имеюшимся строкам надо будет добавить две пустые строки, которые и уйдут на отрисовку, если достигнешь конца стрингрида.
И еще: Если надо отрисовать (к примеру) 2 последние строки, то в TStringGrid к имеюшимся строкам надо будет добавить две пустые строки, которые и уйдут на отрисовку, если достигнешь конца стрингрида.
Спасибо за интересную идею! Попробовал - вроде бы что-то получается. Нужно будет немного позаморачиваться с разбиением на ячейки, но это мелочи. Тут возникает другая проблема: рисуем мы на Canvas, и если нет горизонтальной прокрутки, то все Ok. Но если таковая присутствует, то как определить высоту самой полосы прокрутки, чтобы начать рисование корректно по высоте. Если я правильно понимаю, то эта величина может быть разной в зависимости от стиля оформления применяемого в системе.
Можно еще проще. Посмотрите свойство RowCount - оно показывает число полностью видимых строк без фиксированных строк.
Следствие: если надо отрисовать - рисуйте не последнюю, а предпоследнюю строку, если последняя не видна полностью. Эту же последнюю можно отрисовать в OnDrawCell, чтобы она стала невидимой.
Если достигли конца грида - то да, рисуем последнюю.
Вот псевдокод:
StringGrid1.TopRow - это номер смой верхней видимой строки в гриде.
Следствие: если надо отрисовать - рисуйте не последнюю, а предпоследнюю строку, если последняя не видна полностью. Эту же последнюю можно отрисовать в OnDrawCell, чтобы она стала невидимой.
Если достигли конца грида - то да, рисуем последнюю.
Вот псевдокод:
Код: Выделить всё
if StringGrid1.TopRow + StringGrid1.VisibleRows < StringRid1.Rows then
РисуемПредпоследнююСтроку()
else
РисуемПоследнююСтроку()StringGrid1.TopRow - это номер смой верхней видимой строки в гриде.
GrayEddy писал(а):Посмотрите свойство RowCount - оно показывает число полностью видимых строк без фиксированных строк.
Наверное здесь имелось в виду свойство .VisibleRowCount, т.к. просто .RowCount - полное число строк в гриде.
Тут обнаружилась одна проблема, с которой никак не могу разобраться: при достижении конца StringGrid функция возвращает .VisibleRowCount = 9, хотя я собственными глазами вижу в таблице 10 полных строк. Причем я установил goSmoothScroll:=false. При нахождении полосы прокрутки в любом другом месте (кроме конца грида) возвращается правильное значение. С чем бы это могло быть связано? (размеры грида не меняются).
Andreich, а лучше будет, собрать итоговую строку из отдельных компонент, а что бы это имело вид единого целого, - на ресайз таблицы подгонять размеры этих компонент, соответственно тем колонкам, под которыми они находятся.
Наконец-то я закончил экспериментировать с различными вариантами закрепления строк в нижней части таблицы и решил поделиться результатами... Как и предполагалось, наиболее эффективным оказался наиболее простой вариант, а именно... еще один грид, расположенный непосредственно под первым.
Почему? Все очень просто: вариант с отрисовкой строк на канве исходного компонента я тоже реализовал, но он оказался довольно медлительным, прорисовка всех ячеек на деле является очень ресурсоемким процессом (при прокрутке таблица начинает изрядно притормаживать, особенно если рисуем несколько "серых" строк да еще и текст в них выводим).
Гораздо более легкий во всех смыслах способ... берем 2 компонента StringGrid, у верхнего убираем горизонтальную прокрутку, состыковыаем их вплотную друг к другу (разумеется ширина колонок идентична), и в событии .onPrepareCanvas для второго грида пишем буквально следующее:
И все, никаких прочих заморочек!
Гораздо более легкий во всех смыслах способ... берем 2 компонента StringGrid, у верхнего убираем горизонтальную прокрутку, состыковыаем их вплотную друг к другу (разумеется ширина колонок идентична), и в событии .onPrepareCanvas для второго грида пишем буквально следующее:
Код: Выделить всё
StringGrid1.LeftCol:=StringGrid2.LeftCol;И все, никаких прочих заморочек!
