Delphi. Играемся с DBGridEh
01.06.2017DBGrid,пожалуй, один из самых часто используемых компонентов на формах приложений разработанных в Delphi.
Стандарный, встроенный в палетту дельфы грид вполне самодостаточен для небольших, довольно примитивных проектов, цель которых — простое отображение в стиле минимализма.
Но ведь мы с вами понимаем, что информативной табличной реализации важно, скажем так, логически оптимизированное представление.
Это — многострочные ячейки, многострочные заголовки таблиц, объединение столбцов таблицы под общую шапку, нестандартные хинты, контекстные меню, вложенные объекты ячеек и другие элементы. Да, большая часть этих хотелок доступна и в примитивном, стандартном компоненте — но не все.
Почему DBGridEh?
Да просто от того что мне нравится им пользоваться и в этой записи поделюсь некоторыми его возможностями.
Не все сразу конечно, — статья будет пополняться и моими реализоваными примерами и заметками на основе Ваших комментариев.. Начнем..
DBGridEh — как вытекает из его названия, — призван отображать информацию из базы данных (одной или нескольких), на основе результатов выдаваемых запросом к таблице в БД или к представлению (вьюхе). Считаю неправильным обращаться к таблицам БД напрямую, поэтому в своих проектах использую результаты возвращаеые вьюхами или процедурами.
Про создание представлений (View) и процедур напишу отдельную заметку, но чуть позже…
Как видно на представленном скрине, DBGridEh позволяет делать много строчные заголовки таблиц. Делается это достаточно просто:
Допустим у вас есть в таблице два столбца («Дата выявления» и «Описание»), которые нужно объеденить по смыслу (здесь «Действующие замечания»). Как видно из скрина, — заголовок 1-го стобца представлен следующим образом:
«Текст объединяющий два столбца под одну шапку»|«Заголовок столбца 1» , и Caption соседнего столбца
«Текст объединяющий два столбца под одну шапку»|«Заголовок столбца 2».
Обратите внимание па вертикальную черту — она явлется признаком ввода общей шапки для стобцов грида.
Для объединения их под одну шапку необходимо для начала создать в гриде сами столбцы и настроить их отображение (Caption) . Дополнительно в опциях DBGridEh необходимо параметру UseMultiTitle необходимо присвоить значение true и назначить необходиму вам высоту заголовка (TitleHeight). Вот собственно и все основные операции, — дополнительные опции выставляете по своему желанию.
Ну и на закуску — видите столбец, текст в шапке которого, размещен вертикально? Это достигается установкой параметра Orientation:=tohVertical в ветке Title свойств поля (столбца).
Все, с оформлением закончили.
(рис 2 ) Приступаем к связке грида с данными извлекаемыми из таблицы или вьюхи.
Для начала бросим на форму компонент TQuery и в его параметре Connection выберем ранее брошенный в проект копмонент типа TConnection, естественно с заранее настроенным соединением.
Здесь следует сделать небольшое отступление: поскольку мы работаем с базой MySQL, то могут возникнуть два неприятных момента.
Во-первых, если в поле базы содержится русский текст, то он может не отобразиться, а во-вторых, если отображаемое поле имеет формат TEXT (то есть это поля позволяющее сохранять много строчные записи, своего рода аналог дельфового TMemo) — в строке грида вместо значения поля отобразится текст {MEMO}. Дабы устранить такую проблему, если она конесно есть, необходимо выполнить следующее:
Для отображения много строчных записей в свойствах грида необходимо параметру DrawMemoText присвоить значение true. Для отображения русского текста, — выставить, программно или вручную ,следующие параметры в своиствах (Propeties) соединения
controls_cp=GET_ACP codepage=cp1251 CLIENT_MULTI_STATEMENTS=true CLIENT_MULTI_RESULTS=true
Продолжим.. Размещаем на форме компонент типа TDataSource в качестве связки между DBGridEh и TQuery. Теперь необходимо программно обработать всю эту связку и вернуть результат в грид. Пока не будем говорить об изменении информации в отображаемой таблице — об этом напищу если будут вопросы…
Поскольку связка между компонентами уже выстроена и отображаться будут данные из датасета которым у нас является запрос, — просто вешаем событие на кнопку или еще куда-нибудь (на ваше усмотрение) и выполняем наполнение датасета:
InfoQuery.Close; InfoQuery.SQL.Clear; with InfoQuery do begin sql.Add('select * from table1 '); open; end;
InfoQuery — здесь имя, которое мы присвоили компоненту TQuery.
Код выполнился, — грид наполнился данными. На этом заканчиваю с описанием вывода данных из БД на форму.
Экспериментируя с DBGridEh нашел на просторах инета пример небольшого дополнения к нему, которое позволит отображать хинт для выделенной строки с удобным для вас форматированием, как например показано ниже. Можно менять размер и тип шрифта, а так же время показа hint-а (по умолчанию оно не более 5 секунд, согласитесь — не удобно).
Для реализации такой возможности потребуется внедрить в код программы дополнительную процедуру слудующим образом. В коде программы, в секции PUBLIC пишем
public procedure MyShowHint(var HintStr: string; var CanShow: Boolean;var HintInfo: THintInfo); { Public declarations }
И в разделе implementation записываем:
implementation procedure TForm1.MyShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo); var i : integer; begin for i := 0 to Application.ComponentCount - 1 do if Application.Components[i] is THintWindow then with THintWindow(Application.Components[i]).Canvas do begin Font.Name:= 'Arial'; Font.Size:= 12; Font.Style:= [fsBold]; // HintInfo.HintColor:= clWhite; end; end; {$R *.dfm}
Процедура выполняющая отображение подсказки описана, осталось ее скормить проекту, для этого в событии создания формы декларируем:
procedure TForm1.FormCreate(Sender: TObject); begin Application.OnShowHint := MyShowHint; Application.HintPause := 250; Application.HintHidePause := -1; ............. end;
На сегодня все!
В благодарность сделайте лайк с помощью пиктограммы соц.сети справа от записи. Спасибо и вам 🙂