关闭

pb调用.net组件的实践(二)

2536人阅读 评论(2) 收藏 举报

   前几天刚刚发了一篇 pb调用.net组件的实践 

  但是遇到了汉字乱吗的问题。经过测试,在pb9中调用不会出现乱码。但是由于原来的项目是用pb7写的。全部转移到pb9上的工作量是很大的。所以不能离开pb7的环境。最后采用了汉字转换成byte数据的方式解决了这个问题。

  类代码

Imports System.Math
<ComClass(CodeQuery.ClassId, CodeQuery.InterfaceId, CodeQuery.EventsId)> _
Public Class CodeQuery

COM GUID

    
' 可创建的 COM 类必须具有一个不带参数的 Public Sub New() 
    ' 否则, 将不会在 
    ' COM 注册表中注册此类,且无法通过
    ' CreateObject 创建此类。
    Public Sub New()
        
MyBase.New()
    
End Sub


    
Public Function getCodeList() As SortedList
        
Dim sl As SortedList
        
Dim crc As New CrcDbConnection.CrcDbConnection
        crc.ConnDatabase()
        sl 
= crc.GetCodeSortList
        
Return sl
    
End Function

    
''' <summary>
    ''' 返回字符串
    ''' </summary>
    ''' <returns>返回拼接成字符串的编码信息</returns>
    ''' <remarks>key;value|key;value|……</remarks>
    Public Function getCodeString() As String
        
Dim sl As SortedList
        sl 
= getCodeList()
        
Dim strCode As New System.Text.StringBuilder
        
If Not sl Is Nothing Then
            
Dim sItem As System.Collections.DictionaryEntry
            
For Each sItem In sl
                strCode.Append(sItem.Key)
                strCode.Append(
";")
                strCode.Append(sItem.Value)
                strCode.Append(
"|")
            
Next
        
End If
        
Return IIf(strCode.Length > 0, strCode.Remove(strCode.Length - 11).ToString, "")
    
End Function

    
''' <summary>
    '''返回数组
    ''' </summary>
    ''' <returns>返回生成的数组</returns>
    ''' <remarks>二维数组储存key/value对</remarks>
    Public Function getCodeArray() As String(,)
        
Dim arrCode(,) As String
        
Dim i As Long = 0
        
Dim sl As SortedList
        sl 
= getCodeList()
        
ReDim arrCode(sl.Count, 2)
        
If Not sl Is Nothing Then
            
Dim sItem As System.Collections.DictionaryEntry
            
