Public Function gridloop(MSFG1 As Object) As Long
For i= 0 To MSFG1.rows - 1
A = MSFG1.TextMatrix(i,1)
Next
End Function
上面的代码比下面的代码慢2倍
Public Function gridloop(MSFG1 As MSHFlexGrid) As Long
Public Function gridloop(MSFG1 As MSFlexGrid) As Long
有加速解决方案吗?
答案 0 :(得分:3)
问题中没有很多细节,我想您有两个(或更多?)不同的控件,您实际上要在其中重载gridloop
函数,以便可以与多种控件一起使用?
以下内容可能会改善性能。我没有测试过它,甚至没有确认它没有编译错误。想法是确定控件类型,然后将其分配给匹配类型的变量,然后对方法和属性的引用可能会被早期绑定(因此速度更快)。
Public Function gridloop(MSFG1 as Object) as Long
Dim myMSHFlexGrid As MSHFlexGrid
Dim myMSFlexGrid As MSFlexGrid
Dim i As Integer
Dim A As Long
If TypeOf MSFG1 Is MSHFlexGrid Then
Set myMSHFlexGrid = MSFG1
For i = 0 To myMSHFlexGrid.rows - 1
A = myMSHFlexGrid.TextMatrix(i,1)
Next
ElseIf TypeOf MSFG1 Is MSFlexGrid Then
Set myMSFlexGrid = MSFG1
For i = 0 To myMSFlexGrid.rows - 1
A = myMSFlexGrid.TextMatrix(i,1)
Next
End If
End Function
替代方法是定义两个gridloop
函数,每种类型一个。手动重载的一种形式。
Public Function gridloop_MSHFlexGrid(MSFG1 As MSHFlexGrid) As Long
Public Function gridloop_MSFlexGrid(MSFG1 As MSFlexGrid) As Long
此方法的优点在于,尝试使用“错误”控件调用gridloop
函数之一将导致编译错误-尽早发现问题,否则可能需要花费大量时间进行运行时调试。 / p>
答案 1 :(得分:1)
基于MarkL's answer,您可以使用实际的VB接口重载来获取所需的内容。
这个想法是创建一个接口,在网格上公开您需要的任何属性或功能,然后创建两个类,每个类实现该接口并在内部操作实际的网格。
此包装替代了以下事实:两个网格类型本质上不共享公共接口。 (我使用OLEView查看了IDL)。
然后,您可以在当前使用Object
代表实际网格类的每个位置中,将界面用作类型。如果该接口是全面的,并且其方法/属性已适当命名,则您无需进行任何其他代码更改。
样本(伪)代码...
接口:
'In file for interface IGridWrapper
Function Rows
End Function
Function TextMatrix(i as Integer, j as Integer)
End Function
'Any others...
包装类1:
' In file for class "MSFlexGridWrapper"
Implements IGridWrapper
Private m_grid as MSFlexGrid
Sub Init(MSFlexGrid grid)
Set m_grid = grid
End Sub
Function IGridWrapper_Rows
IGridWrapper_RowCount = m_grid.Count
End Function
Function IGridWrapper_Textmatrix(i as Integer, j as Integer)
'etc.
End Function
'Any others...
包装类2:
' In file for class "MSHFlexGridWrapper"
Implements IGridWrapper
Private m_grid as MSHFlexGrid
Sub Init(MSHFlexGrid grid)
Set m_grid = grid
End Sub
Function IGridWrapper_Rows
IGridWrapper_RowCount = m_grid.Count
End Function
Function IGridWrapper_Textmatrix(i as Integer, j as Integer)
'etc.
End Function
'Any others...
使用包装程序的代码:
Public Function gridloop(MSFG1 As IGridWrapper) As Long
(注意-这些都没有通过编译器进行精确的语法检查)
答案 2 :(得分:1)
后期绑定(在运行时绑定)比早期绑定(在编译时绑定)慢的根本原因是,您必须使用iDispatch
接口的GetIDsOfNames
和Invoke
方法访问对象界面中的属性,而不是直接从vtable访问属性。有关更多信息,请查看this。
DaveInCaz和MarkL的建议可能会加快速度的原因是,它们是允许gridloop
函数接受可以早期绑定的类型而不是Object
类型的方法。 DaveInCaz的解决方案也是多态性实际应用的一个很好的例子。