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

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

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

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

Сообщение zmirk » 20.03.2010 19:12:12

Крутяк! Спасибо огромное, Vadim! Там еще и ширину отдельной колонки можно устанавливать и много чего еще! Чет у меня мысли совсем в другом направлении шли..:)
На самом деле странно, что эти свойства в рантайме нельзя менять...хотя может и можно, просто я пока не знаю как...
zmirk
незнакомец
 
Сообщения: 7
Зарегистрирован: 17.03.2010 13:18:21

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

Сообщение Vladimir_Ivanov » 20.03.2010 20:10:00

можно еще так:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  Grids, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
      aRect: TRect; aState: TGridDrawState);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  List:TList;//будет содержать список визуальных обьектов

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var C:^TCheckBox;
    I:integer;
begin
List:=TList.Create; //Список наших визуальных обьектов
List.Capacity:=StringGrid1.RowCount; //ну типа скока их :)

    for I:=1 to StringGrid1.RowCount do  //Заполнения списка созданными обьектами
     begin                               //если быть честным то указателями на них
    new(C);
    C^:=TCheckBox.Create(StringGrid1);
    C^.Parent:=StringGrid1;
    C^.Visible:=False;
    List.Add(C);      //само добавление указателя
     end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
//процедура которая перерисовывает ячейку с номером колонки  aCol и строки aRow
//  aRect - прямоугольник нашей ячейки
if (acol=2) and (aRow<>0)then
begin    //предположим что нуна рисовать во 2-ой колонке.
    TCheckBox(List[aRow]^).Top:=arect.Top;
    TCheckBox(List[aRow]^).Left:=arect.Left;
    TCheckBox(List[aRow]^).Visible:=True;
   end;


if  (acol=3) and (aRow=3)then
  begin    //чисто для примера
    TCheckBox(List[0]^).Top:=arect.Top;
    TCheckBox(List[0]^).Left:=arect.Left;
    TCheckBox(List[0]^).Visible:=True;
  end;
end;

initialization
  {$I unit1.lrs}

end.

Vladimir_Ivanov
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.03.2010 18:10:47

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

Сообщение zmirk » 20.03.2010 20:52:52

Ха! Методом научного тыка все же понял как с колонками в рантайме работать. Если кому надо, то:
StringGrid.Columns.Items[n]
Делает с колонками что угодно, даже выравнивание по содержимому (а я для этого процедуру писал).

Vladimir_Ivanov,
Cпасибо, но ведь этот способ гораздо сложнее. Или в нем есть определенные плюсы оправдывающие его применение?
zmirk
незнакомец
 
Сообщения: 7
Зарегистрирован: 17.03.2010 13:18:21

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

Сообщение Vladimir_Ivanov » 20.03.2010 21:02:19

По идее когда в таблице будет достаточно много различных данных то это себя окупит. ну например как ты будешь организовывать работу с ComboBox ну или еще чем нибудь, а работа через списки да пожайлуйста хоть еще одну таблицу помести в ячейку.. :). потом в дальнейшем начнешь работать с классами и даже создовать свои элементы (визуальные) то опять таже проблема.. Ну принуждать я не буду, сам понимаешь...
Vladimir_Ivanov
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.03.2010 18:10:47

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

Сообщение zmirk » 20.03.2010 21:11:07

Да это я понимаю, любой элемент стандартными средствами не вставишь, но раз реализована работа с комбобоксом, то почему бы не воспользоваться..:)

Добавлено спустя 2 минуты 31 секунду:
Кстати с ним так и работать проще будет, ведь по сути бокс там только нарисован, а ячейка принимает значение в зависимости от его состояния(тоже регулируется свойством)
zmirk
незнакомец
 
Сообщения: 7
Зарегистрирован: 17.03.2010 13:18:21

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

Сообщение poiuyt555 » 23.02.2013 17:52:53

Код: Выделить всё
Делает с колонками что угодно, даже выравнивание по содержимому (а я для этого процедуру писал).

А как сделать выравнивание по содержимому средствами lazarus - StringGrid.Columns.Items[n]?
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

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

Сообщение mirk » 06.03.2014 14:57:19

Гм... Это сделать крайне затруднительно, т.к. я использую для этой цели только свойство компонента в дизайнере и никакого кода.

Если я захочу раскрасить ячейки, то мне придется использовать DefaultDrawing=False и OnDrawCell - при этом затрутся все чекбоксы созданные через свойства компонента.
Как быть в таком случае?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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

Сообщение mirk » 11.03.2014 11:03:43

Неужели никто не подскажет как сделать checkbox с раскраской ячеек?
Пытаюсь рисовать их сам, но наталкиваюсь на огромные баги (в XP классике раскраска непонятно как скачет, в XP теме раскраска вообще не работает у чекбокса).
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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

Сообщение alexs » 11.03.2014 12:45:41

Просто посмотри - как в исходниках там всё реализовано.
На самом деле - не сложно.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение mirk » 11.03.2014 13:41:25

Боюсь даже туда смотреть, т.к. похоже там каша неимоверная.
Например вызов 2-3 раза OnDrawCell ячейки раза для одной перерисовки - это в порядке вещей :(
Не удивительно что StringGrid так мерцает и тупит.
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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

Сообщение alex208210 » 11.03.2014 18:34:26

mirk, выше был предложен более универсальный и правильный способ вставки компонентов в таблицу через отрисовку, используйте его, тогда раскраска будет без проблем.
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

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

Сообщение mirk » 12.03.2014 10:01:05

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

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

Плюс не очень понятно как бороться с множественным вызовом OnDrawCell - это вызывает затупы и мерцания.
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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

Сообщение alexs » 12.03.2014 13:01:16

mirk
Почему тебя отрисовка страшит?
В гриде для это есть готовый метод - DrawGridCheckboxBitmaps
На примере DBGrid - ожно посмотреть как он вызывается - DrawCheckboxBitmaps
Там всё просто и понятно.
И вообще - зачем создавать головную боль себе. Возьм для отображения DBGrid (или RxDBGrid), а данные расположи в наследние DataSet-а (в том-же RxMemoryTable).
Обычно этого вполне хватает.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение mirk » 12.03.2014 13:15:49

Почему тебя отрисовка страшит?

Сама отрисовка меня не страшит - я ее использую без проблем.
Страшит использование не оптимального кода из реализации Lazarus.
Считаю его не оптимальным, т.к. вижу множественные вызовы перерисовки и наблюдаю огромное количество багов в IDE.
Поэтому и хочется реализовать правильно, а не как в Lazarus ;)
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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

Сообщение alexs » 12.03.2014 14:59:50

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

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron