Доброго времени суток всем. В этой статье я хотел бы поговорить о том, как можно сделать 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 (то есть, добавляю все свои поля базы данных).
Затем мне нужно создать новое поле, которое и будет отвечать за хранение состоянии отметок строк, записей (checkboxes). Поле будет вычисляемым. Поэтому, мы нажимаем правой кнопкой мыши в Fields Editor и из контекстного меню выбираю New Fields… Появится окно, в котором заполняем все необходимые данные:
То есть, задаем ему имя, тип поля, затем нажимаем на кнопку ОК. Далее двойным щелчком нажимаем по компоненту DBGridEh и добавляем те поля, которые нужно отображать в сетке данных (гриде), самое главное, добавить в список наше вычисляемое поле (SEL). Затем, когда мы его добавили, необходимо его выделить и свойство Checkboxes установить в True:
Все, у нас почти все готово, осталось сделать, чтобы наши 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:
Их состояние хранится в памяти, а не в поле Вашей базы данных. При обновлении данных, у других пользователей будет отмечен только свой набор данных, у Вас свой.
На этом я буду заканчивать статью. Теперь Вы знаете, как можно отображаться checkboxes в своих базах данных как минимум двумя способами. В следующей статье я расскажу, как можно работать с наборам данным, который отмечается именно такими checkboxes.
Мы осуществим поиск данных и отметим найденную строку, мы попробуем отмечать весь набор и снимать отмеченные галочками записи. Также покажу, как отображать количество отмеченных записей и многое другое.
Вы также можете поиграться с отрисовкой chekboxes (ширина, жирность линий и так далее), это делается здесь:
InflateRect(R, 0, -1);
Тут уже экспериментируйте как хотите. Вторую часть статьи постараюсь подготовить в ближайшее время. До новых встреч дорогие друзья!
Похожие записи
Метки: checkboxes, DBGrid, dbgrideh, ehlib
Раз идет речь о EhLib, то зачем придумывать велосипед с calcfields, TList и написанием кода? Проще заюзать MemTableEh + DataDriverEh (или его наследников).
Спасибо за разъяснение, я не пользовался компонентами memtableEh и DataDriveEh, но данный пример можно использовать и на другом гриде.
Было бы интересно посмотреть на Вашу реализацию, с использованием этих компонент, я пытался, но не совсем понял пока что их суть. Намного ли больше памяти просят, чем просто использовать обычные списки?
Хотелось бы увидеть продолжение
Здравствуйте! Продолжение будет в ближайшее время!
Спасибо!!!
А вот и новая статья! Последняя, надеюсь))
https://zaokomtek.ru/?p=5978