powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
18 сообщений из 18, страница 1 из 1
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #39819151
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу вместо True/False для битовых полей выводить CheckBox.

В сети пример находится на раз. http://www.delphisources.ru/pages/faq/base/checkbox_in_dbgrid.html Немного меняю его.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure DrawGridCheckBox(Canvas: TCanvas; Rect: TRect;
  Checked: boolean);
var DrawFlags: Integer;
begin
Canvas.FillRect(Rect);//Это нужно, чтобы цвет был нормальный
//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;
if Checked then
  DrawFlags := DrawFlags or DFCS_CHECKED;
DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DrawFlags);
end;



Вызываю DrawGridCheckBox(Grid.Canvas, Rect, Field.Value); в onDrawDataCell или то же самое, только Field у Column беру в DrawColumnCell, разницы не заметил.

Прога использует один из стандартных стилей, которые идут с Delphi. Которые в Project->Options->Application->Appereance.

Проблема: Когда строка выделена, то мой checkbox рисуется просто поверх True/False так что эти слова видны. Если использовать стандартный стиль, то проблема не наблюдается, но выглядит уныло.

Как сделать так, чтобы рисовало корректно даже с темами? Или на что халявное заменить стандартный TdbGrid, что могло бы рисовать чек-боксы из коробки. Умеет ли это делать dbGrid из JVCL? Всю JVCL я ставить не хочу, но один контрол можно и утянуть.
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #39819233
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите, как рисуется CheckBox в зависимости от темы в TCheckListBox
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
procedure TCheckListBox.DrawCheck(const R: TRect; AState: TCheckBoxState; AEnabled: Boolean);
var
  DrawState: Integer;
  DrawRect: TRect;
  OldBrushColor: TColor;
  OldBrushStyle: TBrushStyle;
  OldPenColor: TColor;
  ElementDetails: TThemedElementDetails;
  ExRect: TRect;
  SaveIndex: Integer;
begin
  DrawRect.Left := R.Left + (R.Right - R.Left - FCheckWidth) div 2;
  DrawRect.Top := R.Top + (R.Bottom - R.Top - FCheckHeight) div 2;
  DrawRect.Right := DrawRect.Left + FCheckWidth;
  DrawRect.Bottom := DrawRect.Top + FCheckHeight;
  with Canvas do
  begin
    if ThemeControl(Self) then
    begin
      case AState of
        cbChecked:
          if AEnabled then
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxCheckedNormal)
          else
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxCheckedDisabled);
        cbUnchecked:
          if AEnabled then
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxUncheckedNormal)
          else
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxUncheckedDisabled)
        else // cbGrayed
          if AEnabled then
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxMixedNormal)
          else
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxMixedDisabled);
      end;
      SaveIndex := SaveDC(Handle);
      try
        IntersectClipRect(Handle, R.Left, R.Top, R.Right, R.Bottom);
        StyleServices.DrawElement(Handle, ElementDetails, R);
      finally
        RestoreDC(Handle, SaveIndex);
      end;
    end
    else
    begin
      case AState of
        cbChecked:
          DrawState := DFCS_BUTTONCHECK or DFCS_CHECKED;
        cbUnchecked:
          DrawState := DFCS_BUTTONCHECK;
        else // cbGrayed
          DrawState := DFCS_BUTTON3STATE or DFCS_CHECKED;
      end;
      if not AEnabled then
        DrawState := DrawState or DFCS_INACTIVE;
      DrawFrameControl(Handle, DrawRect, DFC_BUTTON, DrawState);
    end;

    if Flat then
    begin
      { Clip the 3d checkbox }
      OldBrushStyle := Brush.Style;
      OldBrushColor := Brush.Color;
      OldPenColor := Pen.Color;

      Brush.Style := bsClear;
      if TStyleManager.IsCustomStyleActive then
        Pen.Color := StyleServices.GetStyleColor(scListBox)
      else
        Pen.Color := Color;
      with DrawRect do
        Rectangle(Left, Top, Right, Bottom);

      { Draw flat rectangle in-place of clipped 3d checkbox above }
      Brush.Style := bsClear;
      if TStyleManager.IsCustomStyleActive then
        Pen.Color := StyleServices.GetSystemColor(clBtnShadow)
      else
        Pen.Color := clBtnShadow;
      with DrawRect do
        Rectangle(Left + 1, Top + 1, Right - 1, Bottom - 1);
      SaveIndex := SaveDC(Handle);
      try
        ExRect := Rect(R.Left, R.Top, DrawRect.Right + 2, R.Bottom);
        Brush.Style := bsSolid;
        if TStyleManager.IsCustomStyleActive then
          Brush.Color := StyleServices.GetStyleColor(scListBox)
        else
          Brush.Color := Color;
        ExcludeClipRect(Handle, DrawRect.Left, DrawRect.Top, DrawRect.Right, DrawRect.Bottom);
        FillRect(ExRect);
      finally
        RestoreDC(Handle, SaveIndex);
        Brush.Style := bsClear;
      end;
      Brush.Style := OldBrushStyle;
      Brush.Color := OldBrushColor;
      Pen.Color := OldPenColor;
    end;
  end;
