⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.cls

📁 金算盘软件代码
💻 CLS
📖 第 1 页 / 共 3 页
字号:
    mclsListSet.SaveList
End Sub

'保存列宽
Public Sub SaveListColWidth()
    Dim intCoutnt As Integer
    
    With mFlex
        For intCoutnt = 2 To mclsListSet.Columns + 1
            If .ColWidth(intCoutnt) < 30 Then .ColWidth(intCoutnt) = 30
            mclsListSet.ColumnWidth(intCoutnt - 1) = .ColWidth(intCoutnt)
        Next
    End With
End Sub

'“全部显示”处理
Public Sub DoShowAll(ByVal blnShowall As Boolean)
    Dim intRow As Integer
    Dim intRowheight As Integer
    
    With mFlex
        If blnShowall <> mblnShowAll Then
            If blnShowall Then
                .ColWidth(1) = 450
                intRowheight = .RowHeight(0)
                intRow = 0
                Do While True
                    If .RowData(intRow) <> 1 And .RowHeight(intRow) = 0 Then
                        .RowHeight(intRow) = intRowheight
                    End If
                    intRow = intRow + 1
                    If intRow > .Rows - 1 Then Exit Do
                Loop
            Else
                .ColWidth(1) = 0
                intRow = 0
                Do While True
                    If .TextMatrix(intRow, 1) = "√" Then
                        .RowHeight(intRow) = 0
                    End If
                    intRow = intRow + 1
                    If intRow > .Rows - 1 Then Exit Do
                Loop
            End If
            mblnShowAll = blnShowall
            SetFlexRow
        End If
    End With
End Sub

'重新设置当前行
Public Sub SetFlexRow()
    Dim i As Integer
    
    With mFlex
        Do While .RowHeight(.Row + i) = 0
            i = i + 1
            If .Row + i = .Rows Then
                i = 0
                Do While .RowHeight(.Row + i) = 0
                    i = i - 1
                    If .Row + i = 0 Then
                        Exit Do
                    End If
                Loop
             Exit Do
             End If
        Loop
        If .Row + i > 0 Then
            If .Row = .Row + i Then
                mFlex_RowColChange
            Else
                .Row = .Row + i
            End If
            .ColSel = .Cols - 1
        Else
            If Not mctlFind Is Nothing Then mctlFind.Text = ""
        End If
    End With
End Sub

Public Sub ReGetColCaption()
    With mFlex
        If mintSortCol > .Cols - 1 Then Exit Sub
        If Right(.TextMatrix(0, mintSortCol), 1) = "↑" Or _
            Right(.TextMatrix(0, mintSortCol), 1) = "↓" Then
            .TextMatrix(0, mintSortCol) = Left(.TextMatrix(0, mintSortCol), Len(.TextMatrix(0, mintSortCol)) - 1)
        End If
    End With
End Sub
Public Sub AddReGetColCaption()
    With mFlex
        If mintSortCol > .Cols - 1 Then Exit Sub
        If Right(.TextMatrix(0, mintSortCol), 1) <> "↑" Or _
            Right(.TextMatrix(0, mintSortCol), 1) <> "↓" Then
            If mclsListSet.ColumnOrderType(mintSortCol - 1) = 1 Then
                .TextMatrix(0, mintSortCol) = .TextMatrix(0, mintSortCol) + "↑"
            ElseIf mclsListSet.ColumnOrderType(mintSortCol - 1) = 2 Then
                .TextMatrix(0, mintSortCol) = .TextMatrix(0, mintSortCol) + "↓"
            End If
        End If
    End With
End Sub
'
'查找下一满足条件行按钮控件
'
Private Sub mcmdAgain_Click()
    Dim strTextFind As String
    Dim intResult As Integer
    Dim intRow As Integer
    Dim IsFind As Boolean
    Dim blnFindNoChange As Boolean
    
    With mFlex
        '判断下一行是否满足查找条件
        intRow = .Row + 1
        Do While intRow <= .Rows - 1
            If .RowHeight(intRow) = 0 Then
                intRow = intRow + 1
            Else
                Select Case mcboFindKind.ItemData(mcboFindKind.ListIndex)
                    Case 1
                        IsFind = (CLng(mctlFind.Text) = CLng(.TextMatrix(intRow, mintSortCol)))
                    Case 2
                        
                    Case Else
                        strTextFind = Left$(mctlFind.Text, Len(mctlFind.Text) - mctlFind.SelLength)
                        intResult = StrComp(Left$(.TextMatrix(intRow, mintSortCol), Len(strTextFind)), strTextFind, vbTextCompare)
                        If intResult = 0 Then
                            IsFind = True
                        End If
                End Select
                Exit Do
            End If
        Loop
        '根据查找结果改变当前行
        If IsFind Then
            Select Case mcboFindKind.ItemData(mcboFindKind.ListIndex)
                Case 1
                    .Row = intRow
                    .ColSel = .Cols - 1
                Case 2
                    
                Case Else
                    blnFindNoChange = mblnFindNoChange
                    mblnFindNoChange = True
                    mctlFind.Text = strTextFind
                    mblnFindNoChange = blnFindNoChange
                    mIsSelChange = True
                    .Row = intRow
                    mIsSelChange = False
                    .ColSel = .Cols - 1
                    mctlFind.SetFocus
            End Select
        Else
            mcmdAgain.Enabled = False
        End If
    End With
