Найти в Дзене
ITэ и ТэДэ

ИСУБД CronosPRO, мой подход к работе. № 4 Словари ч.2 Реализация функционала модуля...

Теперь надо реализовать весь желаемый функционал модуля TVocSingle. Как то: поиск значения по словарю, выбор значения из списка по умолчанию, возможность отмены изменения значения и открытие окна изменения словаря. Что должно получиться: Предыдущая статья: В демонстрационном банке от компании закрался косячок, после восстановления копии, в ней невозможно добавлять новые записи к вновь созданной базе данных. Дело правится запуском Ревизии Банка и исправлением ошибок: В базе "Лицо, ищущее работу" банка Primer1, только один словарь с одинарным значением, да и тот не серьезный для примера. Создам еще одно словарное поле. Чтобы не заморачиваться с новым словарем использую имеющийся - "Страны мира", а создаваемое поле - "Место рождения", тем более что такое поле просится в данную базу. И соответственно добавлю BirthPlaceLb и BirthPlacePnl для поля "Место рождения", на форму по аналогии с полем для "Пола", также в скрипт формы добавлю переменную BirthPlace для реализации клас

Теперь надо реализовать весь желаемый функционал модуля TVocSingle. Как то: поиск значения по словарю, выбор значения из списка по умолчанию, возможность отмены изменения значения и открытие окна изменения словаря. Что должно получиться:

Предыдущая статья:

В демонстрационном банке от компании закрался косячок, после восстановления копии, в ней невозможно добавлять новые записи к вновь созданной базе данных. Дело правится запуском Ревизии Банка и исправлением ошибок:

В базе "Лицо, ищущее работу" банка Primer1, только один словарь с одинарным значением, да и тот не серьезный для примера. Создам еще одно словарное поле. Чтобы не заморачиваться с новым словарем использую имеющийся - "Страны мира", а создаваемое поле - "Место рождения", тем более что такое поле просится в данную базу. И соответственно добавлю BirthPlaceLb и BirthPlacePnl для поля "Место рождения", на форму по аналогии с полем для "Пола", также в скрипт формы добавлю переменную BirthPlace для реализации класса и его инициацию в функции Форма_Open(), все по аналогии с Gender для поля "Пол":

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

рис. 3 Переменные для работы модуля.
рис. 3 Переменные для работы модуля.

Для загрузки списка значений по умолчанию, их надо где-то хранить. Также для открытия окна редактирования словаря требуется запись базы данных с нужным словарным полем. Чтобы не привязываться в каждом экземпляре модуля к конкретной БД и организации места хранения значений по умолчанию создам базу данных "Настройки" ("НС"). В ней создам множественные словарные поля с номером поля как в словаре и именем мнемокода словарной базы. Посмотреть словарные банки можно переключившись на словари в меню "Банк".

В базе создам запись и в ней можно создать в полях список значений по умолчанию для словарей.

На данном этапе использую одну запись в этой базе данных, в будущем думаю можно развести по пользователям например. У каждого пользователя свои настройки.

Добавлю закрытую функцию ClearSearch() для сброса параметров поиска по нажатию "Esc" и загрузки значений по умолчанию. Объявляю ее перед функцией Prepare(), дабы была доступна ей. В функции берется первая запись из базы "Настройки". По полю с идентичным названием с мнемокодом словаря получаю значения по умолчанию и заношу их в выпадающий список. Или получаю пустую таблицу, если значений нет, тогда если в словаре меньше 10 значений, загоняю их все.

Добавляю открытую функцию TVocSingle:Clear(), для полного обнуления данных модуля.

Добавляю функции установки и получения значения словаря, TVocSingle:SetValue() и TVocSingle:GetValue(), также открытые. При установке значения оно сохраняется и в OldValue, для возможности вернуть по нажатии Ctrl+Z. Для этой работоспособности в функции Prepare() для выпадающего списка добавлю обработчик нажатия клавиш: self.Voc.KeyDown = function(event) ... end В ней устанавливается старое значение словаря, сбрасывается флаг изменения значения и если для модуля определена функция ValueChanged() то она вызывается. Данная функция может быть определена в основной форме для отслеживания изменения состояния модуля. Например для общего контроля изменения записи и корректного отображения надписи на кнопке закрыть/записать.

Там же, в обработчике нажатия клавиш выпадающего списка, обрабатываю нажатия "кнопки вниз", "Esc" и "Enter". Для работы с модулем без использования мышки.

Не обхожу вниманием и обработчик изменения текущего значения списка. При наличии выбранного значения сверяю его со старым, при различии, маркер изменения, если значение не выбрано, то при наличии старого - изменено, а при отсутствии - изменений нет, и опять вызов функции ValueChanged().

рис. 7 Обработчик изменения выбранного значения в выпадающем списке.
рис. 7 Обработчик изменения выбранного значения в выпадающем списке.

Теперь поиск по словарю, обработчик отпускании клавиши в выпадающем списке. Почему именно отпускания? Чтобы поисковая строка уже сформировалась в текстовом значении выпадающего списка. На всякие "Esc", "Enter", "PageUp" и др. подобные не реагирую, выхожу с передачей обработки дальше (event.Handled = false). Если не установлен маркер изменено, есть старое значение и нет выбранного значения то устанавливаю изменено и вызываю ValueChanged(). Дело в том, что при изменении текста, в текстовом поле выпадающего списка, индекс выбранного значения сбрасывается, но вызов функции SelectedIndexChanged() не происходит. Ловлю это здесь.

Затем при наличии текста, запускаю поиск по словарной базе, по полю "Понятие". Ищу все что начинается с текста. При наличии результата заношу в выпадающий список и раскрываю его предварительно закрыв. Для адаптации к количеству строк найденного. При ошибке ругаюсь. Если текста для поиска нет, гружу значения по умолчанию. И при отсутствии старого значения убираю маркер изменения.

Ну и кнопка вызова стандартного окна изменения словаря. Вызывается оно методом EditValue("Имя_нужного_словарного_поля", номер_значения) для записи базы где есть такое словарное поле. Здесь то и воспользуюсь базой "Настройки" где для всех словарей созданы одноименные словарные поля. Если в модуле установлено какое либо значение, прописываю его в созданную запись. И вызываю метод. Если он вернул изменение, то обновляю данные в модуле.

рис. 9 Вызов стандартного окна редактирования словаря.
рис. 9 Вызов стандартного окна редактирования словаря.

На форме теперь убираю старый вариант установки пола. Подчищаю код в скрипте формы. В функциях загрузки и сохранения записи прописываю взаимодействие с модулями.

Если было полезно, подписываемся, вам не трудно, нам в копилку ☺.

Листинг модуля TVocSingle 4.2

Копия формы "Данные на лицо".

Копия скрипта TVocSingle.

Копия полного банка Primer1.

Следующая часть: