轉自:http://yedward.net/?id=68canvas
Form中通常經常使用的畫布類型包括content、stacked、tab這三種,其實content類型的畫布是每個form都必須有的,並且只能有且僅有一個。其中,Tab畫布算是比較特殊的一種畫布了,首先不能直接在Tab上放置任何item,全部的item都是放在Tab的下屬的標籤頁中,其次它的切換也仍是蠻有門道的,這篇文章就聊聊怎麼控制Form中Tab畫布不一樣標籤之間的切換。ide
假設有這樣一個例子,有一個Tab畫布(名爲TAB_DEMO),其下有headers、lines兩個標籤頁,同時還有一個名爲order_lines_stacked的stacked類型的畫布,我想實現,headers是第一個標籤頁,也是默認展現的標籤頁,我要把order_lines_stacked放在lines標籤裏面,當切換到lines的時候,order_lines_stacked顯示,切換到headers的時候,order_lines_stacked又隱藏掉。spa
對於上面這個例子,首先要知道的是Tab畫布及其標籤頁和堆疊畫布實際上是獨立的,並不能直接經過屬性設置來讓stacked畫布放置在某一個Tab標籤頁中,這個時候想要實現這樣的功能,就要經過代碼來實現,這也就是我要說的Tab特殊的一個地方。這裏,咱們要用到一個Form級的WHEN-TAB-PAGE-CHANGED觸發器,特別要注意的是該觸發器的fire條件是用鼠標點擊時才觸發,也正由於這樣後面咱們還要加一個觸發器,以實現當是使用快捷鍵而不是鼠標點擊來切換標籤時候的功能實現。.net
對於上面的例子,實現過程以下:code
在Form級添加WHEN-NEW-FORM-INSTANCE,代碼以下:orm
set_canvas_property('TAB_DEMO', TOPMOST_TAB_PAGE, 'HEADERS'); hide_view('ORDER_LINES_STACKED');
在Form級添加WHEN-TAB-PAGE-CHANGED,代碼以下:blog
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,因此作以下處理:it
在ORDER_LINES.ORG這Item上面添加一個WHEN-NEW-ITEM-INSTANCE觸發器,代碼以下:io
show_view('ORDER_LINES_STACKED');
在ORDER_HEADERS.DESCRIPTION上面添加一個WHEN-NEW-ITEM-INSTANCE觸發器,代碼以下:form
hide_view('ORDER_LINES_STACKED');