转自:http://yedward.net/?id=68
Form中一般常用的画布类型包括content、stacked、tab这三种,其实content类型的画布是每一个form都必须有的,而且只能有且仅有一个。其中,Tab画布算是比较特殊的一种画布了,首先不能直接在Tab上放置任何item,所有的item都是放在Tab的下属的标签页中,其次它的切换也还是蛮有门道的,这篇文章就聊聊怎么控制Form中Tab画布不同标签之间的切换。
假设有这样一个例子,有一个Tab画布(名为TAB_DEMO),其下有headers、lines两个标签页,同时还有一个名为order_lines_stacked的stacked类型的画布,我想实现,headers是第一个标签页,也是默认展示的标签页,我要把order_lines_stacked放在lines标签里面,当切换到lines的时候,order_lines_stacked显示,切换到headers的时候,order_lines_stacked又隐藏掉。
对于上面这个例子,首先要知道的是Tab画布及其标签页和堆叠画布其实是独立的,并不能直接通过属性设置来让stacked画布放置在某一个Tab标签页中,这个时候想要实现这样的功能,就要通过代码来实现,这也就是我要说的Tab特殊的一个地方。这里,我们要用到一个Form级的WHEN-TAB-PAGE-CHANGED触发器,特别要注意的是该触发器的fire条件是用鼠标点击时才触发,也正因为这样后面我们还要加一个触发器,以实现当是使用快捷键而不是鼠标点击来切换标签时候的功能实现。
对于上面的例子,实现过程如下:
在Form级添加WHEN-NEW-FORM-INSTANCE,代码如下:
set_canvas_property(‘TAB_DEMO‘, TOPMOST_TAB_PAGE, ‘HEADERS‘); hide_view(‘ORDER_LINES_STACKED‘);
在Form级添加WHEN-TAB-PAGE-CHANGED,代码如下:
if :system.tab_previous_page = ‘HEADERS‘ then validate(block_scope); if :system.MODE = ‘ENTER-QUERY‘ or not form_success then set_canvas_property(‘TAB_DEMO‘, topmost_tab_page, :system.tab_previous_page); return; end if; elsif :system.tab_previous_page = ‘LINES‘ then validate(block_scope); if :system.MODE = ‘ENTER-QUERY‘ or not form_success then set_canvas_property(‘TAB_DEMO‘, topmost_tab_page, :system.tab_previous_page); return; end if; end if; if :system.tab_new_page = ‘LINES‘ then show_view(‘ORDER_LINES_STACKED‘); go_item(‘ORDER_LINES.ORG‘); -- ORDER_LINES.ORG是一个Item,假设本来LINES标签页上就已经设置了 elsif :system.tab_new_page = ‘HEADERS‘ THEN hide_view(‘ORDER_LINES_STACKED‘); go_item(‘ORDER_HEADERS.DESCRIPTION‘); -- ORDER_HEADERS.DESCRIPTION是一个Item,假设本来HEADERS标签页上已经设置了 end if;
如果是使用快捷键切换的话,不会触发上面的trigger,所以做如下处理:
在ORDER_LINES.ORG这Item上面添加一个WHEN-NEW-ITEM-INSTANCE触发器,代码如下:
show_view(‘ORDER_LINES_STACKED‘);
在ORDER_HEADERS.DESCRIPTION上面添加一个WHEN-NEW-ITEM-INSTANCE触发器,代码如下:
hide_view(‘ORDER_LINES_STACKED‘);