Как вставить checkbox в stringgrid

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

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

Re: Как вставить checkbox в stringgrid

Сообщение mirk » 12.03.2014 15:50:32

Так вот и вопрос как сделать оптимально ;)

Вроде многие рисуют элементы сами, но как осуществляют скрытие элементов из невидимых строк?
Или можно узнать первую отображаемую строку в stringgrid?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

Re: Как вставить checkbox в stringgrid

Сообщение alexs » 12.03.2014 16:40:38

А зачем?
Событие просрисовки ячейки тебе выдаёт координаты ячейки.
Код: Выделить всё
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);

Ну а если хочется ниже копнуть - посмотри как реализован метод Pain
procedure TCustomGrid.Paint;

И обрати внимание на вызов DrawAllRows;
Код: Выделить всё
procedure TCustomGrid.DrawAllRows;
var
  i: Integer;
begin
  // Draw Rows
  with FGCache.VisibleGrid do
    for i:=Top to Bottom do
      DrawRow(i);
  // Draw Fixed Rows
  for i:=0 to FFixedRows-1 do
    DrawRow(i);
end;

Тут ничего сложно - простой цикл по видимому диапазону.
Вопросы ещё будут?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Как вставить checkbox в stringgrid

Сообщение alex208210 » 12.03.2014 17:26:36

mirk писал(а):
выше был предложен более универсальный и правильный способ вставки компонентов в таблицу через отрисовку, используйте его, тогда раскраска будет без проблем

Его и использовал, но при большом количестве строк начинаются глюки при скроллинге.
Причина глюков: checkbox привязываются к stringgrid (.Parent:=StringGrid), а не к ячейке. Т.е. они (checkbox'ы) начинают перекрывать друг друга и вызывать различные визуальные аретфакты. Необходимо динамически отслеживать какие строки не показываются и скрывать их checkbox'ы. Но как это сделать я не знаю - не нашел свойство показывающее первую отображаемую строку в stringgrid.

Плюс не очень понятно как бороться с множественным вызовом OnDrawCell - это вызывает затупы и мерцания.



Код: Выделить всё
procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
var
    i:integer;
begin
  for i:=0 to stringgrid1.TopRow-1 do
   begin
     if TCheckBox(List[i]^) <> nil then TCheckBox(List[i]^).Visible:=false;
   end;
  for i:=stringgrid1.VisibleRowCount to stringgrid1.rowcount-1 do
   begin
     if TCheckBox(List[i]^) <> nil then TCheckBox(List[i]^).Visible:=false;
   end;
end;



это решает проблему смешивания чекбоксов при скроллинге.. принцип в скрытии ненужных чекбоксов.


gosmoothscroll:=false; - для того что бы первая строка не налазила на заголовок
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Как вставить checkbox в stringgrid

Сообщение mirk » 13.03.2014 11:30:16

Спасибо, помогло.
Как же я сразу не заметил stringgrid1.TopRow :(
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

Re: Как вставить checkbox в stringgrid

Сообщение ev » 13.03.2014 18:39:09

если в ячейке ничего больше нет, то можно просто вызвать DefaultDrawCell
тогда не надо будет самому создавать объекты и делать их скрытие/показ
ev
долгожитель
 
Сообщения: 1775
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Пред.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 219

Рейтинг@Mail.ru