Libary New Navadvipa for Embarcadero C++Builder

Харе Кришна, всем!
Примите, пожалуйста, мои поклоны!
Слава Шрмле Прабхупаде!

Библиотека Новая Навадвипа расширяет стандартную библиотеку VCL (Visual Comonent Library) и начата работа по переводу некоторых из этих компонентов в версию FMX (FireMonkey Library)!

1. TNNVNumerToWords – переводит строку из десятичных цифр в словесную форму и обавляет в конце само название предмета учета! Десятичная часть тоже преобразуется в словесную форму и тоже добавляется название предмета учета. Длина этой десятичной части настраивается! При желании есть настройка, когда десятичная часть остается цифровой с строке! Предметы учета целой части и десятичной части настраиваются в трех позициях – для для единицы, для диапазона от двойки до четверки и от пятерки до двадцатки! Учитываются все правила русского языка. Например 123.48 может быть транслирована в форму “Сто двадцать три рубля сорок восемь копеек”, а 121.02 – “Сто двадцать один рубль две копейки”! Есть также специальная настройка – нужно ли начинать с большой буквы или же с маленькой!

Вот как работает компонет TNNVNumerToWords :

Добавим цифр – латинских названий уже не хватит, но выход есть!

2. TNNVDBToolButton – кновка TToolBar,которую можно привязать в логическому полю набора данных и она будет показывать и изменять его значение! Очень удобно и просто!

3. TNNVDBComboBox – это не совсем то, что можно подумать с первого раза. Это не наследник TComboBox и даже не наследник TDBComboBox, а наследник TDBEdit! Но на самом деле я бы хотел, чтобы он был наследником TButtonedEdit, а лучше – наследником TDBButtonedEdit! Но TDBButtonedEdit еще нет в библиотеке VCL, а TButtonedEdit не обладает свойством MaskEdit, которое мне необходимо иногда. А так наш TDBComboBox не обладает кномкой бызова диалогового окна, но может его вызвать по нажатию клавиши Alt + Down – совсем как в в обычном TComboBox из библитеки VCL! В общем это обычный TDBEdit с возможностью вызова диалогового окна через специальный компонент TNNVDialog, который делает этот вызов особенно легким! Компонент TNNVDialog будет описан ниже.

4. TNNVActionList – это самый обыкновенный TActionList из библиотеки VCL, но который имеет три очень необычных метода!
void __fastcall ShowPropertyDialog();
void __fastcall SaveToFiler( TNNVTextStream *Filer );
void __fastcall LoadFromFiler( TNNVTextStream *Filer );
ShowPropertyDialog() отвечает за показ замечательной формы для настройки быстрых клавиш всех TAction из его коллекции!

Два последних метода отвечают за сохранение этих самых настроек быстрых клавиш  при выходе из программы и их восстановление при новом входе в неё. За сохранение и восстановление настроек отвечает другой компонент – TNNVConfig, который будет описан ниже!

5. TNNVTreeView – в основном этот компонент создан для своего потомка TNNVDBTreeView. В нем реализована отмена редактирования веточки с возможностью его отмены и удаления при этом данной веточки. Но по настоящему эту возможность привяжут к клавише Escape только в компоненте TNNVDBTreeView. Также реализована возможность вызова диалога для поиска по дереву с помощью метода ExecuteSearchDialog() или по нажатию клавиши Alt + F и воззможность сохранения и восстановления настроек этого диалога с помощью методов SaveToFiler( TNNVTextStream *Filer ) и LoadFromFiler( TNNVTextStream *Filer ).

Есть возможность продолжить поиск по нажатию клавиши F3 или при помощи метода SearchNext(). Также сделано полное сохранение истории перемещения по веточкам, чтобы бы можно было делать откаты по перемещениям в обе стороны – взад и вперед.
6. TNNVNodeAdmin – Этот компонент создан для совместного использования с компонентом TNNVDBTreeView. Отвечает он за одну какую-то область TNNVDBTreeView и предназначен для работы в двух режимах – либо он показывает одну веточку, которая не ветвится и не хранится в базе данных, либо он отвечает за показ древовидной структуры, которая хранится в базе данных и его можно редактировать – добавлять и удалять веточки и изменять их! Добавлять можно как в текущий уровень, так и создавать новый подуровень!

