Office中国论坛/Access中国论坛

标题: 如何重用类似这样的代码?? [打印本页]

作者: lwwvb    时间: 2016-3-19 18:17
标题: 如何重用类似这样的代码??
Public Sub LoadMenuFormTable(Optional Tablename As String = "MainMenu")
  Dim r As Recordset

  Set r = SQLGetRst("SELECT DISTINCT MainMenu.pid FROM ?", Tablename)

  If r.RecordCount > 0 Then r.MoveFirst           '''Load Menu Level             ''''''''''''''''A
  Do While r.EOF = False
    AddMenuLevel r("pid"), "folder"
    r.MoveNext
  Loop                                                                                                       ''''''''''''''B

  '''''''Load all Menu
  Set r = SQLGetRst("select * from ?", Tablename)
  ''''这里又要遍历一次r了
.....
End Sub
这是我写的一个类中的过程,我发现了一个有趣的问题,数据集的遍历这几句(A到B处),经常要重写。感觉这几句应该可以写成一个模块。在c#中有署名过程能解决,但我希望能把上面能改为一句,类似
  GoRecordAndExecProc(r,"AddMenuLevel r(‘pid'),'folder')
的方法来执行,我觉得可以用callbyname,但问题又来了AddMenuLevel是本类中的过程,它如何知道callbyname中的所需的第一个参数 object ?



作者: tmtony    时间: 2016-3-19 18:20
是的,这个在VFP  或 C 指针 可能好实现
在Access可能要想其它办法
作者: lwwvb    时间: 2016-3-19 18:29
谢谢王站,我觉得唯一只能在callbyname+eval来动态执行,行不行还在测试中。。
作者: lwwvb    时间: 2016-3-19 19:15
经过片刻的研究,发现这种重用最好是把一头一尾写成过程,以简化它的代码,并不是一句来调用,否则都会简单变得复杂化:
Function RStart(r As Recordset) As Boolean
  RStart = r.RecordCount > 0
  If RStart Then r.MoveFirst
End Function
Function REnd(r As Recordset) As Boolean
  r.MoveNext
  REnd= r.EOF
End Function

以上两个是全局函数
然后使用时:
  If RStart(r) Then
    Do
      AddMenuLevel r("pid"), "folder"               '
    Loop Until REnd(r)
  End If



这应该是最合理最简的办法了。





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3