Технология работы с компонентом DBCheckBox более интересна. В этом случае нам необходимо дать понять пользователю о наличие компонента DBCheckBox в ячейках без фокуса. Вы можете вставлять статическое изображение компонента или динамически изменять изображение в зависимости от логического состояния элемента управления. Я выбрал второе. Я создал два BMP-файла - включенный (TRUE.BMP) и выключенный (FALSE.BMP) DBCheckBox. Поместите два компонента TImage на форму, присвойте им имена ImageTrue и ImageFalse и назначьте соответствующие BMP-файлы в свойстве Picture. Да, чуть не забыл: Вам также необходимо поместить на форму два компонента DBCheckbox. Установите набор данных обоих компонентов в DataSource1 и присвойстве свойству Color значение clWindow. Для начала создадим для формы обработчик события onCreate:
procedure TForm1.FormCreate(Sender: TObject); begin DBLookupCombo1.Visible := False;DBCheckBox1.Visible := False;DBComboBox1.Visible := False;ImageTrue.Visible := False;ImageFalse.Visible := False;end; |
Теперь нам нужен обработчик события onDrawDataCell чтобы делать что-то с ячейками, не имеющими фокуса. Здесь подойдет следующий код:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);begin if (gdFocused in State) thenbeginif (Field.FieldName = DBLookupCombo1.DataField) thenbegin...СМОТРИ ВЫШЕendelse if (Field.FieldName = DBCheckBox1.DataField) thenbeginDBCheckBox1.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;endelse if (Field.FieldName = DBComboBox1.DataField) thenbegin...СМОТРИ ВЫШЕendendelse {в этом месте помещаем статическое изображение компонента}beginif (Field.FieldName = DBCheckBox1.DataField) thenbeginif TableGridDataCheckBox.AsBoolean thenDBGrid1.Canvas.Draw(Rect.Left,Rect.Top,ImageTrue.Picture.Bitmap)elseDBGrid1.Canvas.Draw(Rect.Left,Rect.Top,ImageFalse.Picture.Bitmap)endend; |
procedure TForm1.DBGrid1ColExit(Sender: TObject); begin If DBGrid1.SelectedField.FieldName = DBLookupCombo1.DataField thenDBLookupCombo1.Visible := falseelse If DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField thenDBCheckBox1.Visible := falseelse If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField thenDBComboBox1.Visible := false;end; |
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if (key <> chr(9)) thenbeginif (DBGrid1.SelectedField.FieldName = DBLookupCombo1.DataField) thenbeginDBLookupCombo1.SetFocus;SendMessage(DBLookupCombo1.Handle, WM_Char, word(Key), 0);endelse if (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField)then beginDBCheckBox1.SetFocus;SendMessage(DBCheckBox1.Handle, WM_Char, word(Key), 0);endelse if (DBGrid1.SelectedField.FieldName = DBComboBox1.DataField)then beginDBComboBox1.SetFocus;SendMessage(DBComboBox1.Handle, WM_Char, word(Key), 0);end;end;end; |
procedure TForm1.DBCheckBox1Click(Sender: TObject); begin if SendMessage(DBCheckBox1.Handle, BM_GetCheck, 0, 0) = 0 thenDBCheckBox1.Caption := ' ' + 'Ложь'elseDBCheckBox1.Caption := ' ' + 'Истина'end; |