CheckBox внутри DBGrid |
![]() |
![]() |
Статьи |
Есть способ разместить CheckBox в DBGrid для редактирования булевых полей в наборе данных. Предположим, что Вы имеете булево поле в наборе данных. По умолчанию, DBGrid отображает такое поле как True или False в зависимости от значения. Создадим простое приложение.Для начала запустим Delphi и разместим на форме TDBGrid, TADOTable, TADOConnection и TDataSource. Оставим все имена, как их определил Delphi. Используйте Если Вы установили все свойства правильно, то когда Вы запустите приложение (если свойство ![]() Что же нужно сделать для того, чтобы наше приложение выглядело, как это, ниже: ![]() Выберите TDBCheckBox на палитре компонентов и поместите его где-нибудь на форме. Затем установите его свойство Visible в False. Измените его свойство Color на тот же самый цвет, что и DBGrid1, чтобы он гармонировал с сеткой и удалите Caption. И, что не менее важно, удостоверьтесь, что DBCheckBox1 связан с DataSource1 и с полем ( Обратите внимание, что все вышеперечисленные свойства могут быть установлены в событии OnCreate формы, например:
Далее более интересная часть. При редактировании булева поля в DBGrid, мы должны удостовериться, что DBCheckBox1 помещен в ячейку DBGrid, в которой отображается булево поле. Для остальной части сетки булево поле также должно быть представлено каким-либо изображением (истинного или ложного значения). Это означает, что мы нуждаемся, как минимум в двух изображениях: одно для истинного значения (True) и одно для ложного значения (False). Самый легкий способ выполнить это состоит в том, чтобы использовать функцию Windows API DrawFrameControl, чтобы рисовать непосредственно на холсте DBGrid. Вот код в обработчике события OnDrawColumnCell, которое происходит, когда сетка должна перерисовывать ячейку:
Чтобы закончить это действие, мы должны удостовериться, что DBCheckBox1 невидим, когда мы покидаем ячейку.
Мы нуждаемся еще в обработке двух событий: перехват нажатия клавиатуры и нажатие на Пробел должен изменять состояние CheckBox.
И, наконец, последнее. Это может быть соответствующий заголовок CheckBox, когда пользователь переключает его. Обратите внимание, что DBCheckBox имеет два свойства (ValueChecked и ValueUnChecked), которые определяют значение поля, представленное переключателем. В нашем случае мы можем записать ValueChecked – Да, а ValueUnChecked – Нет.
Это все! Запустите проект и проверьте действие переключателя. |
Комментарии
..."Вот код в обработчике события OnDrawColumnCel l, которое происходит, когда сетка должна перерисовывать ячейку:"...
в втроке - ..."DrawState := ISChecked[Column.Field.AsBoolean];"...
возникает проблемв, только не пойму где?
Как выводило в таблице True/False, так и выводит. Что не так?
procedure TForm1.DBCheckB ox1Click(Sender : TObject);
begin
if DBCheckBox1.Che cked then
DBCheckBox1.Cap tion := DBCheckBox1.Val ueChecked
else
DBCheckBox1.Cap tion := DBCheckBox1.Val ueUnChecked;
end;
и это не пиши:
//будет разъяснено ниже в статье
DBCheckBox1.Val ueChecked := 'Да';
DBCheckBox1.Val ueUnChecked := 'Нет';
Пришлось запретить
DBGrid1.Options := DBGrid1.Options - [dgColumnResize];
в момент DBCheckBox1.Vis ible := True;
а разрешать
DBGrid1.Options := DBGrid1.Options + [dgColumnResize];
после DBCheckBox1.Vis ible := False;
> Выберите TDBCheckBox на палитре компонентов и поместите его где-нибудь на форме.
Неверно для случаев, если DBGrid1 стоит на каком-нибудь TPageControl. DBCheckBox1 cледует ставить на один уровень в иерархии с DBGrid1.
А в целом спасибо за код!
RSS лента комментариев этой записи