在訪問資料庫時,經常會遇到記錄數量過多,對資料列表進行初始化時耗費大量時間,使使用者在進入介面時等待時間過長。為了解決這個問題,我們可以通過使用動態載入資料的方法來實現。
即當進行初始化時,只是載入少量的資料,使控制項快速完成初始化,讓使用者在較短的時間內得到控制權,這時載入資料的多少可以根據實際情況進行設定;然後,當使用者滾動檢視的時候,我們檢測其滾動的位置,判斷是否需要繼續載入資料,如果尚未顯示的資料數量少於約定值,則繼續載入一定量的資料,否則不作任何動作。這樣一來,既可以實現所有資料的載入,又不影響使用者的操作。
其實這種方法在vc中很容易實現,我們只要相應相應列表的wm_vscroll就可以了,但是在vb
中,列表控制項不直接支援這個訊息,這就需要我們做一些額外的工作,以實現這一過程。我們似乎可以使用計時器控制項定期對列表狀態進行監視,從而實現改過程,但是這種方法不但影響系統執行速度,而且效果也不是很好,所以在這裡我們仍然使用響應wm_vscroll訊息的方法。
為了實現這一功能,首先是在vb
中處理列表控制項的訊息。由於vb
中無法直接處理我們所需要的訊息,在這裡我們就要用到乙個api函式將列表控制項的訊息處理過程設定為我們自己定義的函式。這個api就是setwindowlong,它的原型是
public declare function setwindowlong lib "user32" alias "setwindowlonga" (byval hwnd as long, byval nindex as long, byval dwnewlong as long) as long
它有三個引數:
hwnd 是要設定的窗體控制代碼
nindex 是要設定專案的索引,在這段程式裡我們將其取值為gwl_wndproc
dwnewlong 是要設定專案的值,在這段程式裡就是我們自定義的訊息處理函式的位址
它的返回值是乙個長整數,是呼叫這個api之前對應專案的值,如果設定失敗,則返回0,對於具體的錯誤資訊可以呼叫getlasterror來獲得,在這裡它將返回原始的列表控制項的訊息處理函式的位址。
具體的做法如下所示:
1.在現有的模組或新建立的模組中定義訊息處理函式
訊息處理函式應定義為下面的形式:
public function ***listproc(byval hwnd as long, byval imsg as long, _
byval wparam as long, lparam as long) as long
if (imsg = wm_vscroll) then
if sb_endscroll = val("&h" & right(hex(wparam), 4)) then
if frm***.***listview.getfirstvisible.index + 100 > frm***. ***listview.listitems.count then
loaddatafunc frm***. ***listview.listitems.count, 100
end if
end if
end if
***listproc = callwindowproc(g_oldproc, hwnd, imsg, wparam, lparam)
end function
這個函式中使用了loaddatafunc對資料進行載入,它是乙個自定義的函式,第乙個引數是資料載入的起始位置(第n條記錄),第二個引數是要載入資料(記錄)的數量。這個函式可以根據自己的實際情況定義,這裡只是我使用的形式。另外,需要注意的是這個訊息處理函式必須定義在模組中,而不能定義在窗體中。
2.當窗體初始化時將列表控制項的訊息處理函式設定為自定義的訊息處理函式
在列表控制項所在的窗體的初始化函式中加入下面**:
g_oldproc=setwindowlong(***listview.hwnd,gwl_wndproc,addressof ***listproc)
其中,***listview.hwnd是列表控制項的視窗控制代碼,這個屬性是乙個隱藏屬性,雖然看不到,但是可以正常使用;我們使用addressof取得了我們自定義訊息處理函式的位址。g_oldproc是乙個全域性變數,用來儲存原始的訊息處理函式位址。
3.當窗體退出時將列表控制項的訊息處理函式設定為原來的函式
在列表控制項所在窗體的unload事件中加入以下**:
setwindowlong ***listview.hwnd, gwl_wndproc, g_ oldproc
在這種處理方法中,最關鍵的就是實現對視窗訊息的自定義處理,所以我們使用了vb
中不提倡使用的指標,雖然不提倡在vb
中使用指標,但合理地使用指標將對功能的實現具有很大的幫助。這裡只介紹了利用自定義訊息處理函式動態載入資料的一種方法,其實也可以將這種方法應用到其它方面,從而加強程式的功能,提高程式的效率。
VB中listview 的FindItem用法
finditem 方法 listview 控制項 查詢並返回 listview 控制項中 listitem 物件的引用。語法object.finditem string,value,index,match finditem 方法的語法包含下面部分 部分 描述 object 必需的。物件表示式,其值是...
在ListView中巢狀ListView的事件處理
前天在工作中遇到在listview中的item需要用listview來展現處理後的內容,然後就遇到了乙個很頭疼的問題,作為item的listview沒法進行滑動,而且顯示也不正常,只是顯示幾個子item。不能將子item全部顯示,原因是在控制項繪製出來之前要對listview的大小進行計算,要解決將...
在VB中實現窗體的動態效果
在vb 中實現窗體的動態效果 在vb程式設計中,應用程式窗體的出現和關閉一般都是靜態的,不過,我們利用下面的乙個api函式animatewindow就可以輕鬆實現窗體的動態效果。api函式animatewindow的宣告如下 private declare function animatewindo...