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

ИСУБД CronosPRO, мой подход к работе. № 4 Словари ч.3 Множественные значения.

Модуль для ввода - редактирования словарного поля с множественными значениями. С тем-же функционалом, что и в предыдущем модуле. Добавлен элемент "Список" в котором отображаются выбранные значения с возможностью изменения порядка отображения. Выглядеть будет так: Предыдущая статья: Для размещения модуля привязанного к полю "Гражданство", на форме добавлю панель "NationalityPnl" и подпись для нее "NationalityLb". По аналогии с предыдущим словарем переменные: "Nationality" и "Nationality_chg".
Инициализация в функции Форма_Open() и реакция на изменение значения в Форма_Load(): По аналогии с созданием модуля "TVocSingle" создаю модуль "TVocMultiValue". По содержанию они во многом схожи, но есть отличия. При инициализации в него помимо мнемокода словаря можно передать параметр - "надпись" (title):
function TVocMultiValue:new(ctrl, voc_db, title) - соответственно при активации:
Nationality,errStr = TVocMultiValue:new(Me.NationalityPnl, "AD", "Гражданство:") Добавил

Модуль для ввода - редактирования словарного поля с множественными значениями. С тем-же функционалом, что и в предыдущем модуле. Добавлен элемент "Список" в котором отображаются выбранные значения с возможностью изменения порядка отображения. Выглядеть будет так:

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

Для размещения модуля привязанного к полю "Гражданство", на форме добавлю панель "NationalityPnl" и подпись для нее "NationalityLb". По аналогии с предыдущим словарем переменные: "Nationality" и "Nationality_chg".
Инициализация в функции Форма_Open() и реакция на изменение значения в Форма_Load():

По аналогии с созданием модуля "TVocSingle" создаю модуль "TVocMultiValue". По содержанию они во многом схожи, но есть отличия. При инициализации в него помимо мнемокода словаря можно передать параметр - "надпись" (title):
function TVocMultiValue:new(ctrl, voc_db, title) - соответственно при активации:
Nationality,errStr = TVocMultiValue:new(Me.NationalityPnl, "AD", "Гражданство:")

рис. 2 Различия в отображении.
рис. 2 Различия в отображении.

Добавил проверку на наличие и правильности переданного мнемокода словаря. Скорректировал и модуль простого словаря.

рис. 3 Проверка параметра voc_db и переменные.
рис. 3 Проверка параметра voc_db и переменные.

Добавил массив Values_to_idx в котором хранятся значения словарного поля и их соотношение со списком значений для отображения.
Переменная SelectedKey, как маркер, что идет выбор значения клавиатурой, для избежания срабатывания SelectedIndexChanged() в комбобоксе поиска значения. При установленном маркере функция не срабатывает.

Функция Prepare() (создание элементов модуля и функций реакции) также претерпела некоторые изменения. Создаю дополнительный элемент "Рамка" (GroupBox) который объединяет все элементы в группу (Остальные элементы добавляю к нему). Комбобокс переименовал в "VocSearch". Далее разместил "Список" (ListBox) в котором отображается список выбранных значений с возможностью удалить значение по двойному клику. И две кнопки справа от него для изменения порядка значений.

В этом модуле в функцию SetValue(tbl) передается таблица с кодами значений поля, получаемая методом Record:GetValue("словарное поле", 0, false). И в функции GetValue() отдается также массив кодов значений для использования непрямую в Record:SetValue("словарное поле", tbl_code).
Сравнение таблиц старых и выбранных значений поля (для фиксирования изменения) провожу строковым методом string.compare(), таблицы для этого сериализуются. Вынес этот процесс в отдельную функцию UpdateEdited().

Добавление значений происходит в функции SelectedIndexChanged() поискового комбобокса. Для проверки на наличие в списке значений добавляемого, написал функцию GetIdxValBySNCode(table, sn_code). Она в массиве вида value_tо_idx[idx] = {Name, Code} (или {Name, SN}) ищет по коду или системному номеру. И если есть, возвращает индекс и значение, иначе nil. Она мне точно понадобится и далее, поэтому оформил через модуль sys.FuncSys.

Ну и обработчики кнопок изменения порядка отображения значений. Активация возможных смещений происходит в функции SelectedIndexChanged() списка значений. А в функциях Click() кнопок, смещение выбранного значения.

Немного изменено взаимодействие с модулем при загрузке и сохранении значений в функциях Load() и Save() формы.

рис. 7-1 Изменения взаимодействия при загрузке и сохранении.
рис. 7-1 Изменения взаимодействия при загрузке и сохранении.

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

Модуль словарного поля с множественными значениями.

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

Копия скрипта TVocVultiValue с комментариями.

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

Следующая часть: Модуль ввода поля Дата. Дата рождения. Пока в работе 😊