注册 登录
编程论坛 VB6论坛

想同时封装成以下2代码成DLL文件,但编译时就出错,生成不了DLL文件,想让高手帮忙我错在哪里

yiyaozjk 发布于 2012-01-06 21:08, 1288 次点击
我在ActiveX DLL中想将下列代码封装成以下DLL: 但不成功,请高手帮忙解决一下:谢谢!!
新建一个类模块,bhsq1.cls

bhsq是类名,类的工程名  bhsq1:   
Public Function sl(ByVal sql As String) As ADODB.Recordset
Dim mycon As ADODB.Connection
Dim rst As ADODB.Recordset
Set mycon = New ADODB.Connection
mycon.ConnectionString = "rovider=sqloledb;server=.;Database=sxcpmc;Uid=sawd=;"
mycon.Open
Dim stokens() As String
  Set rst = New ADODB.Recordset
  rst.Open Trim(sql), mycon, adOpenKeyset, adLockOptimistic
Set sl = rst
End Function

单独封装上面的代码,能在程序使用
   Dim bhs As New bhsq '用里面的类名,而不是用类的工程名
        Set mrc1 = bhs.sl(Trim(txtsql))
        Set bhs = Nothing                                      '能正常编译和使用'

-----------------------------
但是,再在以上的代码基础上再想封装以下代码就报错了(我把两代码放在同一个类模块中,也再无其他模块了..).
编译时就有错误提示:提示private 对象模块不能作为参数/公共过程的返回类型,公共数据成员或公共用户定义类型字段在公共的对象中使用 ,生成不了DLL

Public Sub gongdandata(ByVal MSF1 As MSFlexGrid)   '预览生产单gongdan窗体时用到
Dim i As Integer
Dim mrc1 As ADODB.Recordset

  Set mrc1 = sl(Trim(txtsql))
  If mrc1.EOF = False Then
   mrc1.MoveFirst
   MSF1.RowHeightMin = 410
    MSF1.CellAlignment = 0
   With MSF1
    .Rows = 1
    Do While Not mrc1.EOF
     .Rows = .Rows + 1
     For i = 1 To mrc1.Fields.Count
         .TextMatrix(.Rows - 1, i - 1) = FormatNumber(mrc1.Fields(i - 1), 3, -1)
     Next i
     mrc1.MoveNext
    Loop
    mrc1.Close
  End With
End If
End Sub
请高手帮忙解答一下,我错在哪里了????
10 回复
#2
yiyaozjk2012-01-08 18:27
为什么没有人来回答我这个问题呢?

是不是理解为以对象作为参数的???

#3
yiyaozjk2012-01-12 14:41
为什么没有人来回答我这个问题呢?

期待......
#4
yiyaozjk2012-02-07 15:00
为什么没有人来回答我这个问题呢?
  这个问题都有一年未解决了.....???

期待......
#5
风吹过b2012-02-07 15:35
Public Sub gongdandata(ByVal MSF1 As MSFlexGrid)   '预览生产单gongdan窗体时用到

msf1 是一个对象,
对象作为一个参数时,只能用传地址的方式进行。

我这里没办法测试,你试着用以下二种方法。
1、把定义,从传值(ByVal)改为 传地址(ByRef)。
2、在类里定义一个 对象 MSF1为 公用对象,调用这个过程前,把这个 MSF1 对象先赋值进去,然后再去调用这个过程。
  过程中,直接使用这个对象,而不再传参数进去。
#6
yiyaozjk2012-02-08 10:27
   试了:
1、把定义,从传值(ByVal)改为 传地址(ByRef)。  
    错误提示一样, 提示private 对象模块不能作为参数/公共过程的返回类型,公共数据成员或公共用户定义类型字段在公共的对象中使用.

2、在类里定义一个 对象 MSF1为 公用对象,调用这个过程前,把这个 MSF1 对象先赋值进去,然后再去调用这个过程。
  过程中,直接使用这个对象,而不再传参数进去。
如何赋值.能否再指点一下.我不明白?我的代码在上面,帮忙修改 如何赋值??

  还有我试了一下:将
    Public Sub gongdandata(ByVal MSF1 As MSFlexGrid)   '预览生产单gongdan窗体时用到
  改为:
   private Sub gongdandata(ByVal MSF1 As MSFlexGrid)   '预览生产单gongdan窗体时用到

    能编译,编译后只能访问到Public 的过程或函数, 不能访问到这里面的私有过程或函数
    如何去访问到这里面的私有过程(就不是知道怎么去传递这个对象的地址)???


#7
bczgvip2012-02-08 10:37
那就定义个公用属性吧!

[ 本帖最后由 bczgvip 于 2012-2-8 10:40 编辑 ]
#8
yiyaozjk2012-02-08 20:20
如何定义公用属性???
以下是引用bczgvip在2012-2-8 10:37:51的发言:

那就定义个公用属性吧!
如何定义公用属性??? 请指点,用了public 的话会提示我第1个帖的那个错误 ....
#9
lowxiong2012-02-08 22:35
你应该在工程-属性里引用msflxgrd.ocx,而不应该在部件里添加控件,似乎控件只能应用于窗体,而引用相当于全局声明
#10
yiyaozjk2012-02-14 20:24
回复 9楼 lowxiong
没有完全看懂....如何那个.OCX 文件,我找不到去引用/.....
#11
lowxiong2012-02-14 22:17
MSFlexGrid控件是在文件msflxgrd.ocx中,该文件应该是在windows/system32目录下,你在菜单中选择“工程-引用”,然后点击“浏览”,“文件类型”选择“activex控件 ocx”,应该可以找到msflxgrd.ocx文件,打开即可看到勾选了“microsoft flexgrid control 6.0(sp3),选择确定后即可编译成功。我是这样将你的代码编成dll的,是否有用就不知道了。
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


[ 本帖最后由 lowxiong 于 2012-2-14 22:20 编辑 ]
1