Вот некоторые события компонента TNNVNodeAdmin – OnEnter – событие, когда фокус получает веточка дерева, за которую отвечает данный конкретный TNNVNodeAdmin, а в одном дереве может быть много компонентов TNNVNodeAdmin!
Как правило в этом событии мы включаем видимость нужной TPanel, а в событии OnExit эту видимость мы наоборот выключаем. Есть события для первого входа в область TNNVNodeAdmin и для последнего выхода из неё. В них можем, например открыть необходимае наборы данных, а потом закрыть их. В этом коротком описании не будем углубляться в подробности и рассматривать другие события.

7. TNNVDBTreeView – компонент для отображения и редактирования древовидных данных, а также для отображения одиночных статических веточек, которые делают очень удобным работу с программой. Компонент TNNVDBTreeView  обрабатывает такие клавиши как F2 – редактировать веточку, Escape – отменить редактирование, Insert – добавить веточку, при этом диалог спросит : “Делать ли новый подуровень?”, Ctrl+Insert – добавить новую веточку в новый подуровень, Alt+Insert – добавить новую веточку в текущий уровень. При нажатии клавиш Ctrl+Alt+(0-9) мы устанавливаем закладку, а при нажатии Ctrl+(0-9) мы переходим к нужной веточке. Также сделан поиск по дереву – он описан ранее в компоненте TNNVTreeView! При нажатии Ctrl+Delete – удаляется веточка, при нажатии F5 – обновляется содержимое данной части дерева. Также сделано сохранение и загрузка настроек дерева при помощи методов SaveToFiler( TNNVTextStream *Filer ) и LoadFromFiler( TNNVTextStream *Filer ). Настройки действуют так, что при открытии окна мы попадаем в на ту самую веточку дерева, которая была активной при выходе из программы. Очень полезный компонент! Вот пример как выглядит TNNVDBTreeView в работе:

8. TNNVQuery – компонент наследник обычного TFDQuery. Это довольно обширный компонент, например метод CWOpen() открывает набор данных со счетчиком таких открытий, а метод CWClose() закрывает набор данных, но толко в том случае, если счетчик открытий равен 0! Метод CWRefresh() обновляет набор данных, а после обновления возвращается на ту же самую строку, которая была активна до обновления набора данных! Также он связан с компонентами TNNVDBTreeView и TNNVDBGrid и помогает их работе!

9. TNNVDBGrid – это наследник обычного TDBGrid, но имеет некоторые замечательные особенности. Например метод ShowPropertyDialog() вызывает диалог настройки таблицы отображения данных, в котором можно настроить шрифт таблицы и каждого столбца в отдельности, цвет таблицы и столбцов и цвет шрифта таблицы и столбцов, видимость каждого столбца в отдельности, а также некоторые другие их свойства!

Также SaveToFiler( TNNVTextStream *Filer ) и LoadFromFiler( TNNVTextStream *Filer ) сохраняют эти настройки выходе из программы и восстанавливают их при новом входе в неё. Есть также замечательные события:
OnDBCut – вырезать выделенные строки в буфер обмена
OnDBCopy – копировать выделенные строки в буфер обмена
OnDBPaste – вставить строки из буфера обмена.
OnDBMerge – слить строки из буфера с текущей строкой. Бывает, что одну и ту же сущность внесли несколько раз в базу данных под разными именами, а потом обнаружилась ошибка и нужно объединить эти строки в одну! Также столбцы TNNVDBGrid могут хранить информацию о сортировке и при щелчку по заголовку столбца сортировка может пройти совершенно особенным образом, например сразу по двум полям, а если это столбец для поля сложного объекта, то можно указать скобки и сортировка произойдет без ошибок! Например свойство TNNVColumn OrderBy можно установить равным (a.”Anketa”).”FIO” прямо в инспекторе объектов!

10. TNNVDBSearchDialog – выполняет поиск двух видов: первый – через окно диалога – это наиболее полный контроль над поиском, а второй – через более простой ввод данных для поиска в простое поле ввода или в особый компонент для ввода диапазов. Второй поиск идет по одному полю, а в диалоге можно искать сразу по всем полям набора данных. Второй поиск называется быстрым поиском, так как нету церемонии показа диалогового окна и его торжественных проводов после ввода данных для поиска.

Укажу на наиболее не очевидные моменты.
Если включен флажок “Регулярные выражения”, то работают обычные правила поиска регулярного выражения внутри текста. А вот если флажок “Регулярные выражения” выключен, то работает простое сравнение по маске, с возможным использованием двух особенных символов:
* – символ звездочка – обозначает любую последовательность букв, включая пустую строку!
? – символ знак вопроса – означает любой одиночный символ, но только не пустое место!
Если при этом включен флажок “Любое вхождение”, то к, введенному Вами тексту для поиска, автоматически добавляется два символа звездочки ‘*’ – один вначале,
другов конце!
Если флажок “Любое вхождение” выключен, то ищется введенный Вами текст целиком!
Что интересно, в включенном флажке “Регулярные выражения” не нужно заботится,
чтобы текст поиска искался внутри текста, а не целиком – так произойдет
автоматически!

Если включен флажок “Мягкий”, то перед сравнением текста поиска и полем в базе
данных из обоих удаляются следующие символы:
пробел, двойные кавычки и одинарные кавычки!

Если включен флажок “Ошибки”, то перед сравнением текста поиска и полем в базе
данных в обеих строках заменяются символы:

двойные буквы СС заменяются на одинарную букву С
двойные буквы НН заменяются на одинарную букву Н
буква О заменяется на букву А
буква И заменяется на букву Е
буква С заменяется на букву З
буква Ю заменяется на букву У
меняется английское I на украинское І
меняется украинское Ї на украинское І
буква Ё заменяется на букву Е

И тоже самое проделывается с маленькими буквами ( буквами в нижнем регистре ).
Если включен флажок “Не это”, то результат сравнения переворачивается наоборот!

Что же касается быстрого поиска с небольшом поле ввода в нижней части окна,
то он имеет одно неоспоримое преимущество – быстрый вызов “Cthl+E” – и уже там, а также то, что нет никакого громоздкого диалогового окна, которое заслоняет
данные. Поиск быстрый выполняется по одному текущему полю. При нажатии Enter – быстрый поиск применяется, а при нажатии клавиши Escape – фокус ввода передается обратно тому элементу, который был активен до быстрого поиска! В дереве быстрый поиск работает без режима фильтрации, вне зависимости от установленного флажка “Фильтр”!

Также необходимо сказать о поиске по дереву через этот диалог. он
работает от встроенных клавиш вызова в дереве:
Alt + F – поиск по дереву через диалог. В этом случае поиск идет от начала
дерева и до первой соответствующей веточки!
Alt + F3 – поиск по дереву, но уже без всякого диалога!
Клавиши эти работают тогда, когда дерево активно и находится в фокусе ввода!

В дереве работают клавиши добавления и удаления веточек:
Alt + Insert – добавить веточку в текущем уровне
Ctrl + Insert – добавить веточку уровнем ниже
Insert – добавить веточку через диалог – либо на текущем уровне, либо ниже
Ctrl + Delete – удалить веточку

Да! И еще не забываем, что как в таблице, так и в дереве можно
устанавливать 10 закладок и переходить к ним в мгновение ока!
Установка закладок – Ctrl + Shift + (0-9)
Переход к закладке – Ctrl + (0-9)
(0-9) означает любую из цифр – от нуля до девяти! Но как для установки
закладок, так и для прыжков по ним, необходимо чтобы таблица или дерево
были в фокусе ввода!
Если активна таблица – работают закладки таблицы.
Если активно дерево – работают закладки дерева.

Закладки эти сохраняются при выходе и с программы и восстанавливаются при входе в неё. Также сохраняются все параметры поиска, включая все введенные для поиска данные, в том числе для строковых полей сохраняется также история поиска, с ограничением для максимального количество строк в истории поиска. История поиска строковых полей появляется в выпадающем списке соответствующего TComboBox! Чтобы сохранить закляадки TNNVDBTreeView и TNNVDBGrid восстановит их, необходимо воспользоваться двумя их методами

NNVDBTreeView->SaveToFiler( TNNVTextStream *Filer );
NNVDBTreeView->LoadFromFiler( TNNVTextStream *Filer );

NNVDBGrid->SaveToFiler( TNNVTextStream *Filer );
NNVDBGrid->LoadFromFiler( TNNVTextStream *Filer );

А чтобы запомнить все настройки поиска, включая набранные для поиска данные и его также историю поиска строковых полей, необходимо воспользоваться двумя методами компонета TNNVQuery:

NNVQuery->SaveToFiler( TNNVTextStream *Filer );
NNVQuery->LoadFromFiler( TNNVTextStream *Filer );

Для того, чтобы не перечислять все многочисленные компоненты TNNWQuery для сохранения и восстановления их настроек, мы предлагаем Вам такую конструкцию:

для восстановления настроек:
NNV::TMapQuery AMapQuery( this );
AMapQuery.LoadFromFiler( coData->Filer );

для сохранения настроек:
NNV::TMapQuery AMapQuery( this );
AMapQuery.SaveToFiler( coData->Filer );

В этом случае все размещенные на форме или в модуле данных компоненты TNNVQuery будут сохранены и восстановлены!

coData здесь – это компонент TNNVConfig!

В полях ввода даты и чисел не забывайте о двух полезных клавишах!
Alt + Вверх – меняет знаки и способ сравнения “>=”, “>”, “<=", "="
Alt + Вниз – вызывает диалог даты и времени, если это поле ввода даты и времени
Alt + Вниз – вызывает открытие выпадающего списка также – это и для строковых полей и для логических полей!

Кнопки внизу формы:
Удалить фильтр – удаляет фильтр, но все его поля наготове и при случае вступят в силу опять!
Очистить фильтр – не сбрасывает фильтр, но очищает внутренний массив его полей, и когда Вы будете фильтровать по новому полю – оно будет единственное в фильтре!

11. TNNVStoryData – компонент, который помогает переносить данные из одной строки набора данных в другие! Опишу по порядку необходимые действия и тогда всё станет понятно:
1. Запоминаем строку.
2. Выбираем другие строки в компоненте DBGrid, возможно даже несколько сразу.
3. Вызываем метод компонента TNNVStoryData
void __fastcall Execute( TForm *ASenderForm, TNNVQuery *AQuery, TDBGrid *ADBGrid );
при этом вызывается диалоговое окно, в котором отображается список всех полей набора данных. Мы должны выбрать те поля, которые бы хотим заполнить данным из той самой первой строки, которую мы заполнили и нажимаем кнопку “Делаем!” – и данные автоматичеки переносятся из той первой строки в новые строки!
void __fastcall ExecuteRowInspector( TForm *ASenderForm, TDataSource *ADataSource );

Этот компонент имеет еще один замечательный метод :
void __fastcall ExecuteRowInspector( TForm *ASenderForm, TDataSource *ADataSource );
который вызывает диалог редактирования текущей строки набора данных в виде простого диалога. Хотелось бы сделать на основе TDrawGrid, но у него не хватает собятия для того, чтобы определить контрол, который будет редактировать нужную ячейку, а тот TEdit, что выскакивает по умолчанию, нужен далеко не всегда! Поэтому пока набросал такую вот простейшую форму.

12. TNNVConfig – этот компонент позволяет сохранять все многочисленные настройки формы или модуля данных и восстанавливать их! Но не только это, например, можно сохранить любые данные в файле или в памяти или же в базе данных. Например в файле можно сохранить все справочники из базы данных и даже документы из базы данных, которые даже могут включать отношения Master-Detail!|

Основные события компонента TNNVConfig – это OnLoad – загрузить настройки, OnSave – сохранить настройки, OnDefault – установка значений по умолчанию – это в том случае, если загрузки настроек не произошло! OnEndLoad – выполнить необходимые Вам действия после загрузки настроек.

13. TNNVNumberEdit – компонент который иожет редактировать числа. Он является наследником TNNVComboBox, который в свою очередь является наследником TMaskEdit. Так что это довольно простой компонент. И есть несколько стандартных компонентов для редактирования чисел. Они хороши, но все же мне понадобилось нечто особенное! Вот посмотрите на свойство CheckStyle:

Благодаря такому замечательному свойству как MaskEdit удалось реализовать особые метки для чисел, такие как “Больше” ( > ), “Меньше” ( < ), "Больше или равно" ( >= ) и так далее, которые весьма и весьма пригодятся в дальнейшем для ввода диапазов чисел! Также пользователь может менять эти метки самостоятельно, нажимая клавишу Alt+Up, но толко из того набора значений, который Вы ему позволите! За это отвечает следующее свойство – CheckStyleSetKind, которое может принимать такие значения:
None – пользователь не может менять свойство CheckStyle клавишей Alt+Up. да и само свойство CheckStyle устанавливается в None – то есть никаких математических знаков не отображается
, FullSet – полный набор значений, пользователь может менять из по кругу
, FullSetWithoutNone – полный набор значений, за исключением свойства значения Nonе, пользователь может менять из по кругу
, Greater – начения Больше и Больше или равно, пользователь может менять из по кругу
, Less – начения Меньше и Меньше или равно, пользователь может менять из по кругу

