FoxBase!
msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

30.12.2010 CheckBox для TDBGrid

CheckBox TDBGrid
Стандартный TDBGrid в Delphi обладает многими недостатками, один из которых невозможность использования CheckBox-а для какого либо поля. Часто только это обстоятельство заставляет некоторых разработчиков искать сторонние компоненты-аналоги TDBGrid. Другие являются консерваторами и пытаются добавить недостающую функциональность в стандартный TDBGrid. В этой заметке приведено одно из решений, найденное когда-то на просторах сети и успешно применяемое на практике.
Для отрисовки CheckBox-а используем следующую универсальную процедуру:

procedure DrawCheckBox(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_ADJUSTRECT or DFCS_BUTTONPUSH);
  DrawFlags := DFCS_ADJUSTRECT or DFCS_BUTTONCHECK;
  if Checked then
    DrawFlags := DFCS_CHECKED or DrawFlags;
  DrawFrameControl(Canvas.Handle,Rect,DFC_BUTTON,DrawFlags);
end;
В вашем TDBGrid определяем событие OnDrawColumnCell примерно таким образом:

procedure TForm1.my_gridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = 'CHECKED' then
  if Column.Field.AsString = 'Y' then
    DrawCheckBox(words_grid.Canvas, Rect, true)
  else
    DrawCheckBox(words_grid.Canvas, Rect, false)
end;
Этот код проверяет поле, которое должно быть CheckBox-ом, в нашем случае это поле с именем CHECKED, и его значение, которое может быть Y или N
Чтобы запретить редактирование поля в событии OnColEnter пишем следующий код:

procedure TForm1.my_gridColEnter(Sender: TObject);
begin
  with TDBGrid(Sender) do
    if SelectedField.FieldName = 'CHECKED' then
      Options := Options - [dgEditing]
    else
      Options := Options + [dgEditing]
end;
И для записи значения поля при срабатывании CheckBox-а в событии OnCellClick напишем:

procedure TForm1.my_gridCellClick(Column: TColumn);
begin
  if Column.FieldName = 'CHECKED' then
  begin
    my_dataset.Edit;
    if Column.Field.AsString = 'Y' then
      my_dataset.FieldByName('CHECKED').AsString:='N'
    else
      my_dataset.FieldByName('CHECKED').AsString:='Y';
    my_dataset.Post;
  end;
end;
Если вы хотите, чтобы CheckBox срабатывал на определенную клавишу, например пробел, то необходимо определить событие OnKeyPress:

procedure TForm1.my_gridKeyPress(Sender: TObject; var Key: Char);
begin
  with TDBGrid(Sender) do
  if (SelectedField.FieldName = 'CHECKED') and (Key=' ') then
  begin
    my_dataset.Edit;
    if my_dataset.FieldByName('CHECKED').AsString = 'Y' then
      my_dataset.FieldByName('CHECKED').AsString:='N'
    else
      my_dataset.FieldByName('CHECKED').AsString:='Y';
    my_dataset.Post;
  end;
end;
Решение не очень изящное, но позволяет не искать дополнительные компоненты аналоги TDBGrid, если необходим только CheckBox в TDBGrid

www.foxbase.ru


Смотрите также:



Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.