Содержание материала

 

КОМПОНЕНТ #3 - TDBCHECKBOX

Технология работы с компонентом DBCheckBox более интересна. В этом случае нам необходимо дать понять пользователю о наличие компонента DBCheckBox в ячейках без фокуса. Вы можете вставлять статическое изображение компонента или динамически изменять изображение в зависимости от логического состояния элемента управления. Я выбрал второе. Я создал два BMP-файла - включенный (TRUE.BMP) и выключенный (FALSE.BMP) DBCheckBox. Поместите два компонента TImage на форму, присвойте им имена ImageTrue и ImageFalse и назначьте соответствующие BMP-файлы в свойстве Picture. Да, чуть не забыл: Вам также необходимо поместить на форму два компонента DBCheckbox. Установите набор данных обоих компонентов в DataSource1 и присвойстве свойству Color значение clWindow. Для начала создадим для формы обработчик события onCreate:

Code:

procedure TForm1.FormCreate(Sender: TObject);

begin

DBLookupCombo1.Visible := False;

DBCheckBox1.Visible := False;

DBComboBox1.Visible := False;

ImageTrue.Visible := False;

ImageFalse.Visible := False;

end;

 

Теперь нам нужен обработчик события onDrawDataCell чтобы делать что-то с ячейками, не имеющими фокуса. Здесь подойдет следующий код:

 

Code:

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;

Field: TField; State: TGridDrawState);

begin

if (gdFocused in State) then

begin

   if (Field.FieldName = DBLookupCombo1.DataField) then

   begin

     // ...СМОТРИ ВЫШЕ

   end

   else 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

   else if (Field.FieldName = DBComboBox1.DataField) then

   begin

     // ...СМОТРИ ВЫШЕ

   end

end

else {в этом месте помещаем статическое изображение компонента}

begin

   if (Field.FieldName = DBCheckBox1.DataField) then

   begin

     if TableGridDataCheckBox.AsBoolean then

       DBGrid1.Canvas.Draw(Rect.Left, Rect.Top, ImageTrue.Picture.Bitmap)

     else

       DBGrid1.Canvas.Draw(Rect.Left, Rect.Top, ImageFalse.Picture.Bitmap)

   end

end;

end;

 

Самое интересное место - последний участок кода. Он выполняется в случае, когда состояние не равно gdFocused и сам CheckBox находится в колонке. В нем осуществляется проверка данных поля: если они равны True, то выводится рисунок TRUE.BMP, в противном случае - FALSE.BMP. Предварительно я создал два изображения, представляющие собой "слепок" двух логических состояния компонента, теперь будет очень трудно обнаружить отсутствие компонента в ячейках с фокусом и без оного. Теперь напишем обработчик события onColExit:

 

Code:

procedure TForm1.DBGrid1ColExit(Sender: TObject);

begin

If DBGrid1.SelectedField.FieldName = DBLookupCombo1.DataField then

   DBLookupCombo1.Visible := false

else

If DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField then

   DBCheckBox1.Visible := false

else

If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then

   DBComboBox1.Visible := false;

end;

Организуйте обработку события onKeyPress как показано ниже:

Code:

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);

begin

if (key <> chr(9)) then

begin

   if (DBGrid1.SelectedField.FieldName = DBLookupCombo1.DataField) then

   begin

     DBLookupCombo1.SetFocus;

     SendMessage(DBLookupCombo1.Handle, WM_Char, word(Key), 0);

   end

   else if (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) then

   begin

     DBCheckBox1.SetFocus;

     SendMessage(DBCheckBox1.Handle, WM_Char, word(Key), 0);

   end

   else if (DBGrid1.SelectedField.FieldName = DBComboBox1.DataField) then

   begin

     DBComboBox1.SetFocus;

     SendMessage(DBComboBox1.Handle, WM_Char, word(Key), 0);

   end;

end;

end;

 

Наконец, последняя хитрость. Для удобства пользователя заголовку компонента нужно присвоить текущее логическое значение. С самого начала у меня была идея поручить это обработчику события onChange, но проблема в том, что событие может возникнуть неединожды. Итак, я должен снова воспользоваться функцией Windows API и послать компоненту соответствующее значение: "SendMessage(DBCheckBox1.Handle, BM_GetCheck, 0, 0)", которая возвращает 0 в случае если компонент невключен и любое другое число в противном случае.

 

Code:

procedure TForm1.DBCheckBox1Click(Sender: TObject);

begin

if SendMessage(DBCheckBox1.Handle, BM_GetCheck, 0, 0) = 0 then

   DBCheckBox1.Caption := ' ' + 'Ложь'

else

   DBCheckBox1.Caption := ' ' + 'Истина'

end;

 

Это все. Надеюсь, Вы узнали для себя что-то новое. Я пробовал данную технологию с диалоговыми окнами. Делается достаточно просто и великолепно работает. Радует простота реализации. Вам даже не нужно знать как это работает, единственное, что Вам придется - заменить в тексте кода имена вымышленных компонентов на те, которые Вы реально хотите отображать в табличной сетке.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить