Delphi. Играемся с DBGridEh

01.06.2017

DBGrid,пожалуй, один из самых часто используемых компонентов на формах приложений разработанных в 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;

На сегодня все!
В благодарность сделайте лайк с помощью пиктограммы соц.сети справа от записи. Спасибо и вам 🙂

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