Здравствуйте, рассматриваю данную тему — по просьбе читателя моего блога. После того, как он мне задал вопрос: как в TDBGridEh, в полях (в записях), где установлены checkbox (флажки), перенести в другую таблицу. Через пару часов, я скачал последнюю версию библиотеки Ehlib и установил ее. Как мне известно, то в компоненте TDBGridEh, в отличии от того же TDBGrid, присутствует расширенный функционал. Ну что, давайте рассмотрим простой пример. А для начала сформируем наш проект. На форме у меня следующие компоненты:
- TDBGridEh
- TADOQuery
- TADOConnection
- TDataSource
- TButton
Теперь, давайте создадим нашу БД, с которой мы будем работать. Таблица у меня следующей структуры:
То есть, понятно, где у нас будут отображаться checkboxes, там у нас тип Логический, если использовать БД MySQL, то необходимо для данного поля, выбирать тип BOOL.
Теперь давайте настроем немного наши компоненты. Выделяем компонент TADOConnection и свойство LoginPromt устанавливаем в False. Затем, через свойство ConnectionString, подключаемся к нашей БД. Как это сделать, можно посмотреть здесь.
Далее, мы выделяем компонент TDataSource и в свойстве DataSet - выбираем TADOQuery.
После этого, выделяем компонент TADOQuery и в свойстве Connection - выбираем TADOConnection, ну и наконец-то выделяем компонент TDBGridEh и в свойстве DataSource выбираем — TDataSource.
Если, Вы сделали все правильно, то подключение к нашей БД должно работать. Далее, выделяем еще раз компонент TDBGridEh и нажимаем по нему двойным щелчком мыши, после чего должно появиться следующее окно:
В данном окне, мы создаем 2 колонки (TColumns). В свойствах FieldName указываем — id, а второй колонки — checkbox.
В свойстве checkboxes поля, в котором необходимо отображать CheckBox устанавливаем в True (в нашем случае это поле — checkbox).
Теперь необходимо активировать нашу таблицу, для этого на событие формы OnShow напишем следующий код:
procedure TForm1.FormShow(Sender: TObject);
begin
ADOQuery1.SQL.Add('SELECT * FROM TableTest');
ADOQuery1.Active:=True;
end;
Тут все понятно, в прошлых статьях: по работе с БД MS Access, мы рассматривали данный код подробнее.
Ну, а теперь, давайте попробуем добавить какую-нибудь запись и посмотреть, как она храниться в таблице. Для этого, на событие OnClick TButton напишем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Insert;
ADOQuery1.Fields.FieldByName('checkbox').AsVariant:=True;
ADOQuery1.Post;
end;
Что делаем, мы данным кодом: вставляем запись, устанавливаем указатель (флажок), сохраняем запись.
А теперь давайте попробуем вывести значение поля checkbox. Для это напишем следующий код:
procedure TForm1.Button3Click(Sender: TObject);
begin
ADOQuery1.First;
ShowMessage(ADOQuery1.Fields.Fields[1].AsVariant);
end;
Установили указатель на первую запись и вывели результат — сообщением, у меня получилось следующее:
То есть, если указатель установлен, то возвращаться будет True, если нет — False. Все просто.
Ну, а теперь, выборка записей, у которых установлен флажок. Для этого, мы частично, воспользуемся статьей.
Выделяем компонент TADOQuery, в свойстве Parameters - создадим новый параметр, которому в свойстве Name укажем check, а в свойстве DataType - ftBoolean. Все, теперь нам остается написать следующий код:
procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM TableTest WHERE checkbox=:check');
ADOQuery1.Parameters.ParamByName('check').Value:=True;
ADOQuery1.Active:=True;
end;
Все, теперь в нашем запросе находятся все поля, у которых установлен флажок (указатель), и с данными записями можно делать все, что угодно: переносить в другие таблицы, удалять, редактировать и так далее.
Исходник, как всегда, прилагается, качаем его тут (IDE Delphi 7).
Меня как то на одном форуме спросили где можно купить игру монополия, я конечно понял сразу, что это не просто игра, а ещё и тренажёр фортуны.
Похожие записи
Метки: Access, Ado, ADoconnection, AdoQuery, dbgrideh, ehlib, MS Access, sql, tdbgrideh
Большое спасибо за разъяснение Andrey53!!! Реально все наглядно и главное работает. Тронут умением все объяснить, сразу виден профессионализм и знание дела, а главное желание помочь разобраться. Еще раз Огромное Спасибо!!!
Всегда пожалуйста, если что-то необходимо помочь, обращайтесь, буду знать помогу!
А как сделать, чтобы по клику на button1, выделялись все чекбоксы в гриде, и наоборот, по клику на button2 снималось выделение со всех чекбоксов.
Я может глупые вопросы задаю, просто только начинаю программировать…
ну, например, вот так можно
procedure TForm1.Button4Click(Sender: TObject);
var
i:integer;
begin
ADOQuery1.First;
ADOQuery1.Edit;
for i:=0 to ADOQuery1.RecordCount-1 do
begin
ADOQuery1.Edit;
ADOQuery1.Fields.FieldByName(‘checkbox’).AsVariant:=True;
ADOQuery1.Post;
ADOQuery1.Next;
end;
end;
Чтобы снять флажок, то в коде необходимо указать False. Это как один из вариантов
Супер!!! И снова спасибо!!!
Правильнее будет
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
ADOQuery1.Edit;
ADOQuery1.Fields.FieldByName(‘checkbox’).AsVariant:=True;
ADOQuery1.Post;
ADOQuery1.Next;
end;
Нигде не могу найти примера, с арифметическими операциями в ADO DBGRIDEH ACCESS. Я написал SQL запрос, при нажатии на клавишу считает произведение столбцов 1 и 2, а в третьем выводит результат, однако при вводе других данных предыдущие введенные не изменяет и не пересчитывает результат. Не могу понять как реализовать такое действие. Чтобы можно было периодически вводить новые данные в таблицу и чтобы при нажатии на Ок в столбце №3 обновлялся результат. Возможно ли вообще такое в принципе? Если да, то получился бы очередной интересный и познавательный урок по базам данных
возможно такое!!! позже рассмотрю
если тебе нужно пермножить два столбца используй вычисляемое поле… то есть в Query-таблицу добавь поле калькулейтед типа, потом в событии Онкалкфилд обрабатывай, то есть Поле3.asFloat:=Поле1.asFloat*Поле2.asFloat
А как заставить проставляться checkbox в вычисляемом поле? У меня в БД нет поля для хранения checkbox-ов, да оно там в принципе и не нужно. Checkbox-ы мне нужны только для обработки выбранных строк, поэтому я добавил в ADOQuery вычисляемое поле типа boolean, но не могу присвоить ему значение. Подскажите пожалуйста где это можно сделать?
Использую DB2+ADOQuery+DBGridEh
Вычисляемое поле — это поле, в которой вычисляются значение по определенной формуле, я так понял, чтобы когда Вы выделили строки с помощью chexbox, то оно пересчитала все данные этих строк?
Нет, я просто добавил вычисляемое boolean поле для того, чтобы в нем хранить информацию о выделенных строках или я не правильно делаю? Просто у меня в БД негде хранить такую информацию.
в данном поле должна храниться какая информация? что Вы понимаете под информацией в выделенных строках? их количество или что-то еще?
в данном поле должна храниться информация о том выделена ли строка или нет, т.е. 0 или 1
Вы поле с чекбоксами сделали? зачем Вам там отображаться 0 или 1, если у Вас будет поле с чекбоксами и оно итак будет видно поставили Вы чекбокс или нет
например, мне надо удалить выделенные в гриде строки, т.е. в данном поле должна храниться информация о том выделена ли строка или нет. Я видимо неправильно формулирую вопрос — мне надо выполнять какие-либо операции (удаление например) над выделенными строками, но у меня не получается сделать проставление checkbox-ов и получить доступ к списку выделенных строк. В БД у меня нет поля для хранения checkbox-ов
Да действительно хотелось бы узнать, что делать если в базе нет булева поля. Храним в виде 0,1. Как пересчитать в checkbox, чтобы было понятнее для пользователя?
Разобрался, ничего сложного не оказалось, 0 и 1 прекрасно ведут себя.
Интересный блог, кое-что почерпнул для себя
Да это бесспорно будет работать.
Но использование отдельного поля в БД только для Checbox-a очень не оптимально.
почему же? или Вы предлагаете использовать визуальные компоненты
А как при нажатий клавиши выводились таблицы, которые уже связаны. На каждую кнопу, каждой таблицы.