精华内容
下载资源
问答
  • vb中Variant类型调用mid函数返回的字符串还是在原来字符串里面么?怎么区分Variant类型和字符串类型?vb怎么调用不定长的mid?
  • VB中 variant与object区别?

    千次阅读 2016-11-13 16:11:35
    Object是对象,是VB中各种控件、组件等的泛称,是类的实例。依上所述,当你给一个Variant变量赋值为对象时,这个变量也自动变为Object。所以从表面上看两者似乎差不多,但事实上是有本质区别的。
    Variant是不定类型,或者说可变类型,是一种“万金油”变量,你给它赋值哪种类型的数据,它就会自动变为哪种类型,比如说赋值1234,它就是Integer型,赋值12.34,它就是Double型。
    Object是对象,是VB中各种控件、组件等的泛称,是类的实例。依上所述,当你给一个Variant变量赋值为对象时,这个变量也自动变为Object。所以从表面上看两者似乎差不多,但事实上是有本质区别的。
    不提倡用Variant来声明变量,因为它要用额外的内存字节来记录变量的实际类型,不但会造成资源的浪费,也会降低程序的运行效率。应该声明为具体的变量类型,比如Integer、Long、Single、Double、Date等等。
    

    同样,也不提倡用Object来声明对象变量,而应该是具体的对象类型,如TextBox、CommandButton、ComboBox等

    Variant 数据类型是所有没被显式声明(用如 Dim、Private、Public 或 Static等语句)为其他类型变量的数据类型。Variant 数据类型并没有类型声明字符。
    Variant 是一种特殊的数据类型,除了定长 String 数据及用户定义类型外,可以包含任何种类的数据。Variant 也可以包含 Empty、Error、Nothing 及 Null等特殊值。可以用 VarType 函数或 TypeName 函数来决定如何处理 Variant 中的数。

    object 可以代表VB中的任何一个对象。 在某些情况下你在代码中要对一些并不是事先就能够确定类型的对象进行操作就可以用object对象。例如,要遍历一个窗体上的所有控件,并显示出这些控件的名称就要用到object对象了。

    展开全文
  • dim tmpA (tmpA是一个控件的.Left,类型为Variant/single)实际数据为1234.05dim tmpB as Long当tmpB=tmpA后,tmpB的数据变成1234了,这就是数据类型不匹配造成的。

    dim tmpA (tmpA是一个控件的.Left,类型为Variant/single)实际数据为1234.05

    dim tmpB as Long

    tmpB=tmpA

    后,tmpB的数据变成1234了,这就是数据类型不匹配造成的。

    展开全文
  • dim tmpA (tmpA是一个控件的.Left,类型为Variant/single)实际数据为1234.05 dim tmpB as Long 当 tmpB=tmpA 后,tmpB的数据变成1234了,这就是数据类型不匹配造成的。...
    dim tmpA (tmpA是一个控件的.Left,类型为Variant/single)实际数据为1234.05

    dim tmpB as Long



    tmpB=tmpA

    后,tmpB的数据变成1234了,这就是数据类型不匹配造成的。
    展开全文
  • VB 怎么判断Variant是否被定义为bool类型?
  •  前段时间由于该控件基于微软的MSCOMM控件,这个控件如果系统没有安装VB,单独注册好像很难成功,这害的一些没有装VB的用户,为了这个小控件必须安装一次VB,这实在是划算不来,所以直接用API串口函数进行了封装...

      几年前我用VB开发了一个西门子PPI通信控件,由于VB开发的控件是标准的COM组件,所以想当然的认为VC、C#、Delphi等开发语言可以非常容易的使用。

      前段时间由于该控件基于微软的MSCOMM控件,这个控件如果系统没有安装VB,单独注册好像很难成功,这害的一些没有装VB的用户,为了这个小控件必须安装一次VB,这实在是划算不来,所以直接用API串口函数进行了封装改进,这样不仅效率提高了,并且再也不需要MSCOMM控件了。

      这一次,我不仅使该控件支持了浮点运算,并且在VC、C#(VB当然就不用多试了,以前就很好的支持)进行了兼容测试。

      一试问题就来了,没有改进之前的控件,由于C#封装性能甚好,还能使用,唯一不足的是,控件方法中如果不要求返回的参数前面没有添加ByVal参数,在C#中就转换为 ref ***,害的你还得专门定义临时变量进行传参。

      在VC中直接就不行,ReadData和WriteData等几个主要方法根本在VC中无法转换成对应函数,具体错误信息如下:

    // method 'ReadData' not emitted because of invalid return type or parameter type

    // method 'WriteData' not emitted because of invalid return type or parameter type

    // method 'PlcLogin' not emitted because of invalid return type or parameter type

    // method 'PlcRun' not emitted because of invalid return type or parameter type

    // method 'PlcStop' not emitted because of invalid return type or parameter type

      经过测试,最后发现VB函数中的byte和数组在VC中根本找不到合适的对应。

      由于控件中又新添加了浮点数的支持,所以对参数接口又增加了一层复杂性。突然想到微软的MSCOMM控件各语言肯定都能很好的支持,它的接口参数是怎样的定义的。我在VB、VC、C#分别试了一下,VB中和input和Output属性的类型就是Variant类型,在VC中是VARIANT,在C#中是Object。用Variant还有个好处,就是各种类型的数据都可以传输,没有必要在另外添加接口函数了。

      最后我定义的接口如下(主要接口):

    Public Function ReadData(ByVal lngAddr As Long, vData As Variant, Optional ByVal lngNum As Long = 1, Optional ByVal bytLen As PPILEN = PPI_B, Optional ByVal bytType As PPITYPE = PPI_V, Optional ByVal Addr As Long = 0) As Long
    
    Public Function WriteData(ByVal lngAddr As Long, ByVal vData As Variant, Optional ByVal lngNum As Long = 1, Optional ByVal bytLen As PPILEN = PPI_B, Optional ByVal bytType As PPITYPE = PPI_V, Optional ByVal Addr As Long = 0) As Long
    

      在VC中对应的接口如下:

    long ReadData(long lngAddr, VARIANT* vData, long lngNum, long bytLen, long bytType, long Addr);
    
    long WriteData(long lngAddr, const VARIANT& vData, long lngNum, long bytLen, long bytType, long Addr);
    

      在C#中的接口如下:

         public virtual int ReadData(int lngAddr, ref object vData);
    
         public virtual int ReadData(int lngAddr, ref object vData, int lngNum, PPILEN bytLen, PPITYPE bytType, int addr);
    
           public virtual int WriteData(int lngAddr, object vData);
    
       public virtual int WriteData(int lngAddr, object vData, int lngNum, PPILEN bytLen, PPITYPE bytType, int addr);
    

      以为这样定义就万事大吉了,事后一试我又错了,在C#中没有任何问题(看了微软还是在C#上下了很大的功夫),在VC简单的定义一个VARIANT变量直接传递给控件,VB控件老是报错,根本无法使用。后来想为什么MSCOMM控件可以,我的控件不可以。天杀的MSCOMM肯定是VC开发的,而我的控件是VB开发的,VB和C#的包容性都很强,而VC却高高在上不肯屈就。

      正一筹莫展准备放弃的时候,突然想到了以前用VC开发的OPC程序,上面有很多关于VARIANT的应用,一看就明白了,原来在VC中VARIANT的用法是有讲究的。

      下面我就详细说一下控件同样的接口在不同语言中如何使用。

    在VB中:

    Private Sub cmdReadData_Click()
    
        On Error GoTo ToExit '打开错误陷阱
    
        '------------------------------------------------
    
        Dim i As Long
    
        Dim bytType As Byte
    
        Dim lngRet As Long
    
        Dim lngData() As Long
    
        Dim fData() As Single
    
        Dim vData As Variant
    
        Select Case cmbType.ListIndex
    
        Case 0: bytType = PPI_I
    
        Case 1: bytType = PPI_Q
    
        Case 2: bytType = PPI_M
    
        Case 3: bytType = PPI_V
    
        Case 4: bytType = PPI_S
    
        Case 5: bytType = PPI_SM
    
        End Select
    
        S7_PPI1.FixAddr = cmbNo.ListIndex + 1
    
        lngRet = S7_PPI1.ReadData(Val(txtAddr), vData, Val(cmbNum.Text), Val(cmbLen.ListIndex), Val(bytType))
    
        If lngRet = 0 Then
    
            txtData = ""
    
            If cmbLen.ListIndex = 3 Then
    
                fData = vData
    
                For i = 1 To Val(cmbNum.Text)
    
                    txtData = txtData & Format(fData(i - 1), "0.00") & " "
    
                Next
    
            Else
    
                lngData = vData
    
                For i = 1 To Val(cmbNum.Text)
    
                    txtData = txtData & Format(lngData(i - 1), "0") & " "
    
                Next
    
            End If
    
        Else
    
            txtData = "Error"
    
        End If
    
        '------------------------------------------------
    
        Exit Sub
    
        '----------------
    
    ToExit:
    
        MsgBox Err.Description
    
    End Sub
    
    Private Sub cmdWriteData_Click()
    
        On Error GoTo ToExit '打开错误陷阱
    
        '------------------------------------------------
    
        Dim bytType As Byte
    
        Dim strData() As String
    
        Dim lngRet As Long
    
        Dim lngData(100) As Long
    
        Dim fData(100) As Single
    
        Dim i As Long
    
        Select Case cmbType.ListIndex
    
        Case 0: bytType = PPI_I
    
        Case 1: bytType = PPI_Q
    
        Case 2: bytType = PPI_M
    
        Case 3: bytType = PPI_V
    
        Case 4: bytType = PPI_S
    
        Case 5: bytType = PPI_SM
    
        End Select
    
        If Len(txtData) > 0 Then
    
            strData = Split(txtData, " ")
    
            If cmbLen.ListIndex = 3 Then
    
                For i = 0 To UBound(strData)
    
                    fData(i) = Val(strData(i))
    
                Next
    
                lngRet = S7_PPI1.WriteData(Val(txtAddr), fData, UBound(strData) + 1, Val(cmbLen.ListIndex), Val(bytType), cmbNo.ListIndex + 1)
    
            Else
    
                For i = 0 To UBound(strData)
    
                    lngData(i) = Val(strData(i))
    
                Next
    
                lngRet = S7_PPI1.WriteData(Val(txtAddr), lngData, UBound(strData) + 1, Val(cmbLen.ListIndex), Val(bytType), cmbNo.ListIndex + 1)
    
            End If
    
            If lngRet = 0 Then
    
                '
    
            Else
    
                txtData = "Error"
    
            End If
    
        End If
    
        '------------------------------------------------
    
        Exit Sub
    
        '----------------
    
    ToExit:
    
        MsgBox Err.Description
    
    End Sub
    


    在C#中:

    /// <summary>
    
            /// 读数据
    
            /// </summary>
    
            /// <param name="sender"></param>
    
            /// <param name="e"></param>
    
            private void btnRead_Click(object sender, EventArgs e)
    
            {
    
                int intAddr = int.Parse(txtFixAddr.Text);
    
                object vData = new object();
    
              
    
                /*
    
                [PPI_I] = &H81
    
                [PPI_Q] = &H82
    
                [PPI_M] = &H83
    
                [PPI_V] = &H84
    
                [PPI_S] = 4
    
                [PPI_SM] = 5
    
                */
    
                PPIV2.PPITYPE DataType= PPIV2.PPITYPE.PPI_V;
    
                switch (cmbDataType.SelectedIndex)  //数据类型
    
                {
    
                    case 0:
    
                        DataType = PPIV2.PPITYPE.PPI_I;
    
                        break;
    
                    case 1:
    
                        DataType = PPIV2.PPITYPE.PPI_Q;
    
                        break;
    
                    case 2:
    
                        DataType = PPIV2.PPITYPE.PPI_M;
    
                        break;
    
                    case 3:
    
                        DataType = PPIV2.PPITYPE.PPI_V;
    
                        break;
    
                    case 4:
    
                        DataType = PPIV2.PPITYPE.PPI_S;
    
                        break;
    
                    case 5:
    
                        DataType = PPIV2.PPITYPE.PPI_SM;
    
                        break;
    
                }
    
                if (axS7_PPI1.ReadData(int.Parse(txtDataAddr.Text), ref vData, cmbLen.SelectedIndex+1  , (PPIV2.PPILEN)cmbDataMode.SelectedIndex, DataType, intAddr) == 0)
    
                {
    
                    if (cmbDataMode.SelectedIndex == 3)
    
                    {
    
                        float[] fData = (float[])vData;
    
                        txtData.Text = "";
    
                        for (int i = 0; i < fData.Length; i++)
    
                        {
    
                            txtData.Text += fData[i].ToString("0.00") + " ";
    
                        }
    
                    }
    
                    else
    
                    {
    
                        Int32[] intData = (Int32[])vData;
    
                        txtData.Text = "";
    
                        for (int i = 0; i < intData.Length; i++)
    
                        {
    
                            txtData.Text += intData[i].ToString() + " ";
    
                        }
    
                    }
    
                }
    
                else
    
                {
    
                    txtData.Text = "ERROR";
    
                }
    
            }
    
     
    
            /// <summary>
    
            /// 写数据
    
            /// </summary>
    
            /// <param name="sender"></param>
    
            /// <param name="e"></param>
    
            private void btnWrite_Click(object sender, EventArgs e)
    
            {        
    
     
    
                int intAddr = int.Parse(txtFixAddr.Text);
    
                object vData = new object();
    
     
    
                /*
    
                [PPI_I] = &H81
    
                [PPI_Q] = &H82
    
                [PPI_M] = &H83
    
                [PPI_V] = &H84
    
                [PPI_S] = 4
    
                [PPI_SM] = 5
    
                */
    
                PPIV2.PPITYPE DataType = PPIV2.PPITYPE.PPI_V;
    
                switch (cmbDataType.SelectedIndex)  //数据类型
    
                {
    
                    case 0:
    
                        DataType = PPIV2.PPITYPE.PPI_I;
    
                        break;
    
                    case 1:
    
                        DataType = PPIV2.PPITYPE.PPI_Q;
    
                        break;
    
                    case 2:
    
                        DataType = PPIV2.PPITYPE.PPI_M;
    
                        break;
    
                    case 3:
    
                        DataType = PPIV2.PPITYPE.PPI_V;
    
                        break;
    
                    case 4:
    
                        DataType = PPIV2.PPITYPE.PPI_S;
    
                        break;
    
                    case 5:
    
                        DataType = PPIV2.PPITYPE.PPI_SM;
    
                        break;
    
                }
    
                long lngRet = 0;
    
                if (cmbDataMode.SelectedIndex == 3)
    
                {
    
                    float[] fData = new float[100];
    
                    fData[0] = float.Parse(txtData.Text);
    
                    lngRet = axS7_PPI1.WriteData(int.Parse(txtDataAddr.Text), fData, 1, (PPIV2.PPILEN)cmbDataMode.SelectedIndex, DataType, intAddr);
    
                }
    
                else
    
                {
    
                    Int32[] intData = new Int32[100];
    
                    intData[0] = Int32.Parse(txtData.Text);
    
                    lngRet = axS7_PPI1.WriteData(int.Parse(txtDataAddr.Text), intData, 1, (PPIV2.PPILEN)cmbDataMode.SelectedIndex, DataType, intAddr);
    
                }
    
                if (lngRet != 0)
    
                {
    
                    txtData.Text = "ERROR";
    
                }
    
            }
    


    在VC中:



    //读数据
    
    void CPPI_TestDlg::OnReadData()
    
    {
    
           //pCombo->GetLBText (pCombo->GetCurSel (), strType);
    
           long lngFixAddr=0,lngDataAddr=0;
    
           char strAddr[255];
    
           m_FixAddr.GetWindowText(strAddr,255);
    
           sscanf(strAddr,"%ld",&lngFixAddr);
    
          
    
           m_DataAddr.GetWindowText(strAddr,255);
    
           sscanf(strAddr,"%ld",&lngDataAddr);
    
        /*
    
           [PPI_I] = &H81
    
        [PPI_Q] = &H82
    
        [PPI_M] = &H83
    
        [PPI_V] = &H84
    
        [PPI_S] = 4
    
        [PPI_SM] = 5
    
           */
    
        long DataType;
    
           switch (m_DataType.GetCurSel())  //数据类型
    
           {
    
           case 0:
    
                  DataType=0x81; 
    
                  break;
    
           case 1:
    
                  DataType=0x82;
    
                  break;
    
           case 2:
    
                  DataType=0x83;
    
                  break;
    
           case 3:
    
                  DataType=0x84;
    
                  break;
    
           case 4:
    
                  DataType=0x4;
    
                  break;
    
           case 5:
    
                  DataType=0x5;
    
                  break;
    
           }
    
     
    
           long lngRet;
    
        VARIANT vData;
    
           VariantInit (&vData);
    
           if(m_DataMode.GetCurSel()==3)  //浮点数
    
           {
    
               vData.vt = VT_R4 | VT_ARRAY;
    
               vData.parray=SafeArrayCreateVector(VT_R4, 0, 255 );    
    
           }
    
           else
    
           {
    
               vData.vt = VT_I4 | VT_ARRAY;
    
               vData.parray=SafeArrayCreateVector(VT_I4, 0, 255 );     //SAFEARRAY vd;
    
           }   
    
           lngRet=m_PPI.ReadData(lngDataAddr,&vData,m_DataNum.GetCurSel()+1,m_DataMode.GetCurSel(),DataType,lngFixAddr);
    
           if(lngRet==0)
    
           {
    
                  CString strData;
    
                  if(m_DataMode.GetCurSel()==3)  //浮点数
    
                  {
    
                         float *fData;
    
                         SafeArrayAccessData(vData.parray, (void**)&fData );
    
                         for(int i=0;i<m_DataNum.GetCurSel()+1;i++)  //(int)vData.parray->cbElements
    
                         {
    
                            CString cData;
    
                            cData.Format("%04.2f ",fData[i]);
    
                            strData+= cData;
    
                         }
    
                         SafeArrayUnaccessData(vData.parray);
    
                  }
    
                  else
    
                  {
    
                         long *lngData;
    
                         SafeArrayAccessData(vData.parray, (void**)&lngData );
    
                         for(int i=0;i<m_DataNum.GetCurSel()+1;i++)  //(int)vData.parray->cbElements
    
                         {
    
                            CString cData;
    
                            cData.Format("%ld ",lngData[i]);
    
                            strData+= cData;
    
                         }
    
                         SafeArrayUnaccessData(vData.parray);
    
                  }
    
     
    
                  m_Data.SetWindowText(strData);
    
           }
    
           else
    
           {
    
            m_Data.SetWindowText(_T("ERROR"));
    
           }
    
           SafeArrayUnaccessData(vData.parray);
    
           SafeArrayDestroy(vData.parray);
    
        VariantClear(&vData);
    
    }
    
     
    
    //写数据
    
    void CPPI_TestDlg::OnWrite()
    
    {
    
           long lngFixAddr=0,lngDataAddr=0;
    
           char strAddr[255];
    
           m_FixAddr.GetWindowText(strAddr,255);
    
           sscanf(strAddr,"%ld",&lngFixAddr);
    
          
    
           m_DataAddr.GetWindowText(strAddr,255);
    
           sscanf(strAddr,"%ld",&lngDataAddr);
    
     
    
        long DataType;
    
           switch (m_DataType.GetCurSel())
    
           {
    
           case 0:
    
                  DataType=0x81;
    
                  break;
    
           case 1:
    
                  DataType=0x82;
    
                  break;
    
           case 2:
    
                  DataType=0x83;
    
                  break;
    
           case 3:
    
                  DataType=0x84;
    
                  break;
    
           case 4:
    
                  DataType=0x4;
    
                  break;
    
           case 5:
    
                  DataType=0x5;
    
                  break;
    
           }
    
           long lngRet;
    
        VARIANT vData;
    
           VariantInit (&vData);
    
           if(m_DataMode.GetCurSel()==3)  //浮点数
    
           {
    
               vData.vt = VT_R4 | VT_ARRAY;
    
               vData.parray=SafeArrayCreateVector(VT_R4, 0, 255 );
    
                 
    
                  float *fDatas,fData;
    
                  SafeArrayAccessData(vData.parray, (void**)&fDatas );
    
                  m_Data.GetWindowText(strAddr,255);
    
                  sscanf(strAddr,"%f",&fData);
    
                  fDatas[0]=fData;
    
                  SafeArrayUnaccessData(vData.parray);
    
           }
    
           else
    
           {
    
               vData.vt = VT_I4 | VT_ARRAY;
    
               vData.parray=SafeArrayCreateVector(VT_I4, 0, 255 );     //SAFEARRAY vd;
    
                 
    
                  long *lngDatas,lngData;
    
                  SafeArrayAccessData(vData.parray, (void**)&lngDatas );
    
                  m_Data.GetWindowText(strAddr,255);
    
                  sscanf(strAddr,"%ld",&lngData);
    
                  lngDatas[0]=lngData;
    
                  SafeArrayUnaccessData(vData.parray);
    
           }
    
     
    
        lngRet=m_PPI.WriteData(lngDataAddr,(const VARIANT &)vData,1,m_DataMode.GetCurSel(),DataType,lngFixAddr);
    
           if(lngRet!=0)
    
           {
    
                  m_Data.SetWindowText(_T("ERROR"));
    
           }
    
           SafeArrayUnaccessData(vData.parray);
    
           SafeArrayDestroy(vData.parray);
    
        VariantClear(&vData);
    
    }


    展开全文
  • VB6调用C++DLL: ``` Dim sndData‘缺省类型,自动默认为Variant/empty sndData=data’data为一个二进制数组,赋值结束后sndData的类型自动变为Variant/byte(0 to 65) Result=Msocket.sendto(sndData)'C++...
  • 为了解决大批量的数据处理问题,VB中提供了数组(Array)变量。数组是一种重要的数据结构,在许多程序设计语言中,都要直接或间接用到数组这种数据结构。数组的概念在VB中,如果把一组有序的数或变量作为一个整体来...
  • VB几种函数参数传递方法,Variant,数组,Optional,ParamArray  一) 过程的参数被缺省为具有 Variant 数据类型。  1)ByRef按 地址传递参数在 VB 是缺省的  按地址传递参数后,过程返回的也是地址,函数...
  • VB中DateDiff 函数解释

    2019-10-01 07:07:39
    VB中DateDiff 函数使用方法 DateDiff(interval,Date1,Date2[,firstweekofyear[,firstweekofyear]]) 返回一个Variant(long) 的值,表示两个指定日期间的时间间隔数目 interval:设定两个日期之间的期间计算...
  • vb中ByRef参数类型不符

    千次阅读 热门讨论 2018-02-22 21:10:35
    在机房收费系统中上机的时候总是提醒vb中ByRef参数类型不符,这是怎么回事呢? 【分析】 第一个类型 传递参数未定义类型,假如参数在调用前未定义类型,系统自动将他定义为variant类型,由于和过程或函数中的对...
  • vb中array函数用法在vb中array() 函数用于创建数组,表示返回一个包含数组的 Variant。可以创建数值数组(带有数字 ID 键的数组)、关联数组(带有指定的键的数组,每个键关联一个值)、多维数组(包含一个或多个数组的...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 191
精华内容 76
关键字:

vb中variant