Стандартный 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.
Смотрите также:
Оставьте свой комментарий
Вы должны быть авторизированны, чтобы оставить комментарий.