end;

...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #39819264
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока сделал через ж... т. е. через создание таблички текстов для True/False, пустое поле для них и Lookup-поле, ссылающиеся на эту пустышку, с рисованием поверх него и доставанием нужного значения через то же самое место.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TfmMain.dbgSealsDrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var Grid:TDBGrid;
begin
if ((Field.FieldKind=fkLookup) and (Field.Tag=1)) then
  begin
  Grid:=Sender as TdbGrid;
  DrawGridCheckBox(Grid.Canvas, Rect, Grid.DataSource.DataSet.FieldByName(Field.KeyFields).AsBoolean);
  end;
end;
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #39819269
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причём тут " создание таблички текстов для True/False, пустое поле для них и Lookup-поле" и рисование ЧекБокса ?
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #39819283
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
procedure DrawCheck(Grid: TDBGrid; const R: TRect; AState: TCheckBoxState; AEnabled: Boolean);
var
  DrawState: Integer;
  DrawRect: TRect;
  OldBrushColor: TColor;
  OldBrushStyle: TBrushStyle;
  OldPenColor: TColor;
  ElementDetails: TThemedElementDetails;
  ExRect: TRect;
  SaveIndex: Integer;
  FCheckWidth, FCheckHeight: integer;
begin
  FCheckWidth := 15; FCheckHeight := 15;
  DrawRect.Left := R.Left + (R.Right - R.Left - FCheckWidth) div 2;
  DrawRect.Top := R.Top + (R.Bottom - R.Top - FCheckHeight) div 2;
  DrawRect.Right := DrawRect.Left + FCheckWidth;
  DrawRect.Bottom := DrawRect.Top + FCheckHeight;
  with Grid.Canvas do
  begin
    if ThemeControl(Grid) then
    begin
      case AState of
        cbChecked:
          if AEnabled then
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxCheckedNormal)
          else
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxCheckedDisabled);
        cbUnchecked:
          if AEnabled then
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxUncheckedNormal)
          else
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxUncheckedDisabled)
        else // cbGrayed
          if AEnabled then
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxMixedNormal)
          else
            ElementDetails := StyleServices.GetElementDetails(tbCheckBoxMixedDisabled);
      end;
      SaveIndex := SaveDC(Handle);
      try
        IntersectClipRect(Handle, R.Left, R.Top, R.Right, R.Bottom);
        StyleServices.DrawElement(Handle, ElementDetails, R);
      finally
        RestoreDC(Handle, SaveIndex);
      end;
    end
    else
    begin
      case AState of
        cbChecked:
          DrawState := DFCS_BUTTONCHECK or DFCS_CHECKED;
        cbUnchecked:
          DrawState := DFCS_BUTTONCHECK;
        else // cbGrayed
          DrawState := DFCS_BUTTON3STATE or DFCS_CHECKED;
      end;
      if not AEnabled then
        DrawState := DrawState or DFCS_INACTIVE;
      DrawFrameControl(Handle, DrawRect, DFC_BUTTON, DrawState);
    end;
  end;
end;


type THask = class(TCustomGrid);
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const S:array[boolean] of TCheckBoxState = (cbUnchecked, cbChecked);
begin
  if Column.Field.DataType = ftBoolean then
    with THask(Sender) do begin
      DrawCellBackground(Rect,Color,State,0,0);
      DrawCheck(DBGrid1,Rect,S[Column.Field.AsBoolean],true);
    end;
end;

...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #39819284
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #39819346
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У TCustomGrid есть метод DrawCheck?
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #39819406
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrawCheck есть в приведённом коде, который просто скопирован из TCheckListBox.DrawCheck
Похоже что вы вообще не читаете то что я вам отвечаю
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068816
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер
А почему у меня ругается на
Код: pascal
1.
Column.Field.DataType

?
Во многих примерах это есть....
Спасибо.
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068818
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
А почему у меня ругается
Матом?
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068819
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот реально.
Надо в стандартном компоненте DBGrid отрисовать галочку длч поля булеан и потом созранять в базе.
Спасибо.
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068829
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНадо в стандартном компоненте DBGrid отрисовать галочку длч поля булеан и потом созранять в базе.
Рисуйте, разрешаю ! Благо в инете примеров множество
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068830
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
delphi 10.3 указывает что тут Column.Field.DataType ошибка.
undeclared identifier field
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068835
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068845
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А у меня его нет, этого варианта.
Про это и был вопрос.
На одном комре стоит Рио - там нормально, второй такой же - нет.
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068853
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень сомневаюсь, что это свойство (и другие Font, FieldName) выпилили из TColumn
Скорее вы вставили код процедуры, без объявления её в декларации формы (о чём подсказывает красное подчёркивание названия процедуры)
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40068972
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,
Бездумный copy-paste - наше всё!
...
Рейтинг: 0 / 0
Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
    #40069026
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

Бывает еще и безумный :) Там вообще спецэффекты в каждом углу :)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Корректно отрисовать checkBox в dbGrid или компонент, который это умеет.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]