End Sub

Private Sub mFlex_Click()
    If mFlex.Rows > 1 And mFlex.RowHeight(mFlex.Row) > 0 Then
        mFlex.SetFocus
    End If
End Sub

Private Sub mFlex_DragOver(Source As Control, x As Single, y As Single, State As Integer)
    Dim blnIsHScroll As Boolean, blnIsVScroll As Boolean
    Dim lngX As Long, lngY As Long
    Dim intDX As Integer, intDY As Integer
    Dim intOffset As Integer
    Dim hdc As Long
    Dim hPen As Long, hSavePen As Long
    Dim Point As POINTAPI
    Dim intMode As Integer
    Dim lngCol As Long, lngCnt As Long
    Dim lngStartCol As Long, lngEndCol As Long
    
    intDX = Screen.TwipsPerPixelX
    intDY = Screen.TwipsPerPixelY
    With mFlex
        If mOldCol < .FixedCols Then
            lngStartCol = 1
            lngEndCol = .FixedCols - 1
        Else
            For lngCnt = .FixedCols To .Cols - 1
                If .ColIsVisible(lngCnt) Then Exit For
            Next
            lngStartCol = lngCnt
            If lngStartCol < 1 Then lngStartCol = 1
            lngEndCol = .Cols - 1
        End If
        
        For lngCnt = 1 To .Cols - 1
            If x >= .ColPos(lngCnt) And x < .ColPos(lngCnt) + .ColWidth(lngCnt) Then
                lngCol = lngCnt
                Exit For
            End If
        Next
        
        If mlngDragOverCol = lngCol Then
            Exit Sub
        End If
        
        '判断水平滚动条和垂直滚动条
        ISScroll blnIsHScroll, blnIsVScroll
        
        intOffset = IIf(.Appearance = flex3D, 4, 0)
        If blnIsHScroll Then
            lngY = (.Height - gclsEniv.HScrollHeight) / intDY - intOffset
        Else
            lngY = .Height / intDY - intOffset
        End If
        
        hdc = GetDC(.hwnd)
        hPen = CreatePen(PS_SOLID, 3, RGB(255, 255, 255))
        hSavePen = SelectObject(hdc, hPen)
        intMode = SetROP2(hdc, R2_XORPEN)
        
        If mlngDragOverCol >= lngStartCol And mlngDragOverCol <= lngEndCol + 1 Then
            If mlngDragOverCol >= .Cols Then
                lngX = (.ColPos(mlngDragOverCol - 1) + .ColWidth(mlngDragOverCol - 1)) / intDX - 1
            Else
                lngX = .ColPos(mlngDragOverCol) / intDX - 1
            End If
            MoveToEx hdc, lngX, 0, Point
            LineTo hdc, lngX, lngY
        End If
            
        mlngDragOverCol = lngCol
        
        If mlngDragOverCol >= lngStartCol And mlngDragOverCol <= lngEndCol + 1 Then
            If mlngDragOverCol >= .Cols Then
                lngX = (.ColPos(mlngDragOverCol - 1) + .ColWidth(mlngDragOverCol - 1)) / intDX - 1
            Else
                lngX = .ColPos(mlngDragOverCol) / intDX - 1
            End If
            MoveToEx hdc, lngX, 0, Point
            LineTo hdc, lngX, lngY
        End If
        
        SetROP2 hdc, intMode
        SelectObject hdc, hSavePen
        DeleteObject hPen
        ReleaseDC .hwnd, hdc
    End With

End Sub

'
'FLEXGRID控件
'
'快速定位
Private Sub mFlex_KeyPress(KeyAscii As Integer)
    Static sngStartTime As Single
    Dim sngEndTime As Single
    Static strFindText As String
    
    sngEndTime = Timer
    If sngEndTime - sngStartTime >= 0.5 Then
        strFindText = Chr(KeyAscii)
    Else
        strFindText = strFindText + Chr(KeyAscii)
    End If
    sngStartTime = sngEndTime
    mIsKeyFind = True
    If Not (mctlFind Is Nothing) Then mctlFind.Text = strFindText    '引发txtFind_Change事件进行查找
    mIsKeyFind = False
End Sub

