這樣就可以調整資料的順序,或是將資料由 A 搬到 B ,或者可以把資料做移除的動作。
DEFINE l_dd ui.DragDrop 要先宣告螢幕拖拉的變數
必須要在 DISPLAY ARRAY 再加上 Drag 和 Drop 的區段,使用方法如下:
ON DRAG_START(l_dd) :當開始拖拉來源端 Object 的某一筆資料時
ON DRAG_FINISHED(l_dd):當來源端的 Object 拖拉完成時
ON DRAG_ENTER(l_dd):當拖拉到目的端 Object 時
ON DRAG_OVER(l_dd):當拖拉到目的端 Object 的某一個 Cursor 時
ON DROP(l_dd):當拖拉到目的端 Object 完成時
所以要在 DISPLAY ARRAY 可以進行拖的動作就要加上 DRAG ,要可以進行拉的動作就要加上 DROP ,不然滑鼠就會出現禁止的圖示而無法完成拖拉。
再來就是相關的指令說明:
1. setOperation:預設的拖拉動作
CALL l_dd.setOperation(""):預設不能拖拉,其實你覺得拖拉很討厭的話,可以執行此指令
CALL l_dd.setOperation("move"):預設為資料搬移
CALL l_dd.setOperation("copy"):預設為資料複製
2. addPossibleOperation:額外增加拖拉的動作
CALL l_dd.addPossibleOperation("copy"):通常都是預設設定為搬移,然後拖拉時加上 Ctrl 鍵,就可以 copy 的動作
3. setMimeType:設定 MIME 的格式,當要拉到外部的程式時,必須要可以支援拖拉的程式才行(記事本就沒這個功能了)
CALL l_dd.setMimeType("text/plain")
CALL l_dd.setMimeType("text/uri-list")
CALL l_dd.setMimeType("text/x-vcard")
:
(自定義的 MIME 格式)
4. setBuffer:設定拖資料時暫存的資料
CALL l_dd.setBuffer(g_sfa[arr_curr()].sfa03):舉例要把 sfa03 的欄位內容拖拉的方式複製到 Excel 來貼上
5. setFeedback:設定拖拉的模式為取代或是新增
CALL l_dd.setFeedback("all") :可取代也可以新增
CALL l_dd.setFeedback("insert"):只能新增
CALL l_dd.setFeedback("select"):只能取代
6. getLocationRow() :回傳目前要拖拉的 cursor 行號
LET l_ac = l_dd.getLocationRow():舉例目前要拖拉的 cursor 行號指派給 l_ac 變數
7. getLocationParent():回傳 Tree View 的 Node,用法和 getLocationRow() 相同
8. getOperation():回傳拖拉動作是搬移還是複製
CASE l_dd.getOperation()
WHEN "move"
MESSAGE "MOVE"
WHEN "copy"
MESSAGE "COPY"
END CASE
9. selectMimeType():所拖拉的資料格式
CASE
WHEN dnd.selectMimeType("text/plain")
WHEN dnd.selectMimeType("text/uri-list")
END CASE
範例為要把單身的資料用拖拉的方式進行資料的排序
DEFINE l_dd ui.DragDrop,
l_n_old LIKE type_file.num5,
l_n_new LIKE type_file.num5
DEFINE l_i LIKE type_file.num5
DISPLAY ARRAY g_oeb TO s_oeb.* ATTRIBUTE(COUNT=g_rec_b)
ON DRAG_START(l_dd)
LET l_n_old = arr_curr()
CALL l_dd.setOperation("move")
ON DRAG_FINISHED(l_dd)
IF l_n_old <> l_n_new THEN
IF l_n_old < l_n_new THEN
FOR l_i = l_n_old+1 TO l_n_new
LET g_oeb[l_i].oeb03n= l_i-1
END FOR
LET g_oeb[l_n_old].oeb03n= l_n_new
ELSE
FOR l_i = l_n_new TO l_n_old-1
LET g_oeb[l_i].oeb03n= l_i+1
END FOR
LET g_oeb[l_n_old].oeb03n= l_n_new
END IF
FOR l_i = 1 TO g_tc_sfb1.getlength()
UPDATE oeb_file SET oeb03= g_oeb[l_i].oeb03n
WHERE oeb01 = g_oea.oea01
AND oeb03 = g_oeb[l_i].oeb03
END FOR
END IF
CALL DIALOG.setCurrentRow("s_oeb",l_n_new) # 將 cursor 移到新的位置
CALL t400_b_fill() # 更新資料
CONTINUE DISPLAY
ON DRAG_OVER(l_dd)
LET l_n_new = l_dd.getLocationRow()
ON DROP(l_dd)
END DISPLAY
此範例只提供參考用,要注意欄位是否為 INDEX 有重複的情況,會造成 update 失敗。
結論:拖拉方式的操作在某些情況可以帶來使用者更方便的使用,試試看吧~~
沒有留言:
張貼留言