Закрепленные области в StringGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Закрепленные области в StringGrid

Сообщение Andreich » 13.02.2009 12:40:55

Всем доброго времени суток! Кратко опишу ситуацию: имеется задача в рамках которой нужно формировать таблицу в StringGrid, есть закрепленный FixedCols (1 шт.) с заголовками столбцов и FixedRows (1 шт.) с номерами строк. Требуется в нескольких последних строках в таблице выводить сводные показатели по столбцам (н.р.: сумма, число пропусков, мах, min, ... и т.д.).

Можно ли каким-либо образом закрепить эти последние строки, чтобы при прокрутке они всегда были видны?
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Закрепленные области в StringGrid

Сообщение GrayEddy » 13.02.2009 13:22:01

Надо отрисовывать в OnDrawCell последнюю(ие) строку(и).
И еще: Если надо отрисовать (к примеру) 2 последние строки, то в TStringGrid к имеюшимся строкам надо будет добавить две пустые строки, которые и уйдут на отрисовку, если достигнешь конца стрингрида.
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Закрепленные области в StringGrid

Сообщение Andreich » 13.02.2009 14:41:07

Спасибо за интересную идею! Попробовал - вроде бы что-то получается. Нужно будет немного позаморачиваться с разбиением на ячейки, но это мелочи. Тут возникает другая проблема: рисуем мы на Canvas, и если нет горизонтальной прокрутки, то все Ok. Но если таковая присутствует, то как определить высоту самой полосы прокрутки, чтобы начать рисование корректно по высоте. Если я правильно понимаю, то эта величина может быть разной в зависимости от стиля оформления применяемого в системе.
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Закрепленные области в StringGrid

Сообщение GrayEddy » 13.02.2009 15:46:28

Можно еще проще. Посмотрите свойство RowCount - оно показывает число полностью видимых строк без фиксированных строк.
Следствие: если надо отрисовать - рисуйте не последнюю, а предпоследнюю строку, если последняя не видна полностью. Эту же последнюю можно отрисовать в OnDrawCell, чтобы она стала невидимой.
Если достигли конца грида - то да, рисуем последнюю.
Вот псевдокод:
Код: Выделить всё
if StringGrid1.TopRow + StringGrid1.VisibleRows < StringRid1.Rows then
РисуемПредпоследнююСтроку()
else
РисуемПоследнююСтроку()


StringGrid1.TopRow - это номер смой верхней видимой строки в гриде.
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Закрепленные области в StringGrid

Сообщение Andreich » 14.02.2009 12:36:36

GrayEddy писал(а):Посмотрите свойство RowCount - оно показывает число полностью видимых строк без фиксированных строк.

Наверное здесь имелось в виду свойство .VisibleRowCount, т.к. просто .RowCount - полное число строк в гриде.

Тут обнаружилась одна проблема, с которой никак не могу разобраться: при достижении конца StringGrid функция возвращает .VisibleRowCount = 9, хотя я собственными глазами вижу в таблице 10 полных строк. Причем я установил goSmoothScroll:=false. При нахождении полосы прокрутки в любом другом месте (кроме конца грида) возвращается правильное значение. С чем бы это могло быть связано? (размеры грида не меняются).
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Закрепленные области в StringGrid

Сообщение Logo » 14.02.2009 19:56:25

Andreich, а лучше будет, собрать итоговую строку из отдельных компонент, а что бы это имело вид единого целого, - на ресайз таблицы подгонять размеры этих компонент, соответственно тем колонкам, под которыми они находятся.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Закрепленные области в StringGrid

Сообщение Andreich » 16.02.2009 15:44:58

Наконец-то я закончил экспериментировать с различными вариантами закрепления строк в нижней части таблицы и решил поделиться результатами... Как и предполагалось, наиболее эффективным оказался наиболее простой вариант, а именно... еще один грид, расположенный непосредственно под первым. :) Почему? Все очень просто: вариант с отрисовкой строк на канве исходного компонента я тоже реализовал, но он оказался довольно медлительным, прорисовка всех ячеек на деле является очень ресурсоемким процессом (при прокрутке таблица начинает изрядно притормаживать, особенно если рисуем несколько "серых" строк да еще и текст в них выводим).

Гораздо более легкий во всех смыслах способ... берем 2 компонента StringGrid, у верхнего убираем горизонтальную прокрутку, состыковыаем их вплотную друг к другу (разумеется ширина колонок идентична), и в событии .onPrepareCanvas для второго грида пишем буквально следующее:

Код: Выделить всё
StringGrid1.LeftCol:=StringGrid2.LeftCol;

И все, никаких прочих заморочек! :)
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Закрепленные области в StringGrid

Сообщение Logo » 17.02.2009 07:42:44

Не плохо :)
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru