Category Archives: Компьютер-лила

Установка Qt из исходных текстов на Windows 10 64 bit

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

Попробуем собрать Qt и QtCreator из исходных текстов! Для чего из исходных текстов? Ведь можно же просто скачать готовый установщик Qt и установить уже скомпилированные модули, готовые для работы! Да! Всё это правда! Но правда и то, что в этом случае Вы не сможете отредактировать сами исходные тексты Qt! А иногда это хочется! И иногда надо!

Следуем по пути, предначертанном на сайте Qt – https://wiki.qt.io/Building_Qt_6_from_Git .
Установил Far Manager, 7-zip – полезные штуки!

1. Устанавливаем PostgreSQL 16 64 bit, качаем отсюда – https://www.postgresql.org/download/windows/ . Путь к  PostgreSQL прописывать в переменной Path не надо, его можно прописать в параметрах CMake сборки Qt. Но перед запуском уже готовых программ, которые скомпилированы с помощью Qt нужно будет срочно добавлять этот путь к системной переменной Path примерно такой командой:
set Path=%Path%;C:\Prg\PostgreSQL\16\bin

2. Качаем и устанавливаем Git отсюда – https://git-scm.com/download/win .
Я разпаковываю в папку C:\Prg\PortableGit . Стараюсь избегать ненужного длинного названия Program Files, с которым не всегда удобно работать. Досталась мне версия PortableGit-2.44.0-64-bit.7z.exe .
В системной переменной Path должно быть следующее: C:\Prg\PortableGit\cmd

3. Устанавливаем CMake, качаем отсюда https://cmake.org/download/ , досталась мне версия cmake-3.28.3-windows-x86_64.zip .
В системной переменной Path должно быть следующее: C:\Prg\cmake-3.28.3-windows-x86_64\bin

4. Устанавливаем Ninja с папку C:\Prg\Ninja . Version 1.11.1
https://github.com/ninja-build/ninja/releases
В системной переменной Path прописываем путь C:\Prg\Ninja .

5. Устанавливаем VulkanSDK
https://vulkan.lunarg.com/sdk/home#windows
Мне досталась версия VulkanSDK-1.3.275.0-Installer.exe . Ни одну дополнительную галочку не выбирал. Установил по минимуму.
В системной переменной Path должно быть следующее: C:\Prg\VulkanSDK\1.3.275.0\Bin

6. Устанавливаем Python. Попробуем скачать Windows installer (64-bit)
Stable Releases на странице https://www.python.org/downloads/windows/ .
На данный момент нужно выбрать версию Питона 3.11 python-3.11.8-amd64.exe . Хотя существует более новая версия 3.12, но под неё еще не исправлены исходные тексты Qt. Выбор более ранних версий, тоже приводил к ошибкам компиляции, и некоторые части библиотеки Qt не устанавливались. Оставил все галочки установки по умолчанию. В системную переменную PATH добавил вручную путь C:\Prg\Python\Python311
Установил вручную в Реестре Windows флаг HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled  в значение 1. Питон вроде бы предлагает это сделать при установке. Если забыли сразу включить, то ничего страшного – никогда не поздно. Программа для работы с реестром Виндовс – regedit.exe .

7. Устанавливаем Strawberry Perl. Качаем отсюда – https://strawberryperl.com/releases.html
Мне досталась портативная версия strawberry-perl-5.38.0.1-64bit-portable.zip .
Распаковал в папку C:\Prg\strawberry
В системную переменную Path добавил следующее: C:\Prg\strawberry\perl\bin

8. Устанавливаем Visual Studio 2022. Качаем отсюда – https://visualstudio.microsoft.com/ru/vs/whatsnew/
Установил поддержку классических приложений C++, мобильных приложений для C++ и два языковых пакета – английский и русский!

9. Установил WDK Для этого скачал wdksetup.exe . Найти можно на странице https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk#download-icon-for-wdk-step-3-install-wdk . После этого будет доступен отладчик cdb.exe . Он понадобится для работы отладки кода в QtCreator. Находится отладчик тут – “C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe” . Но QtCreator cfv его найдет!

