Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 926

/ вопрос открыт /

Здравствуйте, эксперты!
Я знаю, что в ячейки компонента DBGrid можно вставить Control - например CheckBox (для логического поля таблицы), а также небольшой рисунок из ImageList (причем рисунок в ячейке DBGrid будет рисоваться компонентом ImageList), а вот как это сделать - что-то не получается. Помогите мне в этом пожалуйста.

Игракова Е.А. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Игракова Е.А. (статус: Посетитель)
Вопрос отправлен: 15 сентября 2007, 20:07
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Игракова Е.А.!
Для начала выключите св-во DefaultDrawing у DBGrid.
Вырезки из разных статей...

Вам необходимо обработать событие OnDrawDataCell.
Несколько примеров в приложении.

Приложение:
  1.  
  2.  
  3. procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const
  4. Rect: TRect; Field: TField; State: TGridDrawState);
  5. begin
  6. if Field.FieldName = 'SERIAL' then
  7.  
  8. with (Sender as TDBGrid).Canvas do
  9. begin
  10. Brush.Color := clRed;
  11. Font.Style := [fsItalic];
  12. Font.Color := clAqua;
  13. FillRect(Rect);
  14. TextOut(Rect.Left, Rect.Top, Field.AsString);
  15. end;
  16. end;
  17. //---------------------------------------------------------------
  18. procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect:
  19. TRect; Field: TField; State: TGridDrawState);
  20. begin
  21.  
  22. if Field.FieldName = 'NAME' then
  23.  
  24. (Sender as TDBGrid).Canvas.Font.Color := clRed;
  25.  
  26. (Sender as TDBGrid).Canvas.TextRect(Rect, Rect.Left + 2,
  27. Rect.Top + 2, Field.AsString);
  28. end;
  29. //-----------------------------------------------------------------
  30. procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  31. DataCol: Integer; Column: TColumn;
  32. State: TGridDrawState);
  33. const
  34. clPaleGreen = TColor($CCFFCC);
  35. clPaleRed = TColor($CCCCFF);
  36. begin
  37.  
  38. if Column.Field.Dataset.FieldbyName('Status').AsString <> 'a' then
  39.  
  40.  
  41. else
  42.  
  43.  
  44. dbgrid1.DefaultDrawColumnCell(rect, DataCol, Column, State)
  45. end;
  46. //---------------------------------------------------------------
  47. procedure DrawGridCheckBox(Canvas: TCanvas; Rect: TRect; Checked: boolean);
  48. var
  49. DrawFlags: Integer;
  50. begin
  51. Canvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, ' ');
  52. DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_ADJUSTRECT);
  53. DrawFlags := DFCS_BUTTONCHECK or DFCS_ADJUSTRECT;// DFCS_BUTTONCHECK
  54. if Checked then
  55. DrawFlags := DrawFlags or DFCS_CHECKED;
  56. DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DrawFlags);
  57. end;
  58.  
  59.  
  60.  
  61. procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  62. DataCol: Integer; Column: TColumn; State: TGridDrawState);
  63. begin
  64.  
  65. if Column.Field.AsInteger > 10 then
  66. DrawGridCheckBox(DBGrid1.Canvas, Rect, true)
  67. else
  68. DrawGridCheckBox(DBGrid1.Canvas, Rect, false)
  69. end;
  70.  
  71.  
  72.  
  73. procedure TfrmMain.DBGrid1ColEnter(Sender: TObject);
  74. begin
  75. with TDBGrid(Sender) do
  76.  
  77. Options := Options - [dgEditing]
  78. else
  79. Options := Options + [dgEditing]
  80. end;
  81. //---------------------------------------------------------------
  82. procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  83. DataCol: Integer; Column: TColumn; State: TGridDrawState);
  84. var Im1: TBitmap;
  85. begin
  86. Im1:=TBitmap.Create;
  87. if (Column.FieldName='VenueNo' ) then
  88. begin
  89. with DBGrid1.Canvas do
  90. begin
  91. Brush.Color:=clWhite;
  92. FillRect(Rect);
  93. if (Table1.FieldByName('VenueNo').Value=1)
  94. then begin
  95. ImageList1.GetBitmap(0,Im1);
  96. end else begin
  97. ImageList1.GetBitmap(2,Im1);
  98. end;
  99. Draw(round((Rect.Left+Rect.Right-Im1.Width)/2),Rect.Top,Im1);
  100. end;
  101. end;
  102. end;
  103. //---------------------------------------------------------------
  104. procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  105. Field: TField; State: TGridDrawState);
  106. begin
  107. if (gdFocused in State) then
  108. begin
  109. if (Field.FieldName = DBCheckBox1.DataField) then
  110. begin
  111. DBCheckBox1.Left := Rect.Left + DBGrid1.Left + 1;
  112. DBCheckBox1.Top := Rect.Top + DBGrid1.top + 1;
  113. DBCheckBox1.Width := Rect.Right - Rect.Left { - 1};
  114. DBCheckBox1.Height := Rect.Bottom - Rect.Top { - 1};
  115. DBCheckBox1.Visible := True;
  116. end;
  117. end;
  118. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 17 сентября 2007, 13:37
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 18 сентября 2007, 23:58; участников в обсуждении: 2.
Игракова Е.А.

Игракова Е.А. (статус: Посетитель), 15 сентября 2007, 20:16 [#1]:

обработка рисования Control -ов и значков-картинок в ячейках DBGrid происходит методом DrawColumnCell
Вадим К

Вадим К (статус: Академик), 16 сентября 2007, 14:59 [#2]:

Есть хороший сайт по делфи, где многие вещи показывают в виде видео. посмотрите одно с таких видео здесь
http://www.codegearguru.com/video/024/OnDrawColumnCell.html
оно как раз посвящено проблеме дополнительной отрисовки. Если после этого будут проблемы - пишите
Галочка "подтверждения прочтения" - вселенское зло.
Игракова Е.А.

Игракова Е.А. (статус: Посетитель), 18 сентября 2007, 23:58 [#3]:

По поводу отрисовки иконок в DBGrid методом ImageList я разобралась надо было всего лишь поменять местами операторы в процедуре DBGrid1.DrawColumnCell:
//операторы:
if (Column.FieldName = \'img\') and (DBGrig1.DataSource.DataSet.FieldByName(\'PK\').AsInteger = 12) then
// ImageList рисует иконку на канве DBGrid
ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,Img);
//обязательно надо ставить после
...
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);


А вот рисовать CheckBox все равно не получилось - ругается Делфи на переменные DFCS_CHECKED и DFCS_BUTTONCHECK - Некомпилируемые типы (почему непонятно, может что-то упустила). Ну да бог с этим - Есть хорошие компоненты EhLib - там аналог DBGrid сам рисует CheckBox для логических полей.

Но все равно спасибо за помощь.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.03 сек.