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

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

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

Аватара пользователя
Dark Ichigo
новенький
Сообщения: 44
Зарегистрирован: 12.03.2009 18:06:51
Контактная информация:

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

Сообщение Dark Ichigo »

Понимаю, что проблема обсуждалась неоднократно в дельфийском сообществе. Тем не менее, у меня пока не получается это сделать по данным мануалам.

Может, у кого есть опыт вставки TCheckbox в TStringGrid в Lazarus? Помогите, плиз. :roll:
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

а что по дельфиским мануалам не получается ?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Dark Ichigo
В дизайнере StringGrid.Columns, создать столько колонок, сколько Вам неоходимо и в той колонке, где нужен чекбокс, выбрать в свойстве колонки ButtonStyle:=cbsCheckboxColumn.
Аватара пользователя
Dark Ichigo
новенький
Сообщения: 44
Зарегистрирован: 12.03.2009 18:06:51
Контактная информация:

Сообщение Dark Ichigo »

К сожалению, то, о чём вы говорите, отсутствует в TStringGrid. Вот цитата:

* cbsCheckboxColumn

This editor style is at the moment only available in TDBGrid. It can be useful when field contents associated with the column are restricted to a pair of values, for example, yes-no, true-false, on-off

http://wiki.lazarus.freepascal.org/Grids_Reference_Page
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

Может в версии 0.9.26 действительно такого нет, попробуйте установить 0.9.26.2.
Только что попробовал - все работает!
Аватара пользователя
Dark Ichigo
новенький
Сообщения: 44
Зарегистрирован: 12.03.2009 18:06:51
Контактная информация:

Сообщение Dark Ichigo »

Есть контакт!!! Работает, спасибо!

Добавлено спустя 39 минут 26 секунд:
вот если бы понять, как они работают :( что-то не выходит у меня каменный цветок.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Обычно инструмент подбирают под замысел, а не замысел подгоняют под инструмент. :)
Аватара пользователя
Dark Ichigo
новенький
Сообщения: 44
Зарегистрирован: 12.03.2009 18:06:51
Контактная информация:

Сообщение Dark Ichigo »

Собственно, я замысел пока не подгоняю под инструмент.

Пока не могу найти мануала или примера по этим чекбоксам. Сейчас они у меня серого "неактивного" цвета. Если есть возможность, подскажите, пожалуйста.

Добавлено спустя 15 минут 43 секунды:
А. Всё, разобрался. Надо было всего лишь поставить goEditing true в опциях компонента.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

А можно сделать то же самое, но только чтобы чекбоксы были в строчку? Мне надо, чтобы они были в каждом столбце, начиная со второго, и во второй строке.
В принципе, я обхожусь конструкцией

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

StringGrid.Objects[col, row]:=TCheckBox.Create(StringGrid);
TCheckBox(StringGrid.Objects[col, row]).Parent:=StringGrid;

С обработкой события перерисовки ячейки сетки, но если можно сделать проще, будет лучше...
Andrew
новенький
Сообщения: 14
Зарегистрирован: 15.01.2008 22:21:26

Сообщение Andrew »

подскажите пожалуйста
есть stringgrid с колонками содержащие checkbox-ы,
при возникновении события onDrawCell (делаю многострочный заголовок) все checkbox-ы изчезают

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

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
if((aCol=0)and(aRow=0))then
  begin
   IsledGrid.Canvas.Font.Name:='TimesNewRoman';
   IsledGrid.Canvas.Font.Size:=10;
   IsledGrid.Canvas.TextOut(aRect.Left+30,aRect.Top+1,'многострочный');
   IsledGrid.Canvas.TextOut(aRect.Left+14,aRect.Top+14,'заголовок');
  end;
end;

пытался создавать checkbox-ы вручную по примеру
Climber писал(а):А можно сделать то же самое, но только чтобы чекбоксы были в строчку? Мне надо, чтобы они были в каждом столбце, начиная со второго, и во второй строке.
В принципе, я обхожусь конструкцией

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

StringGrid.Objects[col, row]:=TCheckBox.Create(StringGrid);
TCheckBox(StringGrid.Objects[col, row]).Parent:=StringGrid;