14. TNNVComboBoxDateTime – компонент для ввода даты и времени одновременно, но можно настоить и только на ввод даты. Зачем же нужен еще один такой компонент, которых и так уже вагон и маленькая тележка в стандартной библиотеке VCL? Ответ такой – во первых в моей версии С++Строителя нет возможности ввода даты и времени одновременно, во вторых мне нжны свойства  CheckStyle и CheckStyleSetKind, которые я подробно описал в компоненте TNNVNumberEdit – они очень нужны для наглядного ввода периодов дат, а в третьих – я просто люблю по-старинке написать дату и время в виде текстовой строки при помощи клавиатуры, а не пользоваться мышью или клавишами навигации курсора для этого. А ни один из многочисленных компонентов как из VCL, так и из FMX библиотек такую возможность мне, к сожалению, не предоставил.  TNNVComboBoxDateTime  также имеет возможность выбора даты и времени через диалоговое окно! Оно мне кажется тоже очень удобным. Пара щелчков мышью – и всё в порядке!

15. TNNVDBComboBoxDateTime – это тот же компонент TNNVComboBoxDateTime , но уже связан с полем набора данных!

16. TNNVComboBox – это по сути обычный TMaskEdit, но к нему можно пристегнуть компонент TNNVDialog и вызвать его нажатием клавиши Alt+Down. Когда компонент TButtonedEdit обзаведется свойством MaskEdit, кнопку нарисовать. Также ожидаем появление компонента TDBButtonedEdit !

17. TNNVRightsManager – это компонента для настройки прав доступа к различным частям программы. Имеет свойство Connection для присоединение к базе данных. Умеет хранить свойства в базе данных! Метод RefreshRights( long long int AUserID ) позволяет обновить права пользователя во время работы программы. Компонент TNNVRightsManager работает в паре с компонентами TNNVRight. Компонент TNNVRightsManager нужен только один на всю программу, а компоненты TNNVRight находятся по одному на каждой форме и модуле данных и они пристегиваются к компоненту TNNVRightsManager, который посылает им команду на обновление при необходимости! В библиотеке уже сделана возможность редактировать права пользователей через удобное окно! Вот пример:
Вот тут как раз есть кнопки, что помочь программисту сгенерировать файлы С++ для работы с теми правами, которые он сам и внес в базу данных. Приведу пример:
это заголовочный h файл

а это уже cpp файл:

Также сделан диалог для выбора прав пользователей! Вот как он выглядит:

кстати есть возможность выбрать несколько прав одновременно и присвоить их все за один раз!
А вот как выглядит редактирование ролей пользователей. Каждой роли можно назначить свой набор прав. А пользователю можно назначить свой набор ролей.

А вот как выглядит редактирование пользователей в программе:

Так как для этих форм нет отдельных компонентов, я их показываю, чтобы Вы поняли возможности библиотеки Новая Навадвипа. Форма Проводник “Джая Шрила Прабхупада” – это идет как пример к библиотеке, а сами наборы данных для этих форм уже все включены в библиотеку. Но так как пример “Джая Шрила Прабхупада” входит в поставку библиотеки Новая Навадвипа, можно считать что все это проблем не вызовет никаких. Остальные формы – они непосредственно включены в саму библиотеку. Полоность есть связь с сервером PostgreSQL. Например при создании новой строки – в PostgreSQL создается новый пользователь, при изменении его имени – старый удаляется, я новый создается! Можно ему дать роль из PostgreSQL для входа в прогрмм “Джая Шрила Прабхпада” и забрать её, мощно дать полномочия (со знаком плюс или минус) и роли, которые же определены в самой программе “Джая Шрила Прабхупада”, можно поменять пароль любом пользователю! Все пароли шифруются, для того, чтобы пользователь не мог зайти в на сервер PostgreSQL напрямю в обход программы! Можно дать роль суперпользователя PostgreSQL, для того чтобы такой пользователь сам мог создавать и редактировать других пользователей. В общем полный набор инструментов. Работают тут также копирование, вырезание и вставка строк, также как и везде, где это уместно!

