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

5 минут на чтение

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);

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

Если вы хотите узнать, как можно сделать имитацию клика мыши в Delphi, то это действие происходит при помощи определения координат, все довольно просто и быстро.

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Доброго времени суток дорогие читатели блога. Хочу поздравить Вас с прошедшими праздниками, пожелать в Новом Году всего самого наилучшего, выполнению всех желаний, чтобы у Вас было все, как Вы задумали. Теперь давайте вернемся непосредственно к самой статье. Д...
Здравствуйте, рассматриваю данную тему — по просьбе читателя моего блога. После того, как он мне задал вопрос: как в TDBGridEh, в полях (в записях), где установлены checkbox (флажки), перенести в другую таблицу. Через пару часов, я скачал последнюю версию библ...
Всем привет, опять же, пишу статью про ADO, а также по просьбе читателя моего блога, который попросил рассказать, как в БД можно работать с вычисляемыми полями (чтобы значение вычисляемого поля сразу менялось, при вводе нового значения), на примере БД — MS Acc...