В предыдущей части я показал принцип, как можно использовать встроенный в форму объект DataEnvironment для работы с одинаковыми базами данных, но с разными данными и хранящихся в разных каталогах.
Теперь углубимся в детали. В моих реальных приложениях, весь код, подобный приведенному для методов, ассоциированых с событием Load класса формы, хранится в пользовательских методах и процедурах, введенных в класс. К сожалению, код для именно такого случая нельзя разместить в диспетчерах, создаваемых на базе класса Custom и затем добавляемых в класс формы в качестве объекта, так как его инициализация происходит после события события Load формы и события Init объекта DataEnvironment. В таком случае в методе, ассоциированном с событием Load класса формы достаточно вызвать пользовательский метод или обратиться к пользовательской функции класса формы.
В предыдущей статье я написал "Но перед этим, независимо от установки свойства AutoOpenTables объекта DE, вызовем его метод CloseTables". Пришла пора объясниться. Дело в том, что свойство AutoOpenTables объекта DE можно использовать как флаг, в зависимости от значения которого мы либо будем перестраивать окружение, либо нет. С одной строны, это для особо ленивых, так как все можно сделать гораздо более элегантнее. С другой стороны - это удобно, так как установка значения этого свойства в False (.F.) заставит форму посмотреть - а с этим-ли окружением мне нужно работать?
То есть, в простейшим случае код в методе, ассоциированном с событием Load класса формы можно видоизменить следующим образом:
If !This.DataEnvironment.AutoOpenTables
If !This.udf_SetDE("DE1")
=MESSAGEBOX(;
"Something is going wrong in Danish Kingdom!"+chr(13)+;
"Where is this ragged programmer Shutenko?",;
16,;
"Error occurs in application";
)
Return .F.
Endif
Endif
и переместить весь приведенный ранее код, с добавлением обработки ошибок в пользовательскую функцию udf_SetDE() класса формы. Зачем? А вот зачем - до нажатия кнопочки:
и после:
Мы меняем окружение на лету!!! и весь-то код в методе, ассоциированном с событием Click кнопки заключен в одной строке:
This.Parent.udf_SetDE("DE3")
причем в данной тестовой форме, созданной на основе класса, было открыто 12 таблиц и два локальных представления. А на картинках показан textbox с привязкой к полю webprojects.localpath. Впечатляет? Кто сказал, что это "нехороший" объект? Поднимите руку! Вы можете сделать все так же легко с обычным USE? Позвольте сильно посомневаться в этом.
Будет продолжено!
|