Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2014, 13:57   #1
harmager
Пользователь
 
Регистрация: 24.11.2008
Сообщений: 16
По умолчанию CheckBox в ячейках DBGrid

Доброго времени суток, уважаемые форумчане.
Проблема состоит в следующем: мне необходимо поместить в ячейки определённого столбца
компонента DBGrid компонент CheckBox. Стоит отметить, что столбец, в котором должны располагаться
Checkbox не должен быть связан с набором данных. Таким образом (насколько я помню) возможность
использования компонента DBGridEh отпадает.
Создание CheckBox в ячейке DBGrid выполняю на основе примера, который наверника все видели в интернете.
Код:

procedure DrawGridCheckBox(Canvas: TCanvas; Rect: TRect; Checked: boolean);
var
  DrawFlags: Integer;
begin
  Canvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, ' ');
  DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_ADJUSTRECT);
  DrawFlags := DFCS_BUTTONCHECK or DFCS_ADJUSTRECT;// DFCS_BUTTONCHECK
  if Checked then
    DrawFlags := DrawFlags or DFCS_CHECKED;
  DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DrawFlags);
end;

На событие OnDrawColumnCell повесьте вызов процедуры DrawGridCheckBox():


procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = 'WEIGHT' then // Модифицируйте под себя
    if Column.Field.AsInteger > 10 then
      DrawGridCheckBox(DBGrid1.Canvas, Rect, true)
    else
      DrawGridCheckBox(DBGrid1.Canvas, Rect, false)
end;

Кроме этого, для скрытия текста в ячейках с CheckBox-ом от отображения значения при вводе с клавиатуры определите реакцию на событие OnColumnEnter:


procedure TfrmMain.DBGrid1ColEnter(Sender: TObject);
begin
  with TDBGrid(Sender) do
    if SelectedField.FieldName = 'Weight' then // Модифицируйте под себя
      Options := Options - [dgEditing]
    else
      Options := Options + [dgEditing]
end;
Код работает отлично. Однако, я не могу реализовать поведения checbox при действиях пользователя.
Например, если пользователь кликнул на конкретном Checbox, нарисовать галку или, если же он
уже отмечен, убрать галку. В итоге также необходимо определить какие Checkbox отмечены.

Я копал в сторону события DBGrid1CellClick. Однако, не могу понять, как
управлять флагами, чтобы реализовать задуманное.
Заранее благодарен.
harmager вне форума Ответить с цитированием
Старый 17.02.2014, 21:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Колонка у вас привязана к полю, только отображает не его значение, а некую картинку, зависящую от значения, в данном случае чекбокс. Ну и редактируете это поле в OnCellClick, прорисовка отреагирует на это. Не забывайте перед редактирование проверить статус, что бы повторно к Edit не обратиться
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.02.2014, 14:24   #3
harmager
Пользователь
 
Регистрация: 24.11.2008
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Колонка у вас привязана к полю, только отображает не его значение, а некую картинку, зависящую от значения, в данном случае чекбокс. Ну и редактируете это поле в OnCellClick, прорисовка отреагирует на это. Не забывайте перед редактирование проверить статус, что бы повторно к Edit не обратиться
В том и дело, что колонка к полю не привязана. Колонка просто создана в DBGrid. Мне не надо привязывать её к полю.

Переделал код.
Код:
procedure DrawGridCheckBox(Canvas: TCanvas; Rect: TRect; Checked: boolean);
var
DrawFlags: Integer;
begin
  Canvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, ' ');
  DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_ADJUSTRECT);
  Checked:= status;
  if Checked then
    DrawFlags := DFCS_CHECKED
  else
    DrawFlags := DFCS_BUTTONCHECK or DFCS_ADJUSTRECT;// DFCS_BUTTONCHECK
  DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DrawFlags);

end;



procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (Column.Index = 1) then
      DrawGridCheckBox(DBGrid1.Canvas, Rect, status);


end;


procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
   if (Column.Index = 1) then
    if (status = true) then
   status:= false
     else
   status:= true;


end;
Здесь проблема и состоит в том, что невозможно (конечно, моё утверждение) определить, какой нарисованный chechbox нарисовать в состоянии checked, а какой в состоянии unckecked, и как определить в последующем, какое состояние они имеют.
harmager вне форума Ответить с цитированием
Старый 18.02.2014, 14:36   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
В том и дело, что колонка к полю не привязана.
В этом примере нет, а в первом была:
Код:
  if Column.FieldName = 'WEIGHT' then // Модифицируйте под себя
    if Column.Field.AsInteger > 10 then
Так или иначе вам придется привязывать. Не хотите в датасете поле для этого, значит держите некий массив соответствующий записям датасета, или массив Bookmark-ов для записей, где чекед=труе
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.03.2014, 18:01   #5
Onwado
Пользователь
 
Аватар для Onwado
 
Регистрация: 17.12.2013
Сообщений: 10
По умолчанию

Зачем отрисосвывть реальный чекбокс? Проще отрисовывать картинки с изображением чекера; состояние чекеров хранить в массиве, менять в обработчике кликов по гриду.

Код:
if s[i] = 0 then
 IconIndex := 74
else
 IconIndex := 75;
ilActionIcon.Draw(rDBGrid.Canvas, Rect.Left, Rect.Top + 1,IconIndex);
Визуальное программирование: https://createmyvisualdatabaseapp.blogspot.com
Onwado вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выделение строк в ячейках которых повторяются значения в dbgrid silent_lab Общие вопросы Delphi 12 23.03.2013 11:49
В 2-ух столбцах DBGrid Checkbox Zofk Общие вопросы Delphi 0 13.06.2012 19:21
CheckBox в DBGrid Impuls1989 Общие вопросы Delphi 4 07.08.2010 14:27
В ячейках DBGrid изображается поле типа text как (Memo) belartvlad29 БД в Delphi 2 18.07.2010 14:36
checkbox & dbgrid Mihailhome БД в Delphi 4 19.05.2009 08:42