18. TNNVRight – компонент, для раздачи прав пользователям программы.
Вот как может выглядеть событие OnRight компонен

та TNNVRight в модуле данных:

void __fastcall TdmvNewNavadvipa::rrDataRight( TObject *Sender )
{
NNV::TBoolVector &Rights = rmDB->Rights;

quUsers->UpdateOptions->ReadOnly = !Rights[ NNRights::UserEdit ];
quUserRights->UpdateOptions->ReadOnly = !Rights[ NNRights::UserEdit ];
quUserRoles->UpdateOptions->ReadOnly = !Rights[ NNRights::UserEdit ];
quRights->UpdateOptions->ReadOnly = !Rights[ NNRights::RightsEdit ];
quCommod->UpdateOptions->ReadOnly = !Rights[ NNRights::CommodEdit ];
quColor->UpdateOptions->ReadOnly = !Rights[ NNRights::ColorEdit ];
quRole->UpdateOptions->ReadOnly = !Rights[ NNRights::RoleEdit ];
quRoleRights->UpdateOptions->ReadOnly = !Rights[ NNRights::RoleEdit ];
quLanguages->UpdateOptions->ReadOnly = !Rights[ NNRights::LanguagesEdit ];
quLanguageKind->UpdateOptions->ReadOnly = !Rights[ NNRights::LanguageStringEdit ];
quLanguage->UpdateOptions->ReadOnly = !Rights[ NNRights::LanguageStringEdit ];
quTranslate->UpdateOptions->ReadOnly = !Rights[ NNRights::LanguageStringEdit ];
}

Или в форме вот так:

void __fastcall TfmvExplorer::rrResRight( TObject *Sender )
{
NNV::TBoolVector &Rights = dmvNewNavadvipa->rmDB->Rights;

aNewUser->Enabled = Rights[ NNRights::UserEdit ];
aSetUserPassord->Enabled = Rights[ NNRights::UserEdit ];
aDeleteUser->Enabled = Rights[ NNRights::UserEdit ];
aNewSuperUser->Enabled = Rights[ NNRights::UserEdit ];
aGrantSuperUser->Enabled = Rights[ NNRights::UserEdit ];
aRevokeSuperUser->Enabled = Rights[ NNRights::UserEdit ];

dgUsers->ReadOnly = !Rights[ NNRights::UserEdit ];
dgUserRights->ReadOnly = !Rights[ NNRights::UserEdit ];
dgUserRoles->ReadOnly = !Rights[ NNRights::UserEdit ];
dgRights->ReadOnly = !Rights[ NNRights::RightsEdit ];
dgCommod->ReadOnly = !Rights[ NNRights::CommodEdit ];
dgColor->ReadOnly = !Rights[ NNRights::ColorEdit ];
dgRole->ReadOnly = !Rights[ NNRights::RoleEdit ];
dgRoleRights->ReadOnly = !Rights[ NNRights::RoleEdit ];
dgLanguages->ReadOnly = !Rights[ NNRights::LanguagesEdit ];
}

19. TNNVDBComboBoxDateTime – это наследник компонента TNNVComboBoxDateTime с возможностью привязки к полю набора данных.

20. TNNVLanguageManager – это компонент, который отвечает за перевод программы на разные языки мира, такие как английский, немецкий и так далее. Работает в паре с компонентом TNNVLanguage. TNNVLanguageManager нужен всего один на всю программу, а вот TNNVLanguage нужен на каждой форме и в каждом модуле данных. Метод TNNVLanguageManager PrepareLanguage( TComponent *AOwner ) показывает замечательную форму для перевода строк на различные языки:

На этой форме также есть кнопочка, которая заполняет необходимые для перевода строки сама, а потом уже нужно их переводить и записывать в базу данных!

21. TNNVLanguage – компонент, который служит для перевода программы на разные языки и работает в паре с компонентом TNNVLanguageManager. Он имеет событие OnLanguage – для дополнительного перевода на разные языки, который автоматика не делает, например можно и размер и положение контролов подправлять. Свойство Manager указывает на компонент TNNVLanguageManager.