10. Устанавливаем в Питоне html5lib, для этого переходим в папку C:\Prg\Python\Python311\Scripts и запускаем команду:
pip3 install html5lib

11. Устанавливаем Win Flex Bizon, качаем отсюда – https://sourceforge.net/projects/winflexbison/
В системную переменную Path добавил следующее: C:\Prg\Win_Flex_Bizon

12. https://nodejs.org/en/download
Мне досталась версия node-v18.18.2-x64.msi . Вместе с node.js не стал устанавливать Шоколадку, которая тянет много пакетов. Эти пакеты плохо контролируются. Еще один Питон! Зачем? Когда удалил все пакеты Chocolatey, но консоль Visual Studio 2022 для режима x64 перестала правильно запускаться. Так что Chocolatey не стал устанавливать.

13. Устанавливаем libclang отсюда – https://download.qt.io/development_releases/prebuilt/libclang/
Мне досталась версия libclang-release_18.1.0-based-windows-vs2019_64.7z
Распаковываем в папку C:\Prg\libclang_vs
В системную переменную Path не надо добавлять этот путь. Сразу в параметрах CMake пропишем, равно как и путь к PostgreSQL!

14. Нужно установить gperf. Скачал отсюда
https://sourceforge.net/projects/gnuwin32/files/gperf/
не самую свежую версию gperf-3.0.1.exe и установил её в папке C:\Prg\GnuWin32
В системную переменную Path прописал путь C:\Prg\GnuWin32\bin

15. Установил OpenSSL . Её требовала CopperSpice – библиотека, которая давным давно отпочковалась от Qt. Сам Qt её не требует. Качать можно отсюда – https://github.com/CristiFati/Prebuilt-Binaries/tree/master/OpenSSL/
Мне досталась версия OpenSSL-3.2.1-Win-pc064.zip . Распаковываем OpenSSL в каталог C:\Prg\OpenSSL\3.2.1, а в системную переменную Path прописываем путь C:\Prg\OpenSSL\3.2.1\bin

16. В системную переменную Path добавить путь к библиотеке Qt, чтобы другие программы, написанные на Qt могли запускаться. У меня этот путь такой:
C:\QtSource\ReleaseVS\Lib\bin

17. Теперь перейдём к закачке исходных текстов Qt.
Исходники Qt будем записывать в папку C:\QtSource\qt6 .
Для этого в командной строке (я пользуюсь Far Manager) сделаем текущим каталог C:\QtSource\ и запустим команду:
git clone git://code.qt.io/qt/qt5.git qt6
либо эту
git clone https://code.qt.io/qt/qt5.git qt6
перейдем в каталог C:\QtSource\qt6 командой
cd qt6
тут мы можем перейти в нужную ветку Qt. По умолчанию мы попадаем в ветку разработчиков dev, можно включить другую ветку, если Вы знаете её имя. Команда переключения веток такая:
git switch dev
потом запустим команду:
init-repository.bat
Она скачает все исходные тексты.

18. Теперь перейдём к закачке исходных текстов QtCreator.
Перейдем в каталог C:\QtSource
Запускаем команду
git clone git://code.qt.io/qt-creator/qt-creator.git
или такую
git clone https://code.qt.io/qt-creator/qt-creator.git

19. Теперь перейдем к очень важному этапу создания нужных папок!
У нас уже есть каталог C:\QtSource
В нем есть каталог C:\QtSource\qt6, в который мы закачали исходные тексты Qt
Также в нём есть C:\QtSource\qt-creator , в который мы закачали исходные тексты QtCreator.
Создадим каталог C:\QtSource\Bat – в нем будут bat файлы для запуска нужных для компиляции команд.
Создадим каталог C:\QtSource\Log – в нем будут log файлы, в которых будут отображаться весь процесс компиляции Qt.
Создадим каталог qtcreator_build_vs – в нем будет скомпилирован и собран QtCreator с помощью компилятора MSVC, который устаановился вместе с Visual Studio 2022. Можно скомпилировать все и с помощью GCC 11.2, но в этом случае невозможно скомпилировать QtWebEngine и также не получается скомпилировать модуль для PostgreSQL.
Создадим каталоги:
C:\QtSource\ReleaseVS
C:\QtSource\ReleaseVS\Build – тут будут храниться результаты конфигурирования библиотеки Qt
C:\QtSource\ReleaseVS\Lib – тут будет храниться уже готовая к употреблению библиотека Qt

20. Теперь перейдем к очень важному этапу создания нужных файлов! Звёздочки копировать не надо! Они просто служат для обозначения границ – начало файла и конец файла.
Создадим файл C:\QtSource\Bat\LogReleaseVSConfig.bat и запишем его содержимое таким образом:
****************
ReleaseVSConfig.bat => ./../Log/ReleaseVSConfig.log
****************

Создадим файл C:\QtSource\Bat\LogReleaseVSBuild.bat и запишем его содержимое таким образом:
****************
ReleaseVSBuild.bat => ./../Log/ReleaseVSBuild.log
****************

Создадим файл C:\QtSource\Bat\ReleaseVSConfig.bat и запишем его содержимое таким образом:
****************

set Path=%Path%;C:\Prg\PostgreSQL\16
set BUILD_DIR=C:/QtSource

cd %BUILD_DIR%/ReleaseVS/Build

%BUILD_DIR%/Qt6/configure -prefix %BUILD_DIR%/ReleaseVS/Lib ^
-release ^
-sql-psql ^
-android-javac-source 8 -android-javac-target 8 ^
— -DCMAKE_PREFIX_PATH=C:/Prg/libclang_vs;C:/Prg/PostgreSQL/16

****************

Тут хочу сделать небольшой комментарий. Ранее параметр — -DCMAKE_PREFIX_PATH=C:/Prg/libclang_vs;C:/Prg/PostgreSQL/16 отрабатывал хорошо на два пути, а с недавних пор захватывается только один путь, а второй, который следует за точкой с запятой – отбрасывается с предупреждением.

CMake Warning: Ignoring extra path from command line: “C:/Prg/PostgreSQL/16”

Поэтому я включил этот путь в переменную системную Path. Можно его включить в систему и на постоянной основе, а не в bat файле. Почему я так сделал? При компиляции библиотеки CopperSpices этот буть мне мешал и приводил к ошибке. Правда эта ошибка уже давно может быть исправлена. Пока не проверял.

Создадим файл C:\QtSource\Bat\ReleaseVSBuild.bat и запишем его содержимое таким образом:
****************
set BUILD_DIR=C:/QtSource

cd %BUILD_DIR%/ReleaseVS/Build

cmake –build . –parallel

cd %BUILD_DIR%/ReleaseVS/Build

cmake –install  .
****************

Создадим файл C:\QtSource\Bat\Log-qt-creator-build-vs.bat и запишем его содержимое таким образом:
****************
qt-creator-build-vs.bat => ./../Log/qt-creator-build-vs.log
****************

Создадим файл C:\QtSource\Bat\qt-creator-build-vs.bat и запишем его содержимое таким образом:
****************
rem set Path=%Path%;C:\QtSource\ReleaseVS\Lib\bin
cd C:\QtSource\qtcreator_build_vs

cmake -DCMAKE_BUILD_TYPE=Release -G Ninja “-DCMAKE_PREFIX_PATH=C:\QtSource\ReleaseVS\Lib;C:\Prg\libclang_vs” C:\QtSource\qt-creator
cmake –build .
****************

21. Теперь мы должны запустить терминал (консоль), но не просто любую командную оболочку, а ту которую предоставила нам программа Visual Studio 2022. Я выбрал x64 Native Tools. У меня этот ярлык находится тут:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2022\Visual Studio Tools\VC\x64 Native Tools Command Prompt for VS 2022.lnk
Для удобства я его закрепил на панели задач, так как приходится часто его нажимать. Обычно я сразу же перехожу в каталог Far Manager и запускаю его. Так удобнее. Например так:
cd C:\P + клавиша Tab – получаем cd C:\Prg, набираем символы \f и нажимаем клавишу Tab, получаем cd “C:\Prg\Far Manager”, нажимаем Enter, набираем Far и снова нажимаем Enter – вот Far Manager и запустился.
Если же мы выберем другую архитектуру компилятора, наприме x86_x64, то мы тоже сможем скомпилировать библиотеку Qt и в ней, но в этом случае на неудастся соединиться с сервером PostgreSQL при помощи его родных библиотек, как например C:\Prg\PostgreSQL\16\bin\libpq.dll и подобных. Для успешного соединения нам, вероятней всего понадобится набор таких библиотек, скомпилированных именно для архитектуры x86_x64.

22. Теперь просто последовательно запускаем три файла
C:\QtSource\Bat\LogReleaseVSConfig.bat
C:\QtSource\Bat\LogReleaseVSBuild.bat
C:\QtSource\Bat\Log-qt-creator-build-vs.bat
При этом нужно ждать, пока завершится выполнения каждого файла, перед тем как запускать следующий.

Вот и всё! В итоге мы получили рабочую библиотеку Qt и замечательный инструмент Qt Creator! Можно на рабочем столе создать ярлык для запуска Qt Creator и работать по-стахановски. Qt Creator находится здесь – C:\QtSource\qtcreator_build_vs\bin\qtcreator.exe .

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

Обзор библиотеки Новая Навадвипа (NewNavadvipa) для С++Строителя 10.4.2

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

Библиотека Новая Навадвипа расширяет стандартную библиотеку 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 рублей с лицензией – заплатил и пользуйся на свой страх и риск без всяких гарантий! Исходные коды поставляются!

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

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

Харе Кришна!

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

Словарь Шрилы Прабхупады


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

Когда-то давно по вдохновению от Абхинанды Прабху написал программу санскритского словаря Шрилы Прабхупады. В свое время, Абхинанда Прабху был нашим региональным секретарем на Донбассе!
Он был платным, что создавало большие неудобства, так как нужно было получать код. Я рассылал коды. А однажды на одном из вайшнавских форумах я прочитал, что какой смысл ему писать, если он на письма все равно не отвечает. А у меня просто прекратилось автоматическое получение писем со старого ящика alejan@rambler.ru в мой новый ящик navadwip@rambler.ru . Простите, пожалуйста. Если так случилось, я просто не читал таких писем. Вскоре мы с Абхинандой Прабху сделали эту версию словаря безплатной и без кода. Код, кстати был неудобен и при смене жесткого диска его нужно было получать заново. Все исходные тексты словаря были потеряны.
Теперь написал словарь с нуля. Это почти полная копия старой программы, но у неё есть несколько преимуществ и нет такого, в чем бы старая версия программы превосходила бы её!
Преимущества:
1. В словаре стало больше языков – пять языков – русский, английский, чешский, испанский, португальский, а были два языка – русский и английский.
2. С словарях гораздо больше слов, по сравнению со старой версией. Например в русском словаре стало 141 382 слов, было 63 155 слов.
3. Кодировка строк в новой программе более современная многосимвольная – Unicode, а была односимвольная ANSI.
4. Шрифт с диакритикой теперь Gaura Times выглядит безупречно, чего не скажеш о TimesSanscrit, который я рисовал весьма несовершенным редактором, и буквы наплывали друг на друга и выглядели коряво.
5. Поиск слов поддерживает полноценные “регулярные выражения”, а были только самопальные два универсальных символа – % – любой пропуск и ? – любая буква.

6. Программа может быть собрана для Микрософт Виндовс, Линукса и Макинтоша, то есть она теперь стала кроссплатформенной!
7. Совремменный 64 битный компилятор С++ даст лучшую оптимизацию и быстродейтсвие программы.
8. Улучшена работа с закладками! Теперь они запоминают не только номер строки, но и язык словаря Шрилы Прабхупады, вид сортировки, сами слова для поиска санскрита и перевода и, конечно же, номер строки!

Сортировка санскрита происходит с учетом диакритики! Например “а” с чертой вверху следует за простой “а”, “у” с чертой вверху следует за простой “у” и так для всех букв с диакритикой.

