2018年3月8日 星期四

Published 星期四, 3月 08, 2018 by with 3 comments

powerbuilder的TrackBar和ScrollBar對於滑鼠滾輪的處理

powerbuilder 的 TrackBar (vTrackbar / hTrackBar) 與 ScrollBar (vScrollbar / hScrollbar) 的控制上一直以來都少了一根筋,那就是 Mouse Wheel 滑鼠滾輪的事件。

雖然,Trackbar/Scrollbar 在使用時,滑鼠滾輪都可以控制標桿的移動,但是因為沒有對應的事件與通知,所以沒辦法處理滾輪滾動之後的定位值

你可以在 Trackbar/Scrollbar 找到下面事件

moved - 標桿移動後的觸發,但是只限於使用滑鼠按住標桿的移動才會發生。
pageup/pagedown - 當使用滑鼠點擊標桿 兩側 時,標竿會移動一個距離的事件。
lineup/linedown - 當使用鍵盤方向鍵(Arrow Key)控制標桿移動時,會觸發的事件。

但就缺少滑鼠滾輪事件!

此時就可以利用攔截 Windows Message ID 方式處理:

滑鼠滾輪事件 WM_MOUSEWHEEL = 522
此事件會帶 Word 參數 → 0 =向下滾動、1=向上滾動

在 Trackbar/Scrollbar 裡面有個 Other Event,在裡面下判斷,即可以處理


if message.number = 522 then
if message.wordparm < 0 then
//mouse wheel down
st_pos.text = string(vtb_1.position)
else
//mouse wheel up
st_pos.text = string(vtb_1.position)
end if
end if

那如果要防止使用者使用滑鼠滾動(禁用),就可以在事件返迴 1 ,以防止事件執行:


if message.number = 522 then
return 1
end if

相對的這個在 DataWindow Control 物件上也適用喔!




    email this       edit

3 個回應:

梁粲鑫 提到...

您好,有PB的問題想請教您。不知道您有沒有遇過PB8的ERP程式,在win10下切換ERP中的程式時程式會突然中止關閉,沒有任何訊息。再登入程式,又可以正常使用。發生的程式和時間不固定。
(在舊的OS版本不會有這種情形,win10試了相容模式執行,一樣有這樣的狀況)

WILDOX 提到...

Re: 梁粲鑫 <1400092409903977017>

您好,關於這個問題由於我沒用過PB8 (我是用過PB6,PB9,PB10),所以對於PB8的本身問題不是甚了解,不過個人可以提供您一些方向以利協助您去解決看看:

1、PBVM本身問題,PB開發工具在每個版本通常都會有BUG存在,相對的Sybase(現在應該是SAP公司)對對於每個版本提供所謂的EBF修正套件,請確認您的PB8的EBF是否有Patch到最後一個Release,EBF修正套件可以到Sybase官網找看看。以前PB6也存在這個畫面切換或滾動與DW在GROUP明細筆數為0就當掉的問題,修正後就正常。修正EBF後,請重新打包PBVM相關Runtime去UPDATE 使用者端的Runtime。

2、程式寫法有漏洞,這種狀況會比較多,我舉個我遇過的例子:如在POP Window時沒有明確指定Parent Window,在單一環境下使用是沒有問題,但是在多程式執行時會導致先行程式POP Window在返回/回傳Parent Window 時發生Parent Window不是Current Window,此時,這種情況下Windows XP/7等級作業系統可能漠視『記憶體指標錯誤』問題讓程式繼續執行(這種狀況只要Parent不是NULL即可),由於Windows 10對於錯誤記憶體指標容忍度比前版作業系統還低(目地為保護OS),所以當指標錯誤會被認定為Hack Memory Address,
因此會直接把這類程式Stop掉。

3、PB有呼叫windows API或是非同步元件未正常釋放/重置,其實這個也多牽扯到記憶體操作不正常導致,雖然PB本身不會讓設計者直接操作記憶體相關事項,但是在運作上卻是息息相關,而且會有部分開發會用到系統API的,所以以前開發的程式也許再過往作業系統上『感覺』沒有問題,但是Windows 10本身是身負移動裝置上的作業系統,為了維持OS本身絕對穩定度,對於各類執行於上的程式來說,記憶體的錯誤操作卻是更嚴格管制與隔離,卻有一種寧可把APP CRASH掉也不可以影響到OS的現象。

除了第一種情況外,2、3狀況可能您都要重新檢視程式碼是否依照標準去撰寫或是冗碼,而且2、3狀況的特性是偶發但偶發率偏高情形,第一種卻是比較明確在某些條件下一定會當掉,希望上面一點見解以期能解決您的問題。

梁粲鑫 提到...

感謝您快速、熱情、專業、無私的分享。問題已經解決了,再次感謝~