原創|其它|編輯:郝浩|2012-01-15 19:58:26.000|閱讀 527 次
概述:開發人員面臨的最常見的用戶場景之一是剪切板中的(support)支持/復制/剪切 功能。從 Excel 中粘貼數據到Spread for COM 中是很容易的。但是,一次性粘帖500行以上的數據是受到限制的。下面的代碼(Visual Basic 6)將展示如何利用剪切板 API 去實現期待的效果。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
開發人員面臨的最常見的用戶場景之一是剪切板中的(support)支持/復制/剪切 功能。從 Excel 中粘貼數據到Spread for COM 中是很容易的。但是,一次性粘帖500行以上的數據是受到限制的。
這是 Spread for COM 的一個限制,不允許用戶一次性粘帖500行(Spread for COM 的 MaxRows 屬性)以上的數據。如果默認設置允許500行以上的粘帖,一般會影響性能,因此建議不增加默認的粘帖最大值。即使在設計時 MaxRows 值被設定,也不意味著復制/粘帖行的數量就一定要在這個設定值以下。因此,要克服這個限制,需要操作這個屬性,同時需要設置在剪切板中的數據的數量...
解決這個問題的方法,取得剪切板中數據的長度(從 Excel 文件中復制的行數),在粘帖之前,設定 MaxRows 屬性的值,然后粘帖。一旦粘帖完成,重新把這個屬性設定成原始值。
下面的代碼(Visual Basic 6)將展示如何利用剪切板 API 去實現期待的效果。
首先,在代碼中聲明剪切板的 API,然后創建獲取剪切板中數據行/列數的函數。這個函數的返回值是數組,第一個元素為剪切板中數據的行數,第一個元素是剪切板中數據的列數。
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
同時,要在設計時或 Form_Load 事件中把 Spread 的 AutoClipBoard 屬性設置為 true,這樣 Spread 表單才能接受剪切板中的數據。
通過代碼設置:
Private Sub Form_Load()
fpSpread1.AutoClipboard = True
End Sub
Spread for COM 中捕獲 Ctrl+V(粘帖)最好的方法是 KeyPress 事件。在這個事件中,通過 ClipBoard_RangeSize() 方法取得剪切板中的行數,這個數值也是我們將要設置的 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 中復制任意數量的行在 Spread for COM 中粘帖的操作。 function forumhottag_callback(data){ tags = data; } parsetag();
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載