checkboxesДоброго времени суток всем. В этой статье я хотел бы поговорить о том, как можно сделать checkboxes в ячейках для любой базы данных в нужном для Вас гриде (Grid). Я уже писал подобную статью  и рассказывал, как в ячейках грида отображать checkboxes, но здесь речь пойдет совсем о другом способе, на мой взгляд, более правильным и лучшим.

Способ, что я рассказывал в прошлой статье тоже рабочий, но может получиться такая ситуация, когда одновременно могут работать с одним набором данных несколько пользователей, отмечая галочками нужные записи. При обновлении данных каждый пользователь увидит не только отмеченные свои записи, но и еще другого пользователя. В данной статье речь пойдет о таком отображении checkboxes и использовании их, когда пользователи не будут видеть отмеченные записи других пользователей, соответственно и не будут друг другу мешать при обновлении данных.

Сегодня я расскажу только Вам, как отобразить checkboxes в ячейках, а в другой статье уже речь пойдет о том, как перемещаться по данному набору данных, отмечать все ячейки, снимать выделение всех ячеек (checkboxes), работать только с отмеченными данным и так далее. Таким образом, данная статья будет состоять из двух частей.

Начнем с того, что никакого поля в базе данных нашей не будет, предназначенное для хранения данных о состоянии checkbox, мы не будем создавать отдельное поле в таблице БД.

В качества сетки грида я выбрал бесплатный компонент (до версии 3.6) из библиотеки Ehlib – TDBGRidEh. Что необходимо Вам, чтобы данный урок повторить? Как минимум компонент TDBGRidhEh, созданная база данных (SQL, Access, Oracle) с любым набором данных, компонент доступа к данным (ADO либо другие, все зависит от Вашей технологии доступа к данным).

У меня база на SQL, доступ осуществляю через компоненты из вкладки ADO. В итоге, на форме у меня TDBGridEh, TADOConnection и TADOQuery. Создаю подключение к БД через ADOConnection (см. Работа с ADO в Delphi. Часть 1). Затем связываю все компоненты для доступа и отображения данных, пишу запрос SELECT к свой таблице, используя для этого компонент ADOQuery и затем активирую его.

Что я делаю дальше, открываю Fields Editor компонента ADOQuery (двойным щелчком левой кнопкой мыши по компоненту, либо правой кнопкой мыши по компоненту и из контекстного меню выбираю пункт Fields Editor). В данном окне я нажимаю правой кнопкой мыши и из контекстного меню выбираю пункт Add all Fields (то есть, добавляю все свои поля базы данных).

img1

Затем мне нужно создать новое поле, которое и будет отвечать за хранение  состоянии отметок строк, записей (checkboxes). Поле будет вычисляемым. Поэтому, мы нажимаем правой кнопкой мыши в Fields Editor и из контекстного меню выбираю New Fields… Появится окно, в котором заполняем все необходимые данные:

img2

То есть, задаем ему имя, тип поля, затем нажимаем на кнопку ОК. Далее двойным щелчком нажимаем по компоненту DBGridEh и добавляем те поля, которые нужно отображать в сетке данных (гриде), самое главное, добавить в список наше вычисляемое поле (SEL). Затем, когда мы его добавили, необходимо его выделить и свойство Checkboxes установить в True:

img3

Все, у нас почти все готово, осталось сделать, чтобы наши checkboxes отрисовывались в гриде. Для этих целей нам необходимо объявить переменную ListSelect:TList – универсальный список. Далее на событие формы OnCreate создадим наш список:

ListSelect:=TList.Create;

После того, как заканчиваете с ним работать, не забывайте также удалять его из памяти. Затем выделяем компонент DBGridEh и переходим во вкладку события, находим событие OnDrawColmnCell и пишем следующий код:

if CompareText(Column.FieldName , 'SEL') = 0 then
    begin
     if ListSelect.IndexOf(Pointer(TDBGridEh(Sender).DataSource.DataSet.FieldByName('ID').AsInteger)) >= 0 then
      St:=DFCS_CHECKED
     else
      St:=DFCS_BUTTONCHECK;
     R := Rect;
     InflateRect(R, 0, -1);
     DrawFrameControl(TDBGridEh(Sender).Canvas.Handle, R, DFC_BUTTON, St+DFCS_FLAT);
    end;

Еще забыл Вам сказать, самое главное, чтобы в Вашей БД было поле с уникальным значением, у меня оно называется ID и имеет тип счетчик (как сделать поле-счетчик в SQL я рассказывал в данной статье). По данному полю у нас в дальнейшем и будут происодить различные манипуляции с отмеченными записями. Если Вы все сделали правильно, ничего не упустили, то у Вас должны появиться вот такие вот checkboxes в ячейках DBGRidEh:

img4

Их состояние хранится в памяти, а не в поле Вашей базы данных. При обновлении данных, у других пользователей будет отмечен только свой набор данных, у Вас свой.

На этом я буду заканчивать статью. Теперь Вы знаете, как можно отображаться checkboxes в своих базах данных как минимум двумя способами. В следующей статье я расскажу, как можно работать с наборам данным, который отмечается именно такими checkboxes.

Мы осуществим поиск данных и отметим найденную строку, мы попробуем отмечать весь набор и снимать отмеченные галочками записи. Также покажу, как отображать количество отмеченных записей и многое другое.

Вы также можете поиграться с отрисовкой chekboxes (ширина, жирность линий и так далее), это делается здесь:

InflateRect(R, 0, -1);

Тут уже экспериментируйте как хотите. Вторую часть статьи постараюсь подготовить в ближайшее время. До новых встреч дорогие друзья!

Метки: , , ,




К записи “Установка checkboxes в ячейках с использованием вычисляемоего поля. Часть 1” оставлено комментариев: 6.

  1. Раз идет речь о EhLib, то зачем придумывать велосипед с calcfields, TList и написанием кода? Проще заюзать MemTableEh + DataDriverEh (или его наследников).

    • Andrey:

      Спасибо за разъяснение, я не пользовался компонентами memtableEh и DataDriveEh, но данный пример можно использовать и на другом гриде.

      Было бы интересно посмотреть на Вашу реализацию, с использованием этих компонент, я пытался, но не совсем понял пока что их суть. Намного ли больше памяти просят, чем просто использовать обычные списки?

  2. Ussser:

    Хотелось бы увидеть продолжение :)

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

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*