Delphi checkox в DBgrid - PullRequest
       40

Delphi checkox в DBgrid

0 голосов
/ 17 мая 2018

У меня есть приложение в Delphi 10.1.Мы использовали компонент DBGrid на форме.Я хотел добавить флажок в первом столбце сетки.Поэтому на ячейке сетки добавлен следующий код:

const
CtrlState: array [boolean] of integer = 
 (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK
or DFCS_CHECKED);   
var
  style: UINT;
 begin

if (Column.Field.DataType = ftBoolean) then
begin

dbGrid1.Canvas.FillRect(Rect);
if VarIsNull(Column.Field.Value) then
  DrawFrameControl(dbGrid1.Canvas.Handle, Rect, DFC_BUTTON,
    DFCS_BUTTONCHECK or DFCS_INACTIVE) { grayed }
else
  DrawFrameControl(dbGrid1.Canvas.Handle, Rect, DFC_BUTTON,
    CtrlState[Column.Field.AsBoolean]); { checked or unchecked }
end;

Флажок добавлен в первый столбец, но вместе с заголовком, как показано ниже:

enter image description here

Как мне удалить подпись True или False?

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Мне удалось решить эту проблему, присвоив свойству DisplayValues ​​моего логического поля пустые значения, такие как TField.DisplayValues: = ';'.

Обратите внимание, что вы можете изменить то, что будет отображаться в вашей ячейке DBGrid, вместо True / False. Например, вы можете изменить его, чтобы показывать Да / Нет, установив TField.DisplayValues: = 'Да; Нет'. Поэтому, если вы установите пустые значения, ничего не будет показано.

P.S. Я использую Delphi XE3.

0 голосов
/ 18 мая 2018

Ответом на вашу непосредственную проблему является использование кода, подобного следующему:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.Field.DataType = ftBoolean then begin
    dbGrid1.Canvas.FillRect(Rect);
    if VarIsNull(Column.Field.Value) then
      DrawFrameControl(dbGrid1.Canvas.Handle, Rect, DFC_BUTTON,
        DFCS_BUTTONCHECK or DFCS_INACTIVE) { grayed }
    else
      DrawFrameControl(dbGrid1.Canvas.Handle, Rect, DFC_BUTTON,
        CtrlState[Column.Field.AsBoolean]); { checked or unchecked }
  end
  else begin
    DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.Options := DBGrid1.Options + [dgEditing];
  DBGrid1.DefaultDrawing := False;
  CDS1.CreateDataSet;
  CDS1.InsertRecord([1, True]);
  CDS1.InsertRecord([2, False]);
  CDS1.First;
end;

(CDS1 - это TClientDataSet с полем ftAutoInc и ftBoolean)

Как вы увидитеустановка значения DefaultDrawing сетки в значение False предотвращает отрисовку заголовка логического поля в DBGrid.

Не надейтесь, однако, слишком сильно, потому что если вы щелкнете по одному из флажков, вы сразу увидите проблему с этой ограниченной реализацией поддержки флажков: щелчок флажка активирует сетку на местередактор, который заменяет изображение флажка текстом редактирования для поля ftBoolean, а именно «True» или «False».Однако, ваш вопрос не спрашивал о редактировании, поэтому этот ответ должен остановиться здесь, я думаю.

Если вам нужна более полная поддержка флажков, просто установите флажок google

delphi dbgrid

и, в первом попадании,

CheckBox в DBGrid

второй ответ должен сказать вам немного больше,Кроме того, я думаю, вы обнаружите, что многие сторонние замены DBGrid включают поддержку флажков и т. Д.

...