22. TNNVDialog – компонент, который делает очень легким вызов диалогового окна. Окно это – не модальное! Имеет четыре ключевых события:
1. OnGetDialogForm – событие, в котором мы получаем нужную нам форму, например оно может выглядеть так:

void __fastcall TfmvExplorer::RightsGetDialogForm( TObject *Sender, TCustomForm *&fm )
{
NNVFormList.New( __classid( TfmvRights ), &fmvRights, this );
fm = fmvRights;
}

2. OnPrepare – подготовить открытие формы, например так:

void __fastcall TfmvExplorer::DRoleRightsPrepare( TObject *Sender )
{
fmvRights->FindID( dmvNewNavadvipa->quRoleRightsEntityID->AsLargeInt );
}
То есть мы делаем яктивной нужную нам строку справочника.

3. OnExecute – выполнить все необходимые действия при удтвердительном закрытии окна диалога пользователем! Оно может выглядеть, например так:

void __fastcall TfmvExplorer::DRoleRightsExecute( TObject *Sender )
{
fmvRights->MultiResultExecute( dmvNewNavadvipa->quRoleRights
, dmvNewNavadvipa->quRoleRightsEntityID
, dmvNewNavadvipa->quRoleRightsRight );
}

4. OnUnPrepare – позволяет вернуть на место некоторые вещи, которые были сделаны при подготовке OnPrepare. В нашем примере его следует оставить пустым.

23. TNNVSplitter – это обычный TSplitter, но свойство ResizeStyle по умолчанию равно rsUpdate;

24. TNNVDrawGrid – это обычная TDrawGrid, но добавлены два новых события:

OnCWColWidthsChanged – событие возникает при изменении ширины столбца OnCWRowHeightsChanged – событие возникает при изменении высоты строк
OnResize – это событие просто опубликовано.

25. TNNVPageControl – TPageControl , но у неё есть методы для сохранения и восстановление настроек при выходе из программы.
void __fastcall SaveToFiler(TNNVTextStream *Filer);
void __fastcall LoadFromFiler(TNNVTextStream *Filer);
Там настроек всего то ничего – просто запоминает текущую закладку.

26. TNNVDateTimeDialog – это компонент TDialog, но который предназначен для показа конкретно формы-диалога ввода даты и времени. События OnGetDialogForm у него нет. Есть еще свойство NeedTime, которое устанавливает – требуется ли ввод времени или нет.

27. TNNVPanel – это обычнат панель, но по умолчанию свойтсво Caption пустое, два свойства установлены в bvNone по умолчанию:
__property BevelInner = { default = bvNone};
__property BevelOuter = { default = bvNone};

28. TNNVGolovolomka15 – безделушка – головоломка “Пятнашка”. Есть событие OnVijaya – победа. Есть методы для перемешивания костяшек и для возврата в начальное положение!

29. TNNVFlagBox – этот компонент создан для того, чтобы опубликовать некоторые события, которые должны были бы принадлежать форме, но форма не умеет опубликовывать свои ни свойства, ни события. Также имеет некоторые свойства он. Например свойство caFree. При его установке в значение true – форма при закрытии разрушается, то есть удаляется из памяти полностью!

30. TNNVCalendar – это просто клон TCalendar со страницы Samples. Возможно там и есть некоторые изменения, я уже и не помню. Так как он мне нужен для диалога ввода даты – надежнее его иметь при себе, так как вдруг стандартный TCalendar исчезнет в будущих версиях VCL. Я уже имеел неоднократную возможность убедиться на примере сторонних платных библиотек, что с выходом новой версии программы фирма разработчик компонентов объявляет : “Ребята, все что Вы писали, все что Вы учили – это уже не актуально! Будет всё по другому”. На практике это становится таким ударом, что уже невозможно перейти на новую версию и приходится застревать на старой версии С++Строителя и старых версия библиотек.

Помимо компонентов, которые отображаются в Палитре компонентов, Новая Навадвипа имеет еще и много полезных TFrame, TForm и TDataModule, а также много полезных классов!

Вот например фэйм TfrvLogin:

Он не просто размещает необходимые для входа в прогрмму метки и поля ввода данных, но и имеет всю необходимую функциональность!

Также есть форма TfmvLogin:

