Окно "Список отелей"
Создайте с помощью наследования из w_base_dw новое окно. Сохраните его под именем w_class. Заголовок окна "Список отелей", окно данных для dw_sheet установите dw_country, меню окна - m_class.
Теперь необходимо сделать трехуровневый список: страна - курорт - отель. Т.к. данные для этого списка находятся в разных таблицах и разных объектах DataWindow, нам придется из скрипта менять объекты для dw_sheet.
Объявление переменных окна
В окне Script - Declare объявите следующие переменные:
protected: double id_parent; string is_name_division; string is_name_sector; string is_name_group; string is_name_subgroup;
Событие ue_retrieve_data
dw_sheet.retrieve(id_parent)
Событие ue_dn_enter объекта dw_sheet
Создайте событие ue_dn_enter объекта dw_sheet, причем установите Event ID в pbm_dwnprocessenter (нажатие клавиши Enter).
Скрипт события:
string ls_sort long ll_row if dw_sheet.dataobject = 'dw_class_hotels' then return 1 ll_row = dw_sheet.getrow() if ll_row = 0 then return 1 id_parent = dw_sheet.getitemnumber(ll_row, 'id_country'); CHOOSE CASE dw_sheet.dataobject CASE 'dw_country' is_name_sector = dw_sheet.getitemstring(ll_row, 's_name_country') dw_sheet.dataobject = 'dw_resort'; parent.title = is_name_division + ' / ' + is_name_sector CASE 'dw_resort' is_name_subgroup = dw_sheet.getitemstring(ll_row, 's_name_country'); dw_sheet.dataobject = 'dw_class_hotels'; parent.title = is_name_division & + ' / ' + is_name_sector & + ' / ' + is_name_group & + ' / ' + is_name_subgroup CASE ELSE messagebox('Внимание', 'Неверное значение - ' + dw_sheet.dataobject) return 1 END CHOOSE dw_sheet.settransobject(sqlca); setpointer(HourGlass!) parent.postevent('ue_retrieve_data') setpointer(Arrow!) return 1
Обратите внимание:
- После изменения свойства dataobject объекта dw_sheet , необхобимо вызвать метод settransobject.
- Скрипт события возвращает значение "1". Это означает, что не будет вызван стандартный обработчик данного события (например, нажатие клавиши Enter равносильно нажатию клавиши Down).
Событие ue_dn_key объекта dw_sheet
Создайте событие ue_dn_key объекта dw_sheet, установив Event Id в значение pbm_dwnkey (нажатие клавиши).
Скрипт события:
if keydown(keyEscape!) then triggerevent('ue_dn_escape') return 1 end if
Событие ue_dn_ecape объекта dw_sheet
Создайте событие ue_dn_escape объекта dw_sheet.
double ld_parent_owner double ld_parent long ll_row string ls_sort ll_row = dw_sheet.getrow() CHOOSE CASE dw_sheet.dataobject CASE 'dw_country' return CASE 'dw_resort' select c_parent into :ld_parent_owner from country where id_country = :id_parent; if sqlca.sqlcode <> 0 then return ld_parent = id_parent id_parent = ld_parent_owner dw_sheet.dataobject = 'dw_country' parent.title = is_name_division CASE 'dw_class_hotels' select c_parent into :ld_parent_owner from country where id_country = :id_parent; if sqlca.sqlcode <> 0 then return ld_parent = id_parent id_parent = ld_parent_owner dw_sheet.dataobject = 'dw_resort' parent.title = is_name_division + ' / ' + is_name_sector CASE ELSE messagebox('Внимание', 'Неверное значение - ' + dw_sheet.dataobject) return END CHOOSE dw_sheet.settransobject(sqlca) parent.triggerevent('ue_retrieve_data') ll_row = dw_sheet.find('id_country = ' + string(ld_parent), 0, dw_sheet.rowcount()) dw_sheet.setrow(ll_row) dw_sheet.scrolltorow(ll_row)
Событие doubleclicked и rbuttondown
Вы создали трехуровневый список, навигация по которому осуществляется с помощью клавиш Enter и Escape. Можно добавить к этому навигацию с помощью клавиш мыши. Допустим, наравне с клавишей Enter мы будем использовать двойной щелчок левой клавиши мыши, а щелчок правой клавишей мыши наравне с Ecsape.
Для этого в стандартное событие doubleclicked впишите следующий скрипт:
triggerevent('ue_dn_enter')
Для этого в стандартное событие rbuttondown впишите следующий скрипт:
triggerevent('ue_dn_escape')
Запись вызова окна в базовое меню
Откройте базовое меню m_rad_frame и скрипте события clicked пункта "Список отелей" напишите следующий скрипт:
w_class lw_class; opensheet(lw_class, parentwindow, 0, Layered!)