Также хочу выразить признательность преданному – администратору сайта https://vedabase.io, имя которого я к сожалению не помню сейчас и который несколько лет назад предоставил мне базу данных слов Шрилы Прабхупады с переводом на пять языков мира (португальский, английский, испанский, чешский и русский), а также замечательный шрифт Гаура Таймс, который позволял работать с этой базой. Сейчас уже и Gaura Times устарел и шрифт используется другой и другая раскладка диакритики. Ой. Не поспеешь. Также благодарность всем прогрммистам, трудом которых я пользовался – библиотека Ultimate++, компиляторы, линковщики, опрерационная система.

https://github.com/Navadvipa-Chandra-das/PrabhupadaSlovary – тут исходный текст.

Тут можно скачать готовую сборку для Виндовс от Микрософт 32 и 64 бита. Вскорости будет сборка для Линукса и скорее всего и для Макинтоша от Эпл.

http://nizhnyaya-navadvipa.ru/download/PrabhupadaSlovary/PrabhupadaSlovaryWindows32bit.7z

http://nizhnyaya-navadvipa.ru/download/PrabhupadaSlovary/PrabhupadaSlovaryWindows64bit.7z

Кстати, если возможно, помогите, пожалуйста нашей строящейся вайшнавской сельскохозяйственной общине Нижняя Навадвипа. Сейчас на трактор собираем. Вот наш сайт – http://nizhnyaya-navadvipa.ru/ .

Большое спасибо! Харе Кришна!

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

Вёрстка вайшнавского календаря-панчанги. Путь джедая.


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

Это статья о том, как за несколько часов сверстать книгу вайшнавского календаря-панчанги на много лет вперед, например на 50 или даже на сто лет вперёд! При этом календарь на 52 года помещается всего лишь на 76 обыкновенных офисных листах формата А4, при печати с двух сторон, и может быть распечатан даже на домашнем принтере без особого труда. Можно сделать перекидной настольный календарь, можно сделать отрывной настольный или настенный календарь, а можно сделать буклет или книгу – как Вам будет угодно. Вот примерный вид:

Хотите? Тогда эта статья для Вас!

1. Сам календарь можно просчитать на программе GCal, которую можно скачать на сайте krishnadays.com .
Интересно заметить, что для того, чтобы просчитать календарь для Донецка без учета перехода на летнее время, пришлось выбрать часовой пояс пояс +3 Indian/Antanarivo, а если выбрать +3 Europe/Moscow, то переход на летнее время будет учитываться, а по факту такого перехода уже нет.
2. Результат нужно сохранить в текстовом файле (формат txt)!
3. Необходимо запустить программу “Конвертилка-переводчик Прабхупада”, которую можно скачать по адресу – http://nizhnyaya-navadvipa.ru/apps/ или собрать её из исходных текстов, находящихся по адресу – https://github.cBookletimposerom/Navadvipa-Chandra-das/prabhupada_calendar . С сайта github можно скачать программу разными способами. Первый способ, скачать архив по адресу – https://github.com/Navadvipa-Chandra-das/prabhupada_calendar/releases . Выбирайте свежую версию. Второй способ – выполнить команду в терминале:
$ git clone https://github.com/Navadvipa-Chandra-das/prabhupada_calendar.git
Но чтобы команда git в терминале (консоли) работала, возможно придется установить программу, например в моей системе Линукс Федора 27 такая установка выглядит так:
$ sudo dnf install git-all
Третий же способ – скачать “Конвертилку-переводчик Прабхупада” при помощи утилиты dub – менеджера пакетов языка программирования D . Язык D можно установить с сайта dlang.org . В моем случае для успешно компиляции программы потребовалось установить некоторые дополнительные пакеты в Линукс Федора. Вот команды:

$ sudo dnf install SDL2 libevent-devel openssl-devel libcurl-devel git-all
$ dub fetch prabhupada_calendar
$ dub run prabhupada_calendar --build=release

В скачанной программе “Конвертилка-переводчик Прабхупада” в каталоге (папке) prabhupada_calendar есть каталог RU . В этом каталоге есть все необходимые файлы для верстки Вашего вайшнавского календаря-панчанги! Для начала нам понадобится файл Perevod.txt, а файлы Донецк 2017-2069.sla.gz и FreeSerif.zip нам понадобятся позже. Остальные файлы в папке RU – это просто демонстрационные примеры.

