Здравствуйте, рассматриваю данную тему — по просьбе читателя моего блога. После того, как он мне задал вопрос: как в 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.

Название полей, в свойстве FieldName, должно совпадать — с названием полей, в таблице MS Access (В нашем случае в таблице TableTest)

В свойстве 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. Все просто.

При использовании БД MySQL и поля BOOL для установки флажков, результатом будет вместо True/False — значение 1 или 0. 1 — установлен флажок, 0 — не установлен

Ну, а теперь, выборка записей, у которых установлен флажок. Для этого, мы частично, воспользуемся статьей.

Выделяем компонент 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).


Меня как то на одном форуме спросили где можно купить игру монополия, я конечно понял сразу, что это не просто игра, а ещё и тренажёр фортуны.


Метки: , , , , , , , ,




К записи “Библиотека Ehlib. Компонент TDBGridEh. Установка checkboxes в ячейках” оставлено комментариев: 21.

  1. zerdalert:

    Большое спасибо за разъяснение Andrey53!!! Реально все наглядно и главное работает. Тронут умением все объяснить, сразу виден профессионализм и знание дела, а главное желание помочь разобраться. Еще раз Огромное Спасибо!!!

    • Andrey53:

      Всегда пожалуйста, если что-то необходимо помочь, обращайтесь, буду знать помогу!

  2. zerdalert:

    А как сделать, чтобы по клику на button1, выделялись все чекбоксы в гриде, и наоборот, по клику на button2 снималось выделение со всех чекбоксов.
    Я может глупые вопросы задаю, просто только начинаю программировать…

    • Andrey53:

      ну, например, вот так можно
      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. Это как один из вариантов

  3. zerdalert:

    Супер!!! И снова спасибо!!! :)

  4. Алесандр:

    Правильнее будет

    ADOQuery1.First;
    while not ADOQuery1.Eof do
    begin
    ADOQuery1.Edit;
    ADOQuery1.Fields.FieldByName(‘checkbox’).AsVariant:=True;
    ADOQuery1.Post;

    ADOQuery1.Next;
    end;

  5. zerdalert:

    Нигде не могу найти примера, с арифметическими операциями в ADO DBGRIDEH ACCESS. Я написал SQL запрос, при нажатии на клавишу считает произведение столбцов 1 и 2, а в третьем выводит результат, однако при вводе других данных предыдущие введенные не изменяет и не пересчитывает результат. Не могу понять как реализовать такое действие. Чтобы можно было периодически вводить новые данные в таблицу и чтобы при нажатии на Ок в столбце №3 обновлялся результат. Возможно ли вообще такое в принципе? Если да, то получился бы очередной интересный и познавательный урок по базам данных :)

  6. Delphi скилловичок:

    если тебе нужно пермножить два столбца используй вычисляемое поле… то есть в Query-таблицу добавь поле калькулейтед типа, потом в событии Онкалкфилд обрабатывай, то есть Поле3.asFloat:=Поле1.asFloat*Поле2.asFloat

  7. Nikolas_T:

    А как заставить проставляться checkbox в вычисляемом поле? У меня в БД нет поля для хранения checkbox-ов, да оно там в принципе и не нужно. Checkbox-ы мне нужны только для обработки выбранных строк, поэтому я добавил в ADOQuery вычисляемое поле типа boolean, но не могу присвоить ему значение. Подскажите пожалуйста где это можно сделать?
    Использую DB2+ADOQuery+DBGridEh

    • Andrey53:

      Вычисляемое поле — это поле, в которой вычисляются значение по определенной формуле, я так понял, чтобы когда Вы выделили строки с помощью chexbox, то оно пересчитала все данные этих строк?

      • Nikolas_T:

        Нет, я просто добавил вычисляемое boolean поле для того, чтобы в нем хранить информацию о выделенных строках или я не правильно делаю? Просто у меня в БД негде хранить такую информацию.

        • Andrey53:

          в данном поле должна храниться какая информация? что Вы понимаете под информацией в выделенных строках? их количество или что-то еще?

          • Nikolas_T:

            в данном поле должна храниться информация о том выделена ли строка или нет, т.е. 0 или 1

          • Andrey53:

            Вы поле с чекбоксами сделали? зачем Вам там отображаться 0 или 1, если у Вас будет поле с чекбоксами и оно итак будет видно поставили Вы чекбокс или нет

          • Nikolas_T:

            например, мне надо удалить выделенные в гриде строки, т.е. в данном поле должна храниться информация о том выделена ли строка или нет. Я видимо неправильно формулирую вопрос — мне надо выполнять какие-либо операции (удаление например) над выделенными строками, но у меня не получается сделать проставление checkbox-ов и получить доступ к списку выделенных строк. В БД у меня нет поля для хранения checkbox-ов

  8. andrey:

    Да действительно хотелось бы узнать, что делать если в базе нет булева поля. Храним в виде 0,1. Как пересчитать в checkbox, чтобы было понятнее для пользователя?

  9. andrey:

    Разобрался, ничего сложного не оказалось, 0 и 1 прекрасно ведут себя.
    Интересный блог, кое-что почерпнул для себя

  10. Ваилий:

    Да это бесспорно будет работать.
    Но использование отдельного поля в БД только для Checbox-a очень не оптимально.

  11. Конфета:

    А как при нажатий клавиши выводились таблицы, которые уже связаны. На каждую кнопу, каждой таблицы.

Оставить комментарий на Andrey

Вы можете использовать следующие теги:

*