С обработкой события перерисовки ячейки сетки, но если можно сделать проще, будет лучше...

но все они отображаються в верхнем левом углу stringgrid-а
пробовал на версиях:
lazarus-0.9.26-fpc-2.2.2
lazarus-0.9.26.2-fpc-2.2.2
Lazarus-0.9.27-20715-fpc-2.2.5-20090623
ОС windows
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Andrew писал(а):пытался создавать checkbox-ы вручную по примеру
Climber писал(а):А можно сделать то же самое, но только чтобы чекбоксы были в строчку? Мне надо, чтобы они были в каждом столбце, начиная со второго, и во второй строке.
В принципе, я обхожусь конструкцией

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

StringGrid.Objects[col, row]:=TCheckBox.Create(StringGrid);
TCheckBox(StringGrid.Objects[col, row]).Parent:=StringGrid;

С обработкой события перерисовки ячейки сетки, но если можно сделать проще, будет лучше...

но все они отображаються в верхнем левом углу stringgrid-а
пробовал на версиях:
lazarus-0.9.26-fpc-2.2.2
lazarus-0.9.26.2-fpc-2.2.2
Lazarus-0.9.27-20715-fpc-2.2.5-20090623
ОС windows

Это только начало примера, объясняющее принцип. Принцип в том, чтобы создать столько чекбоксов, сколько есть ячеек, и каждому чекбоксу в Parent и Owner поставить сетку. Тогда они будут рисоваться только внутри сетки. Чтобы они рисовались там, где надо, надо им задать координаты. По умолчанию они все будут рисоваться в углу.
TCheckBox(StringGrid.Objects[col, row]).Left, TCheckBox(StringGrid.Objects[col, row]).Top и прочие параметры надо вычислять вручную.
Координаты ячейки сетки можно вычислить через StringGrid.CellRect:

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

    function  CellRect(ACol, ARow: Integer): TRect;

По первой чати вопроса ничего сказать не могу.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Andrew
Так Вы же канву клетки перерисовываете, следовательно затираете и рисунок чекбокса. Чекбоксы надо вставлять после перерисовки.
Andrew
новенький
Сообщения: 14
Зарегистрирован: 15.01.2008 22:21:26

Сообщение Andrew »

Vadim писал(а):Andrew
Так Вы же канву клетки перерисовываете, следовательно затираете и рисунок чекбокса. Чекбоксы надо вставлять после перерисовки.

в первом варианте я добавлял checkbox-ы в дезайнере StringGrid.Columns
zmirk
незнакомец
Сообщения: 7
Зарегистрирован: 17.03.2010 12:18:21

Сообщение zmirk »

Vadim писал(а):Dark Ichigo
В дизайнере StringGrid.Columns, создать столько колонок, сколько Вам неоходимо и в той колонке, где нужен чекбокс, выбрать в свойстве колонки ButtonStyle:=cbsCheckboxColumn.


Покажите пожалуйста кусок кода, как Вы их вставили. У меня в свойствах колонки вообще нет ButtonStyle..((
Lazarus 0.9.28.2
Может я не правильно понял что-то.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

zmirk писал(а):Покажите пожалуйста кусок кода,

Гм... Это сделать крайне затруднительно, т.к. я использую для этой цели только свойство компонента в дизайнере и никакого кода.
Давайте попробуем разобраться на словах... ;)
1. Я кладу на форму StringGrid.
2. В левом окошечке (свойства компонента StringGrid) я нахожу свойство Columns.
3. У этого свойства есть кнопочка с тремя точками. Я щёлкаю мышкой по этой кнопочке.
4. В появившемся дополнительном окне я нажимаю кнопку "+ Добавить" и в списке колонок у меня появляется новая колонка.
5. В списке колонок щёлкаю по этой колонке мышкой и в левом окне появляются свойства этой (новой) колонки.
6. В совйстве ButtonStyle выбираю стиль колонки - cbsCheckboxColumn.
Всё. Теперь в этой колонке будут сидеть чекбоксы. Дальнейшая настройка колонки зависит от Ваших задач.
Ответить