使用flexcell控件的两个技巧

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.flexcell grid如何实现撤销和恢复的功能
撤销和恢复确实不是你想像中那么容易做的,下面的程序可以把选中的区域的内容保存到数组,也可以通过这些数组恢复到指定的单元格,通过多个这样的数组可以完成简单的撤销和恢复。

我花了一些时间写了一段程序,用于把剪贴板中的数据保存到数组中,并可从数组中恢复数据。

Option Explicit
Private Declare Function GlobalAlloc Lib "KERNEL32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "KERNEL32" (ByVal hMem As Long) As Long Private Declare Function GlobalLock Lib "KERNEL32" (ByVal hMem As Long) As Lon g Private Declare Function GlobalUnlock Lib "KERNEL32" (ByVal hMem As Long) As Long Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Type ClipBoardData
Data1 As Long
Data2 As Long
Data3 As Long
Data4 As Long
Data5 As Long
Data6 As Long
Data7 As Long
Data8 As Long
Flag1 As Boolean
Flag2 As Boolean
End Type
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
Private mlngClipFormat As Long
Private mstrText As String
Private marrData() As Byte
Private mblnHasData As Boolean
'这段程序的作用是把Grid.Selection中的内容复制到ClipBoard,然后再把ClipBoard中的数据取出来,复制到marrData和mstrText中去
Private Sub Command1_Click()
Grid1.Selection.CopyData
mstrText = Clipboard.GetText
Dim lngAddress As Long
Dim lngLength As Long
Dim ClipData As ClipBoardData
If IsClipboardFormatAvailable(mlngClipFormat) Then
If OpenClipboard(0&) Then
lngAddress = GetClipboardData(mlngClipFormat)
Call CopyMemory(ClipData, ByVal lngAddress, LenB(ClipData))
lngLength = IIf(ClipData.Flag1, ClipData.Data1 * 4, 0) + _
IIf(ClipData.Flag2, ClipData.Data2 * 4, 0) + _
ClipData.Data2 * ClipData.Data1 * 24 + _
ClipData.Data3 * 16 + _
ClipData.Data4 * 76 + _
ClipData.Data6 * 8 + _
ClipData.Data7 * 4 + _
ClipData.Data8 + _
ClipData.Data5
ReDim marrData(LenB(ClipData) + lngLength - 1)
Call CopyMemory(ByVal VarPtr(marrData(0)), ClipData, LenB(ClipData)) Call CopyMemory(ByVal (VarPtr(marrData(0)) + LenB(ClipData)), ByVal (lngAddress + LenB(ClipData)), lngLength)
Call CloseClipboard
mblnHasData = True
MsgBox "复制完成"
End If
End If
'注意,这里我已经把剪贴板中的数据清除了,你按Ctrl+V将不能粘贴成功
Clipboard.Clear
End Sub
'这段程序的作用是把marrData和mstrText中的数据复制到ClipBoard,再粘贴到Grid中去Private Sub Command2_Click()
Dim hGlobal As Long
Dim lpGlobal As Long
If Not mblnHasData Then
Exit Sub
End If
If OpenClipboard(0&) Then
Call EmptyClipboard
hGlobal = GlobalAlloc(GHND, UBound(marrData) + 1)
If hGlobal Then
lpGlobal = GlobalLock(hGlobal)
Call CopyMemory(ByVal lpGlobal, ByVal VarPtr(marrData(0)),
UBound(marrData) + 1)
Call GlobalUnlock(hGlobal)
If SetClipboardData(mlngClipFormat, hGlobal) Then
'
Else
Call CloseClipboard
Exit Sub
End If
End If
Call CloseClipboard
End If
Clipboard.SetText mstrText
Grid1.Selection.PasteData
MsgBox "粘贴完成"
End Sub
Private Sub Form_Load()
Grid1.OpenFile "c:\sample.cel"
mlngClipFormat = RegisterClipboardFormat("FlexCell5.8.3") '这里要和控件的版本号保持一致
End Sub
2.如何判断flexcell grid是否处于编辑状态(编辑文本框激活中)
这个只能用GetFocus这个API来判断,看看获得焦点的窗口类型是不是TextBox。

Option Explicit
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetFocus Lib "user32" () As Long
Private Sub Grid1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim hWnd As Long
Dim strClassName As String
Dim intPos As Integer
If Button = 2 Then
strClassName = Space(256)
hWnd = GetFocus()
Call GetClassName(hWnd, strClassName, 256)
intPos = InStr(1, strClassName, Chr(0))
strClassName = Left(strClassName, intPos - 1)
If strClassName = "ThunderRT6TextBox" Then
MsgBox "单元格处于编辑状态。

"
End If
End If
End Sub
运行上面的程序,双击进入编辑状态,然后在单元格内点击鼠标右键进行测试。

相关文档
最新文档