Нужно запустить программу “Конвертилка-переводчик Прабхупада”. В поле ввода Входной файл нужно выбрать Ваш календарь-панчангу, который выдала Вам программа вайшнавского календаря GCal, в моем варианте это Donetsk2017-2069.txt, в поле ввода выходной файл нужно написать имя того текстового файла, в котором программа сохранит результат перевода и конвертации календаря, я использую расширение “ура” – Donetsk2017-2069.ура, а в третьем поле “Файл перевода” необходимо выбрать файл Perevod.txt, который Вы сможете найти в каталоге prabhupada_calendar/RU скачанной программы. Все галочки я рекомендую оставить включенными. Смело нажимаем кнопку “Есть работать по Стахановски!” и ждем, пока программа работает над формированием календаря-панчанги в текстовом виде. После формирования результата, я рекомендую установить в Вашей операционной системе шрифт FreeSerif, так как вся верстка в моем варианте использует именно этот шрифт, но Вы можете использовать и любой другой. Для установки FreeSerif необходимо распаковать файл FreeSerif.zip из каталога RU и полученные файлы с расширением tft установить в Вашу систему. Возможно, что шрифт FreeSerif у Вас уже установлен, тогда его дополнительно устанавливать не надо!
Теперь Вам необходимо установит программу Scribus . Я использовал версию Scribus 1.4.6 . Пробовал также версию Scribus 1.5.3 , но, к сожалению, новая версия Скрибуса так медленно работала, что собственно работать на ней я не смог. Каждый шелчок мышью – и зависание на десятки минут, если не на часы. Scribus 1.4.6 с большими файлами работает тоже очень и очень медленно, но Вы наберитесь терпения – десять минут на операцию – это нормально для него 🙂 . Возможно, что у меня мало памяти для Скрибуса (2 Гигабайта), возможно мой диск SSD слишком медленно работает с файлом подкачки. Возможно. Возможно у Вас не будет проблем с быстродействием Скрибус, хотя это сомнительно. Так или иначе – идем дальше! Нужно запустить программу Скрибус 1.4.6 и открыть демонстрационный и он же шаблонный файл Донецк 2017-2069.sla.gz , который находится все в том же каталоге RU . Теперь, когда файл загружен, необходимо проделать проделать несколько шагов:
1. На первой странице календаря-панчанги выбрать мышкой текстовый блок с календарем. Теперь кнопка “Изменить текст (Ctrl+T)” станет доступной! Надо нажать её! Кстати у меня быстрая клавиша Скрибуса 1.4.6 Ctrl+T не работала, равно как и многие другие быстрые клавиши. В Скрибусе 1.5.3 быстрые клавиши работали! Итак у нас появилась окошко редактирования текста “Story Editor – Текст 5”, где Текст 5 – просто имя нашего текстового блока. В нем мы и будем работать! Для начала удалим весь текст – команда меню “Файл” -> “Удалить весь текст”
2. Загрузим наш календарь-панчангу на русском языке: меню “Файл” -> “Загрузить из файла” и выбрать наш файл на русском, в моем варианте – Donetsk2017-2069.ура .
3. Выделяем весь текст – меню “Правка” -> “Выделить всё Ctrl+A”
4. Установить стиль “Праздник” для всех абзацев календаря-панчанги. Щелкнуть мышкой на первом абзаце с целью убрать выделение всего текста.
5. Воспользуемся диалогом “Поиск и замена” для установки нужных стилей определенным абзацам календаря-панчанги. Меню – “Правка” -> “Найти/заменить… Ctrl+F”

В колонке “Найти:” устанавливаем галочку Текст и в поле ввода текста пишем “Маса, Гаурабда”
Внизу устанавливаем галочку “Слово целиком”
В колонке “Заменить на:” в поле ввода тоже пишем “Маса, Гаурабда”
Устанавливаем галочку “Стиль” и выбираем мышкой стиль “Месяц”

