原創(chuàng)|其它|編輯:郝浩|2012-01-15 19:58:26.000|閱讀 527 次
概述:開發(fā)人員面臨的最常見的用戶場景之一是剪切板中的(support)支持/復(fù)制/剪切 功能。從 Excel 中粘貼數(shù)據(jù)到Spread for COM 中是很容易的。但是,一次性粘帖500行以上的數(shù)據(jù)是受到限制的。下面的代碼(Visual Basic 6)將展示如何利用剪切板 API 去實(shí)現(xiàn)期待的效果。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
開發(fā)人員面臨的最常見的用戶場景之一是剪切板中的(support)支持/復(fù)制/剪切 功能。從 Excel 中粘貼數(shù)據(jù)到Spread for COM 中是很容易的。但是,一次性粘帖500行以上的數(shù)據(jù)是受到限制的。
這是 Spread for COM 的一個(gè)限制,不允許用戶一次性粘帖500行(Spread for COM 的 MaxRows 屬性)以上的數(shù)據(jù)。如果默認(rèn)設(shè)置允許500行以上的粘帖,一般會影響性能,因此建議不增加默認(rèn)的粘帖最大值。即使在設(shè)計(jì)時(shí) MaxRows 值被設(shè)定,也不意味著復(fù)制/粘帖行的數(shù)量就一定要在這個(gè)設(shè)定值以下。因此,要克服這個(gè)限制,需要操作這個(gè)屬性,同時(shí)需要設(shè)置在剪切板中的數(shù)據(jù)的數(shù)量...
解決這個(gè)問題的方法,取得剪切板中數(shù)據(jù)的長度(從 Excel 文件中復(fù)制的行數(shù)),在粘帖之前,設(shè)定 MaxRows 屬性的值,然后粘帖。一旦粘帖完成,重新把這個(gè)屬性設(shè)定成原始值。
下面的代碼(Visual Basic 6)將展示如何利用剪切板 API 去實(shí)現(xiàn)期待的效果。
首先,在代碼中聲明剪切板的 API,然后創(chuàng)建獲取剪切板中數(shù)據(jù)行/列數(shù)的函數(shù)。這個(gè)函數(shù)的返回值是數(shù)組,第一個(gè)元素為剪切板中數(shù)據(jù)的行數(shù),第一個(gè)元素是剪切板中數(shù)據(jù)的列數(shù)。
Option Explicit
Const CF_SYLK = 4
Const CF_DSPTEXT = &H81
Declare Function OpenClipboard Lib "user32" (ByVal Hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
Function ClipBoard_RangeSize()
Dim lhCB&, lpCB&, lRet&, lSize&, sText$
Dim aTmp, sTmp$, nRow&, nCol&
If IsClipboardFormatAvailable(CF_SYLK) Then
If OpenClipboard(0&) <> 0 Then
lhCB = GetClipboardData(CF_DSPTEXT)
If lhCB <> 0 Then
lpCB = GlobalLock(lhCB)
If lpCB <> 0 Then
lSize = GlobalSize(lpCB)
sText = Space$(lSize)
lRet = lstrcpy(sText, lpCB)
lRet = GlobalUnlock(lhCB)
sText = Left(sText, InStr(1, sText, Chr$(0), 0) - 1)
End If
End If
CloseClipboard
End If
aTmp = Split(sText, " ")
If UBound(aTmp) > 2 Then
sTmp = aTmp(UBound(aTmp) - 2)
nRow = Left(sTmp, Len(sTmp) - 1)
sTmp = aTmp(UBound(aTmp))
nCol = Left(sTmp, Len(sTmp) - 1)
End If
End If
ClipBoard_RangeSize = Array(nRow, nCol)
End Function
同時(shí),要在設(shè)計(jì)時(shí)或 Form_Load 事件中把 Spread 的 AutoClipBoard 屬性設(shè)置為 true,這樣 Spread 表單才能接受剪切板中的數(shù)據(jù)。
通過代碼設(shè)置:
Private Sub Form_Load()
fpSpread1.AutoClipboard = True
End Sub
Spread for COM 中捕獲 Ctrl+V(粘帖)最好的方法是 KeyPress 事件。在這個(gè)事件中,通過 ClipBoard_RangeSize() 方法取得剪切板中的行數(shù),這個(gè)數(shù)值也是我們將要設(shè)置的 MaxRows 屬性的值。
Private Sub fpSpread1_KeyPress(KeyAscii As Integer)
If KeyAscii = 22 Then 'paste(ctrl+ v)
numRows = ClipBoard_RangeSize(0)
fpSpread1.MaxRows = numRows
fpSpread1.ClipboardPaste
End If
End Sub
通過上述做法,可以完成從 Excel 中復(fù)制任意數(shù)量的行在 Spread for COM 中粘帖的操作。 function forumhottag_callback(data){ tags = data; } parsetag();
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載