Тут уже вся функциональность под ключ! Нужно просто настроить нужные размеры формы, загрузить желаемое изображение при желании и ввести значения по умолчанию для полей ввода. Есть пример, как все это делать.

Есть фрэйм для ввода периодов во времени – TfrvPeriod:

Он полностью функционален, а не просто набросок нескольких поле ввода!

Есть фрэймы для ввода дипазонов чисел – TfrvDoubleDiapazon, TfrvIntDiapazon, TfrvShortIntDiapazon и TfrvLongLongIntDiapazon! Вот так выглядит фрэйм TfrvLongLongIntDiapazon:

Есть замечательная форма TfmvRes. Она умеет запоминать свою позицию на экране при выходе из программы и восстанавливать её обратно при входе в неё! Она умеет работать в режиме немодального диалога, и в результате потребность в модальных диалогах практически полностью отпадает! Она умеет делать как единичный выбор какой либо сущности, так и множественный выбор. Например диалог выбора товаров в документе – можно выбрать один товар и добавить его в документ, а можно выбрать сразу несколько товаров и добавить их в документ за один присест! Вот эти механизмы уже встроены в данную форму! Она умеет еще некоторые вещи, но все описывать уж слишком долго.

Есть форма TfmvDB – она является наследником формы TfmvRes и предназначена для наследования от неё форм, которые должны работать с базой данных! Тут уже функциональность довольно обширна!

Вот её краешек так выглядит: 

Также есть в библиотеке Новая Навадвипа форма TfmvLock для блокировки программы, когда пользователь отошел от компьютера и не хочет, чтобы в программе кто-то другой работал! Вот как она выглядит уже в работе:

Вся необходимая функциональность присутствует!

Также есть форма TfmvFormList для показа списка всех открытых окон программы. У каждой формы есть свойство – должна ли она попадать в этот список или нет! Можно выбрать нужное окно, нажать Enter и сделать его активным! По Shift + F12 мы попадаем в окно со списком открытых окон. Потом, если мы продолжаем удерживать клавишу Shift нажатой, но при этом мы отпустили F12, снова нажали F12 – уже перейдем на следующую запись, потом снова можно F12 – это значит еще на следующую, и теперь стоит только отпустить клавишу Shift, как мы очутимся в нужном нам окне! Вот как выглядит TfmvFormList в реальной работе:

Есть форма для смены пароля TfmvChangePassword со всей необходимой функциональностью! Вот как она выглядит в работе:

Есть очень полезный класс TNNVTextStream. Он является наследником TStream. но для работы он использует какой нибудь другой стандартный TStream, указатель на экземпляр которого он хранит внутри себя. У класса TNNVTextStream есть полезные методы, которые помогают записывать и восстанавливать настройки программы при выходе из неё м входе в неё!
ReadBool() и WriteBool( bool Value )
ReadInt() и WriteInt( bool Value )
ReadDateTime() и WriteDateTime( TDateTime Value )
ReadDouble() и WriteDouble( double Value )
ReadColor() и WriteColor( TColor Value )
ReadString() и WriteString( const String &Value )
ReadAnsiString() и WriteAnsiString( const AnsiString &Value )
ReadBinaryData( void *Buffer ) и WriteBinaryData( void *Buffer, int BufSize )
ReadFiler( TNNVTextStream *filer ) и WriteFiler( TNNVTextStream *filer )
ReadFont( TFont* AFont ) и WriteFont( TFont* AFont )
ReadShortCut() и WriteShortCut( TShortCut Value )
и так далее!
Это на самом деле неполный перечень – только для примера! А еще есть у многих компонентов такие два  метода:

void __fastcall LoadFromFiler( TNNVTextStream *Filer );
void __fastcall SaveToFiler( TNNVTextStream *Filer );

которые записывают и восстанавливают настройки компонента!

Есть менеджер настройки цветов программы, с генерацией програмных файлов для констант, чтобы сделать работы с менеджером цвета очень удобным!

Цвета сохраняются в настройках, индивидуально для каждого пользователя!

Цена библиотеку “Новая Навадпипа” 15000 рублей с лицензией – заплатил и пользуйся на свой страх и риск без всяких гарантий! Исходные коды поставляются!

Спасибо за внимание!

Если Вы заинтересовались чем либо из предложенного мной, свяжитесь со мной!

Харе Кришна!

С уважением, Навадвипа Чандра дас.