|
Вопрос # 926/ вопрос открыт / |
|
Здравствуйте, эксперты!
Я знаю, что в ячейки компонента DBGrid можно вставить Control - например CheckBox (для логического поля таблицы), а также небольшой рисунок из ImageList (причем рисунок в ячейке DBGrid будет рисоваться компонентом ImageList), а вот как это сделать - что-то не получается. Помогите мне в этом пожалуйста.
 |
Вопрос задала: Игракова Е.А. (статус: Посетитель)
Вопрос отправлен: 15 сентября 2007, 20:07
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Feniks
Здравствуйте, Игракова Е.А.!
Для начала выключите св-во DefaultDrawing у DBGrid.
Вырезки из разных статей...
Вам необходимо обработать событие OnDrawDataCell.
Несколько примеров в приложении.
Приложение: Переключить в обычный режим-
-
- procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const
- Rect: TRect; Field: TField; State: TGridDrawState);
- begin
- if Field.FieldName = 'SERIAL' then
-
- with (Sender as TDBGrid).Canvas do
- begin
- Brush.Color := clRed;
- Font.Style := [fsItalic];
- Font.Color := clAqua;
- FillRect(Rect);
- TextOut(Rect.Left, Rect.Top, Field.AsString);
- end;
- end;
- //---------------------------------------------------------------
- procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect:
- TRect; Field: TField; State: TGridDrawState);
- begin
-
- if Field.FieldName = 'NAME' then
-
- (Sender as TDBGrid).Canvas.Font.Color := clRed;
-
- (Sender as TDBGrid).Canvas.TextRect(Rect, Rect.Left + 2,
- Rect.Top + 2, Field.AsString);
- end;
- //-----------------------------------------------------------------
- procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
- DataCol: Integer; Column: TColumn;
- State: TGridDrawState);
- const
- clPaleGreen = TColor($CCFFCC);
- clPaleRed = TColor($CCCCFF);
- begin
-
- if Column.Field.Dataset.FieldbyName('Status').AsString <> 'a' then
-
-
- else
-
-
- dbgrid1.DefaultDrawColumnCell(rect, DataCol, Column, State)
- end;
- //---------------------------------------------------------------
- procedure DrawGridCheckBox(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_BUTTONPUSH or DFCS_ADJUSTRECT);
- DrawFlags := DFCS_BUTTONCHECK or DFCS_ADJUSTRECT;// DFCS_BUTTONCHECK
- if Checked then
- DrawFlags := DrawFlags or DFCS_CHECKED;
- DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, DrawFlags);
- end;
-
-
-
- procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
- DataCol: Integer; Column: TColumn; State: TGridDrawState);
- begin
-
- if Column.Field.AsInteger > 10 then
- DrawGridCheckBox(DBGrid1.Canvas, Rect, true)
- else
- DrawGridCheckBox(DBGrid1.Canvas, Rect, false)
- end;
-
-
-
- procedure TfrmMain.DBGrid1ColEnter(Sender: TObject);
- begin
- with TDBGrid(Sender) do
-
- Options := Options - [dgEditing]
- else
- Options := Options + [dgEditing]
- end;
- //---------------------------------------------------------------
- procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
- DataCol: Integer; Column: TColumn; State: TGridDrawState);
- var Im1: TBitmap;
- begin
- Im1:=TBitmap.Create;
- if (Column.FieldName='VenueNo' ) then
- begin
- with DBGrid1.Canvas do
- begin
- Brush.Color:=clWhite;
- FillRect(Rect);
- if (Table1.FieldByName('VenueNo').Value=1)
- then begin
- ImageList1.GetBitmap(0,Im1);
- end else begin
- ImageList1.GetBitmap(2,Im1);
- end;
- Draw(round((Rect.Left+Rect.Right-Im1.Width)/2),Rect.Top,Im1);
- end;
- end;
- end;
- //---------------------------------------------------------------
- procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
- Field: TField; State: TGridDrawState);
- begin
- if (gdFocused in State) then
- begin
- if (Field.FieldName = DBCheckBox1.DataField) then
- begin
- DBCheckBox1.Left := Rect.Left + DBGrid1.Left + 1;
- DBCheckBox1.Top := Rect.Top + DBGrid1.top + 1;
- DBCheckBox1.Width := Rect.Right - Rect.Left { - 1};
- DBCheckBox1.Height := Rect.Bottom - Rect.Top { - 1};
- DBCheckBox1.Visible := True;
- end;
- end;
- 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 для логических полей.
Но все равно спасибо за помощь.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|