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

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

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

mirk
постоялец
Сообщения: 319
Зарегистрирован: 24.09.2007 10:03:39

Сообщение mirk »

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

Вроде многие рисуют элементы сами, но как осуществляют скрытие элементов из невидимых строк?
Или можно узнать первую отображаемую строку в stringgrid?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

А зачем?
Событие просрисовки ячейки тебе выдаёт координаты ячейки.

Код: Выделить всё

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;

Тут ничего сложно - простой цикл по видимому диапазону.
Вопросы ещё будут?
alex208210
постоялец
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Сообщение alex208210 »

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; - для того что бы первая строка не налазила на заголовок
mirk
постоялец
Сообщения: 319
Зарегистрирован: 24.09.2007 10:03:39

Сообщение mirk »

Спасибо, помогло.
Как же я сразу не заметил stringgrid1.TopRow :(
ev
долгожитель
Сообщения: 1793
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение ev »

если в ячейке ничего больше нет, то можно просто вызвать DefaultDrawCell
тогда не надо будет самому создавать объекты и делать их скрытие/показ
Ответить