Нажимаем кнопку “Искать”, после этого кнопка “Заменить всё” становится доступной! Именно её мы и нажимаем! Теперь ждем результата. Для выполнения всех замен может уйти несколько минут.
6. Провести поиск и замену для всех месяцев по рецепту пункта 5, с той лишь разницей, что стиль в колонке “Заменить на:” нужно установить в “День” :
января заменяем на января со стилем “День”
февраля заменяем на февраля со стилем “День”
марта заменяем на марта со стилем “День”
апреля заменяем на апреля со стилем “День”
мая заменяем на мая со стилем “День”
июня заменяем на июня со стилем “День”
июля заменяем на июля со стилем “День”
августа заменяем на августа со стилем “День”
сентября заменяем на сентября со стилем “День”
октября заменяем на октября со стилем “День”
ноября заменяем на ноября со стилем “День”
декабря заменяем на декабря со стилем “День”

не забывая, что галочку “Слово целиком” на всякий случай нужно включать
7. Провести поиск и замену фразы “Солнце вошло” по тому же рецепту, с той лишь разницей, что стиль в колонке “Заменить на:” нужно установить в “Солнце”!
8. Нажимаем кнопку “Обновить текст в блоке и выйти Ctrl+W” или аналогичное меню “Файл” -> “Обновить текст в блоке и выйти Ctrl+W”.
9. Сохраняем наш календарь-панчангу, нажав кнопку “Сохранить (Ctrl+S)”.
10. Экспортируем наш календарь-панчангу в файл формата PDF. Меню – “Файл” -> “Экспортировать” -> “Сохранить как PDF…” . Я включил галочку “Сжать текст и векторную графику” – качество от этого не меняется, только размер PDF-ки, остальные настройки оставил как есть “Все страницы”, Совместимость – “PDF 1.4 (Acrobat 5)”. Пишем подходящее имяч файла, в моем случае это – Донецк 2017-2069.pdf и жмём кнопку “Сохранить”! Ждем окончания процесса!
11. Теперь файл Донецк 2017-2069.pdf готов, в нем каждая страничка имеет размер А5 и теперь необходимо из этого файла получить такой файл pdf, в котором каждая страничка будет иметь в два раза больший размер, то есть А4 и на которой будет помещаться ровно по две страницы нашего календаря-панчанги или на крайней странице формата А4 может быть одна страница формата А5, если количество страниц А5 нечетное число. На профессиональном жаргоне такое действие называется “спуск полос”. Помню выражение “спуск полос” я первый раз услышал от Абхинанды прабху. Краткое ознакомление с программами для “спуска полос” выявило закономерность – практически все серьёзные программы “спуска полос” – платные, со стоимостью доходящей до нескольких тысяч долларов. Я воспользовался бесплатной программой для спуска полос – Bookletimposer, которую необходимо установить с сайта – http://kjo.herbesfolles.org/bookletimposer/ . Если Вы пользователь Ubuntu – можно скачать установочный пакет, для других систем автор Bookletimposer Kjö Hansi Glaz предлагает установить из исходных текстов. Это не трудно. Скачиваем исходные тексты и в терминале в каталоге программы Bookletimposer выполняем всего две команды:

$ ./setup.py build
$ sudo ./setup.py install

Программа Bookletimposer написана на языке программирования Питон версии 2. В моем случае мне потребовалось установить в мою операционную систему Линукс Федора 27 дополнительные пакеты:

$ sudo dnf install python3-distutils-extra python2-distutils-extra intltool python2-PyPDF2 python3-PyPDF2 pyPdf

10. Итак, когда Bookletimposer успешно установлен, его необходимо запустить! После запуска я выбрал вариант “Put multiple input pages on one output sheet label” – это третяя огромная кнопка-флажок в самом верху! Осталось выбрать “Input file” (входной файл) – в моем случае – это файл “Донецк 2017-2069.pdf” . Bookletimposer любезно предложил в качестве имени выходного файла “Донецк 2017-2069-conv.pdf”. Я согласился и нажал кнопку “Преобразовать”. Все! Остается дождаться результата! И календарик-панчанга на много много лет вперед готов! Ура! Харе Кришна! Теперь остается только напечатать календарик и подшить его. Данный вариант верстки рассчитан на подшивку вдоль верхнего края календаря. Сам календарь-панчанга получился в “альбомной” ориентации.

Харе Кришна!

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