Хочу развить тему «Работа с глобальными функциями» (
http://cronospro.ru/?p=296 ) и написать пример для новичков (и шпаргалку для себя самого).
Работая с формами ввода, я тоже стремлюсь избавиться от избыточности кода программы, т.е. от повторения одной и той же функции в разных формах.
Например: в моих формах ввода присутствует кнопка «Удалить», которая вызывает событие удаления текущей записи. Пользователь должен осознанно выполнять это действие. Осознанность достигается вопросом пользователю: "Текущая запись «Иванов Иван Иванович 01.01.1971» будет удалена. Подтверждаете удаление?". В этот вопрос (у меня) заносится информация из «информативных полей» (ИП) текущей записи.
Как «выловить» ИП, не прибегая к их четкому указанию в форме ввода, и написать универсальный код, подтверждающий удаление объекта, для всех форм банка?
Допустим, что форма ввода уже есть (в моем случае для формы ввода лиц «ЛЦ»). Есть кнопка «Удалить запись» (кнопка1). Проверяем или дописываем код:
Код:function кнопка1_Click( control )
Me:DeleteRecord()
end
--Событие ConfirmDeleteRecord используется для отображения пользовательского диалога для подтверждения на удаление записи.
function Форма_ConfirmDeleteRecord( form )
local del=(MsgBox("Текущая запись \""..ConfDelRec("ЛЦ",Me.Record).."\" будет удалена. Подтверждаете удаление?",BtnYesNo+IconQuestion)==IdYes)
return false, del;
end
function Форма_Load( form )
if not Tsettings then
CroApp.GetBank():OpenForm("TSettings",0,Me)
end
end
Проектируем «управляющую форму» "TSettings". (При старте форма будет запускаться в невидимом режиме).
Проектирование – Форм ввода – Управляющая форма – Новая. Вставляем код и активируем событие «Open»
Код:str = [[
TSettings = {1}
_G.GetInfoValue = function (rec, t_fields)
local t_if
if t_fields then t_if=t_fields else t_if=t_InfoFields end
local t_info = {}
for _,num in ipairs(t_if) do
table.insert(t_info,rec:GetValue(num))
end
return table.concat(t_info," ");
end
_G.ConfDelRec = function (Mn,rec)
CurBase=CroApp:GetBank():GetBase(Mn)
t_InfoFields={}
do -- анализа статуса поля
local t_fields = CurBase.Fields
for _, field in ipairs(t_fields) do
if field.Type>0 and field.Type<6 then
if field:TestStatus(2048) then
table.insert(t_InfoFields, field.Number)
end
end
end
end
return GetInfoValue(rec,t_fields)
end
]]
assert(loadstring(str))()
function Форма_Open( form )
return false;
end
Чтобы применить этот код в иной базе, надо только вписать правильный мнемокод сюда «\""..ConfDelRec(
"ЛЦ"
,Me.Record).."\».
P.S. Спасибо за помощь и обучение Zuluss