Окно "Список отелей"

Создайте с помощью наследования из 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!)