For Each sItem In sl
                arrCode(i, 
0= sItem.Key
                arrCode(i, 
1= sItem.Value
                i 
+= 1
            
Next
        
End If
        
Return arrCode
    
End Function

    
''' <summary>
    ''' 返回编码
    ''' </summary>
    ''' <returns>返回选择编码</returns>
    ''' <remarks></remarks>
    Public Function getCode() As String
        
Dim arrCode As String = ""
        
Dim i As Long = 0
        
Dim sl As SortedList
        sl 
= getCodeList()
        
If Not sl Is Nothing Then
            arrCode 
= sl.GetByIndex(sl.IndexOfKey("代码"))
        
End If
        
Return arrCode
    
End Function

    
''' <summary>
    ''' 返回asc
    ''' </summary>
    ''' <returns>返回asc编码串</returns>
    ''' <remarks></remarks>
    Public Function getCodeStringASC() As String
        
Dim sl As SortedList
        sl 
= getCodeList()
        
Dim by As Byte()
        
Dim i As Long
        
Dim strCode As New System.Text.StringBuilder
        
If Not sl Is Nothing Then
            
Dim sItem As System.Collections.DictionaryEntry
            
For Each sItem In sl
                by 
= System.Text.Encoding.Default.GetBytes(sItem.Key)
                
For i = 0 To by.GetUpperBound(0)
                    strCode.Append(by(i).ToString())
                    strCode.Append(
":")
                
Next
                strCode.Remove(strCode.Length 
- 11)
                strCode.Append(
";")
                by 
= System.Text.Encoding.Default.GetBytes(sItem.Value)
                
For i = 0 To by.GetUpperBound(0)
                    strCode.Append(by(i).ToString())
                    strCode.Append(
":")
                
Next
                strCode.Remove(strCode.Length 
- 11)
                strCode.Append(
"|")
            
Next
            strCode.Remove(strCode.Length 
- 11)
        
End If
        
Return strCode.ToString
    
End Function

    
''' <summary>
    '''返回asc数组
    ''' </summary>
    ''' <returns>返回生成的asc数组</returns>
    ''' <remarks>二维数组储存key/value对</remarks>
    Public Function getCodeArrayAsc() As String(,)
        
Dim arrCode(,) As String
        
Dim i As Long = 0
        
Dim sl As SortedList
        sl 
= getCodeList()
        
Dim by As Byte()
        
Dim j As Long
        
Dim strCode As New System.Text.StringBuilder
        
ReDim arrCode(sl.Count, 2)
        
If Not sl Is Nothing Then
            
Dim sItem As System.Collections.DictionaryEntry
            
For Each sItem In sl
                by 
= System.Text.Encoding.Default.GetBytes(sItem.Key)
                
For j = 0 To by.GetUpperBound(0)
                    strCode.Append(by(j).ToString())
                    strCode.Append(
":")
                
Next
                
If strCode.Length > 0 Then strCode.Remove(strCode.Length - 11)
                arrCode(i, 
0= strCode.ToString
                strCode.Remove(
0, strCode.Length)

                by 
= System.Text.Encoding.Default.GetBytes(sItem.Value)
                
For j = 0 To by.GetUpperBound(0)
                    strCode.Append(by(j).ToString())
                    strCode.Append(
":")
                
Next
                
If strCode.Length > 0 Then strCode.Remove(strCode.Length - 11)
                arrCode(i, 
1= strCode.ToString
                strCode.Remove(
0, strCode.Length)
                i 
+= 1
            
Next
        
End If
        
Return arrCode
    
End Function

End Class



请注意其中的 

Public Function getCodeStringASC() As String  返回字符串

 和 

Public Function getCodeArrayAsc() As String(,)   返回数组

在 pb7 中的代码:

split 函数 public function long split (string str1, string sep, ref string arrR[])

long lPos = 1 
long lFind 
string arrNull[]
if isnull(str1) or isnull(sep) then
    setnull(lPos)
    return lPos
end if
arrR[] 
= arrNull[]
lPos 
= 1
lFind 
= pos(upper(str1), upper(sep))
do while lFind > 0
    arrR[lPos] 
= left(str1,lFind - 1)
    str1 
= right(str1,len(str1) - lFind - len(sep) + 1
    lFind 
= pos(upper(str1), upper(sep)) 
    lPos 
= lPos + 1 
loop
arrR[lPos] 
= str1 
return lPos 

getcode1 函数 public function getcode1(ref string arrKey[], ref string arrValue[]) returns (none)

字符串方式

int   intValue   
oleobject   objOle   
objOle
=create   OLEObject   
intValue
=objOle.connecttonewobject("codeforcom.CodeQuery")
if intValue=0 then
    
string v
    
int i,j,k
    v
=objOle.getcodestringAsc()
     
    
string oItem[]
    
string oKey[]
    
string oAsc[]
    
string key
    
split(v,"|",ref oItem)
    
for i=1 to upperbound(oItem)
        
split(oItem[i],";",ref oKey)
        
for j=1 to upperbound(oKey)
            
split(oKey[j],":",ref oAsc)
            key
=""
            
for k=1 to upperbound(oAsc)
                key
=key + char(long(oAsc[k]))            
            
next
            
if j=1 then
                arrKey[i]
=key
            
else
                arrValue[i]
=key
            
end if
        
next
    
next
end if

getcode2 函数 public function getcode2(ref string arrKey[], ref string arrValue[]) returns (none)

数组方式

int   intValue   
oleobject   objOle   
objOle
=create   OLEObject   
intValue
=objOle.connecttonewobject("codeforcom.CodeQuery")
if intValue=0 then
    
int i,j,k
    
string arrReturn[50,2]
    
string oAsc[]
    
string v,key
    arrReturn
=objOle.getCodeArrayAsc()
    
for i=1 to upperbound(arrReturn,1)
        
for j=1 to upperbound(arrReturn,2)                
            
split(arrReturn[i,j],":",ref oAsc)
            key
=""
            
for k=1 to upperbound(oAsc)
                key
=key + char(long(oAsc[k]))            
            
next        
            
if j=1 then
                arrKey[i]
= key
            
else
                arrValue[i]
=key
            
end if     
        
next
    
next
    mle_1.text
=v
end if

调用代码(字符串方式):

string oKey[]
string oValue[]
long i
string r
getcode1(ref oKey,ref oValue)
for i=1 to upperbound(oKey)    
        r
=+ "~r~n" + oKey[i] + "--" + oValue[i]
next
mle_1.text
=r

调用代码(数组方式):

string oKey[]
string oValue[]
long i
string r
getcode2(ref oKey,ref oValue)
for i=1 to upperbound(oKey)    
    r
=+ "~r~n" + oKey[i] + "===" + oValue[i]  
next
mle_2.text
=r

我们会发现数组方式比较特别,他会把数组中的数据,按顺序在写在返回的数组的第一行,第一行写满了,才在第二行写,一次类推,由于pb7不支持动态二维数据,所以返回的数据行列上并不对应。所以需要在基础类中添加标界符才行。有些麻烦。

另外,我也在vb.net中调用了这个封装类,测试的代码如下:

Public Class Form1

    
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
Dim u As New CodeForCom.CodeQuery
        
Dim t(,) As String
        t 
= u.getCodeArrayAsc
        
Dim i As Long
        
Dim j As Long
        
Dim w As String = ""
        
Dim ll() As Byte
        
Dim uu() As String
        
Dim q As String
        
Dim k As Long
        
For i = 0 To t.GetUpperBound(0)
            
For j = 0 To t.GetUpperBound(1)
                q 
= t(i, j)
                
If Not q Is Nothing Then
                    uu 
= q.Split(":")
                    
ReDim ll(uu.GetUpperBound(0))
                    
If uu.GetUpperBound(0> 0 Then
                        
For k = 0 To uu.GetUpperBound(0)
                            ll(k) 
= Convert.ToByte(uu(k))
                        
Next
                        t(i, j) 
= System.Text.Encoding.Default.GetString(ll)

                    
End If

                
End If

            
Next
        
Next
        w 
= ""
        
For i = 0 To t.GetUpperBound(0)
            
For j = 0 To t.GetUpperBound(1)
                w 
= w & t(i, j) & vbCrLf
            
Next
        
Next
        
MsgBox(w)
    
End Sub

End Class

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:875977次
    • 积分:12484
    • 等级:
    • 排名:第1121名
    • 原创:332篇
    • 转载:65篇
    • 译文:0篇
    • 评论:343条
    文章分类
    最新评论