'交换列
Private Sub mFlex_DragDrop(Source As Control, x As Single, y As Single)
    Dim intCol As Integer
    Dim intCount As Integer
    
    mblnColDrag = False
    mblnDownFixedRow = False
    With mFlex
        If x > .ColPos(.Cols - 1) + .ColWidth(.Cols - 1) Then
            For intCount = .Cols - 1 To 2 Step -1
                If .ColWidth(intCount) > 0 Then Exit For
            Next
            intCol = intCount
        Else
            If x < .ColPos(2) Then
                intCol = 1
            Else
                For intCount = 2 To .Cols - 1
                    If x <= .ColPos(intCount) + .ColWidth(intCount) And x >= .ColPos(intCount) Then
                        intCol = intCount
                        Exit For
                    End If
                Next
            End If
        End If
        If mOldCol = 1 Or intCol = 1 Then Exit Sub  '“停用”列不能移动
        If mOldCol < mclsListSet.FixColumns + 2 And intCol < mclsListSet.FixColumns + 2 _
            Or mOldCol >= mclsListSet.FixColumns + 2 And intCol >= mclsListSet.FixColumns + 2 Then
            .ColPosition(mOldCol) = intCol
            Debug.Print mOldCol, intCol
            intCount = 0
            If mOldCol > intCol + 1 Then
                Do While mOldCol > intCol + intCount
                    mclsListSet.ExChangeColumn mOldCol - 1, intCol + intCount - 1
                    intCount = intCount + 1
                Loop
            Else
                If mOldCol + 1 < intCol Then
                    Do While mOldCol < intCol - intCount
                        mclsListSet.ExChangeColumn mOldCol - 1, intCol - intCount - 1
                        intCount = intCount + 1
                    Loop
                Else
                    mclsListSet.ExChangeColumn mOldCol - 1, intCol - 1
                End If
            End If
        End If
    End With
    For intCount = 1 To mclsListSet.Columns
        If mclsListSet.ColumnOrderType(intCount) <> 0 Then
            mintSortCol = intCount + 1
        End If
    Next
End Sub

Private Sub mFlex_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    If gclsBase Is Nothing Then Exit Sub
    With mFlex
        mOldCol = .MouseCol
    End With
    mblnColDrag = False
End Sub

Private Sub mFlex_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    With mFlex
        If mblnShowAll And .Rows > 1 Then
            If .MouseCol = 1 And .MouseRow <> 0 Then
                .MousePointer = vbCustom
            Else
                If Not mblnColDrag Then .MousePointer = vbDefault
            End If
        Else
            .MousePointer = vbDefault
        End If
    End With
End Sub

Private Sub mFlex_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
    If mblnReSort And Not mblnNoSort Then      '是否重新排序
        If ISSortCol Then
            With mFlex
                If Right(.TextMatrix(0, mintSortCol), 1) = "↑" Or _
                    Right(.TextMatrix(0, mintSortCol), 1) = "↓" Then
                    .TextMatrix(0, mintSortCol) = Left(.TextMatrix(0, mintSortCol), Len(.TextMatrix(0, mintSortCol)) - 1)
                End If
            End With
            mcboFindKind.Text = mclsListSet.ColumnDesc(mOldCol - 1)
        End If
        mblnReSort = False
    End If
End Sub

'当前行发生改变,相应改变txtFind的内容
Private Sub mFlex_RowColChange()
    Dim intSelStart As Integer
    Dim blnFindNoChange As Boolean
    
    With mFlex
        If mblnFlexNoChange Or .Rows < 2 Or .RowHeight(.Row) = 0 Then Exit Sub
        blnFindNoChange = mblnFindNoChange
        mblnFindNoChange = True
        If Not (mctlFind Is Nothing) Then
            If mIsSelChange Then    '当该事件由查找引发
                intSelStart = Len(mctlFind.Text)
                mctlFind.Text = .TextMatrix(.Row, mintSortCol)
                If TypeOf mctlFind Is TextBox Then
                    mctlFind.SelStart = intSelStart
                    mctlFind.SelLength = IIf(Len(mctlFind.Text) - intSelStart < 0, 0, Len(mctlFind.Text) - intSelStart)
                End If
            Else    '当该事件由鼠标点击引发
                mctlFind.Text = .TextMatrix(.Row, mintSortCol)
                If Not (mcmdAgain Is Nothing) Then mcmdAgain.Enabled = True
            End If
        End If
        If Not .RowIsVisible(.Row) Then     '当前行为不可见则让其可见
            If .Row < .TopRow Then
                .TopRow = IIf(.Row - 3 < 1, 1, .Row - 3)
            Else
                .TopRow = .Row
            End If
        End If
        mblnFindNoChange = blnFindNoChange
    End With
End Sub

Private Sub Class_Initialize()
    Set mclsListSet = New ListSet
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -