会计凭证输入ActiveX控件是本人用Delphi 6.0做出来的一个控件,在Delphi下使用一切正常,但本人不会VB,会用Activex控件的进来看一下,这个会计凭证控件在VB下能不能用正常使用:
1)、控件的事件如下
OnMouseDown_
OnMouseUp_
OnKeyDown_
OnKeyUp_
On_GetCy
On_GetRate
On_GetAccText
On_ValidCy
OnInplaceEditClick
OnClick
OnColumnMoved
OnDblClick
OnGetEditMask
OnGetEditText
OnKeyPress
OnRowMoved
OnSelectCell
OnSetEditText
OnTopLeftChanged
为什么在VB中只看到OnMouseDown_一个事件,其他的事件哪里去了?
****解决该问题独得100分,OK后另开贴补分****
2)、控件使用了4个自定义事件On_GetAccText(取会计科目代码对应的科目名称),On_GetCy(取科目核算币别),On_GetRate(取科目汇率),On_validCy(验证科目有否核算指定币别),在VB下如何使用,其中On_GetAccText在Delphi 6.0代码如下:
procedure TForm1.CNPZGridPro1_GetAccText(Sender: TObject;
  const sAccID: WideString; var sResult: WideString);
begin
        sResult:=sAccID+' 会计科目';//作用是在用户输入的科目代码后加上科目名称,这里以' 会计科目'代替;
end;
4个自定义事件搞定的一个25分,分不够另开贴补分!
谢谢各位,分数先搞定的先得,绝不食言!!!

解决方案 »

  1.   

    我晕,忘了告诉下载地址了^_^
    控件下载地址:http://www.delphifans.com/SoftView/SoftView_610.html
      

  2.   

    To gc801;
     1\"1、第一行可以正确输入摘要、选择科目、币别、借方。到了第二列这些信息统统都不能用了。"
      编辑控制方面,我试过没有问题的,我是直接把控件放窗口中,然后直接运行,可以正常输入,另外控件对输入有限制的,例如第一行必须输入摘要\会计科目\借方金额或贷方金额中的一个;第二行开始必须输入会计科目\借方金额或贷方金额中的一个.
     2\"其它事件代码强行加入进去也会提示有问题,诸如声明重复之类的。'
     麻烦的就在这里.
     在VC或DELPHI中事件代码声明都IDE自动生成的,但VB都不知道去哪里了.
     另外,"其它事件代码强行加入进去也会提示有问题,诸如声明重复之类的"是不是因为VB的IDE已经声明过(但没有在IDE中显示),你直接调用看一下,对VB我不熟.
     另根据网上的文章CNPZGridPro1.Object可以返回对象,我试了一下,调用属性和方法都没有问题,唯独对事件怎么处理搞不定
      

  3.   

    对DELPHI不熟,我只能告诉你在VB的ACTIVEX控件如何定义事件的首先在文件顶端定义事件

    Event KeyDown(KeyCode As Integer, Shift As Integer)'在激发本事件的地方输入
    RaiseEvent KeyDown(KeyCode, Shift)
      

  4.   

    TO  cool_man(土豆) 
    1、RaiseEvent KeyDown(KeyCode, Shift)
      如果我要在KeyDown中写自己的事件代码,那该怎么办!
    2、下面这个事件在VB中怎么声明:
    procedure TForm1.CNPZGridPro1_GetAccText(Sender: TObject;
      const sAccID: WideString; var sResult: WideString);
    begin
            sResult:=sAccID+' 会计科目';//作用是在用户输入的科目代码后加上科目名称,这里以' 会计科目'代替;
    end;
    >>
    sAccID是一个字符串,sResult是一个字符串指针,需从sResult返回WideString值,怎么定义。
      

  5.   

    建议你看看这个,这样有助于你编写在VB下可用的控件或将VCL封闭成OCX供VB等其它开发工具使用
    如何在VB中使用Delphi的控件作者:南京南自总厂开发中心 张玉洲南京理工大学98研 王静----   用过Delphi的编程爱好者们都知道,Delphi中Visual Component Library(VCL)中具有大量的组件,尤其是第三方设计的VCL,如Ahm系列,LMD系列,VenusPro等,在程序中适当的使用它们会让你的程序在界面上或者功能上增色不少,这让许多VB迷们馋的掉口水,因为毕竟免费的并且功能强大的ActiveX控件太少了,本文就是为那些到处找控件的VB迷写的。 ----   为方便讲述,以Delphi4 中Samples 标签下的ColorGrid组件为例,描述如何将ColorGrid导出成ActiveX控件。 ---- 1、打开delphi4,运行File- >New,弹出NewItems对话框,点取"ActiveX"标签,选择ActivexControl,选择"OK" ---- 2、在出现的ActiveX Control Wizard的对话框中,有如下选择: ---- VCL Class Name:选择要导出的或继承的VCL组件(注意非TwinControl继承的VCL不再列表中,之后再讨论),选择TColorGrid ---- New Activex Name:要导出的ActiveX控件名,取默认值ColorGridX即可 ---- Implementation Unit:实现单元,取缺省名称 ---- Project Name:创建的工程名,取缺省名称 ---- Thread Model:线程模式,详看Delphi帮助,这里取默认值Apartment(单线程) ---- Include Design-Time License:是否包含使用许可信息 ---- Include About Box:是否包含"About"对话框 ---- Include Version Informaion:是否包含版本信息 ---- 单击"OK",此时Delphi为我们创建了三个文件: ---- 库文件  ColorGridXControl1 ---- 实现单元 ColorGridImpl1 ---- 类型文件 ColorGridXControl1_TLB ---- 3、选择菜单Run->Register ActiveX Server,会出现注册成功的信息: "Successfully Registered ActiveX Server,'...\ColorGridControl1.ocx'" ---- 这里的ColorGridXControl1.ocx就是你所需要的颜色选取控件。---- 现用VB6对其进行测试: ---- 1、新建一VB6工程,选取菜单"工程->部件",在出现的对话框中选中ColorGridXControl1 Library,选"确定"。 ---- 2、在窗体Form1上放置控件ColorGridX,取默认名称"ColorGridX1"。 ---- 3、如何利用它的属性和方法:以获得选取颜色为例,在它的onClick事件中添加监视ColorGridX1,发现其属性Object返回对Delphi控件的引用,ForegroundColor属性值代表选中的颜色,虽然在"ColorGridX1.Object."后没有代码提示,但仍然可以用ColorGridX1.Object.ForegroundColor可得到颜色值。 ---- 如果你想完善这个控件,在键入"ColorGridX1."后直接得到ForegroundColor的属性提示,那就必须手工在Delphi中为ColorGridX填加属性/方法,步骤如下: ---- 1、选中实现单元ColorGridImpl1,选菜单"Edit->Add To Interface",在出现的对话框中的Declaration填写"Property ForegroundColor:integer",选"OK",这时Delphi自动为你填加了两个过程框架: procedure TColorGridX.Set_ForeColor(value: Integer);function TColorGridX.Get_ForeColor: Integer;2、在Get_ForeColor中添加代码result:=FDelphiControl.ForegroundColor;由于ColorGrid的ForegroundColor属性为只读,Set_ForeColor过程不用写了。 ---- 3、编译执行,Run->Register ActiveX Server,会出现注册成功的信息。再到VB中,会发现控件ColorGridX新增了ForeColor属性,代表选中的颜色值。---- 依此类推,可以增加其它有用的属性供VB等显式调用。用这种办法,可以把大多数由TWinControl继承下来的组件导出,那么非TWinControl的组件以及没有列出的组件怎么导出呢?且看下文。 ----   前面提到创建ActiveX控件时,在ActiveX Control Wizard的对话框的VCLClassName下拉列表中找不到想导出的VCL组件,这是因为该组件不是由TwinControl继承下来的,属"Windowless"那一种,这时我们可以用ActiceForm的形式把它导出来,以第三方控件TColorPickerButton为例: ---- 1、选菜单"File->New",在出现的"New Items"对话框中选择"ActiveX"标签,选中ActiveXForm,选择"OK" ---- 2、在出现的"ActiveForm Wizard"的"New ActiveX Name"中填写输出的控件名"ColorPicker",选择"OK" ---- 3、在Delphi为我们创建的窗体上放置TColorPickerButton组件,名为"ColorPickerButton1",将窗体调整到合适大小,选菜单"Edit->Add To Interface",为它添加属性:Property SelectColor:integer,选择"OK" ---- 4、在Delphi提供的框架中写下类似代码: ---- 读取颜色: function TColorPicker.Get_SelectColor: Integer;beginresult:=ColorPickerButton1.SelectionColor;end;设置颜色:procedure TColorPicker.Set_SelectColor(value: Integer);beginColorPickerButton1.SelectionColor:=value;end; ---- 5、编译执行,Run->Register ActiveX Server,会得到注册成功的消息。---- 6、用前面讲述的方法在VB6下实验,获得成功。 ---- 关于添加属性的两点说明: ---- 1、原形为"Property {属性/方法名}:数值类型",其中数值类型有:WordBool、WideString、Integer等 ---- 2、如果出现"SafeCall function Requires a HResult return type"的错误提示,说明你添加的属性/方法名已经存在,换个名字即可。 ----   至此,我们已经成功导出了GridColor(属TWinControl继承类)和ColorPicker(属"Windowless"),写此文仅为抛砖引玉,还有许多功能强大的"For Delphi"的第三方控件的我们可以转化,提醒一点,并不是所有的VCL组件都能转成ActiveX,如Delphi的通用对话对话框。现在我们可以制作自己的ActiveX控件而不受限制了,最大的优点在于:强大&免费!现在,你也能利用自己导出的ActiveX控件用VB写出漂亮的程序来了,而且不用担心注册号之类的困绕! ^_^
      

  6.   

    终于自己搞定,在VB.NET下也可用。
    所有Delphi自定义事件在VB下都没办法用,我晕!
    散分,UP有分,先来先得,元旦准时结贴。
    欢迎网友提意见或建议或帮助找bug,采纳的一条另开贴给100分,决不食言。
    ///////////////////////////////////////////////////////////////////////
    1、如何解决“在对象检视器中可以看到CNPZGridPro1对象,但无法选中”问题
    :手动添加以下代码
              Private Sub PZ_OnInplaceEditClick() 'PZ是凭证控件实例名,根据实际修改
              End Sub
    2、如何解决On_GetAccText等4个用户事件不能使用问题,
    :用4个用户函数替代,具体代码如下,以下假设凭证控件名为PZ,如用户凭证控件名不同,请修改为PZPrivate Sub PZ_OnSelectCell(ByVal ACol As Long, ByVal ARow As Long, CanSelect As Boolean)
    Const ctACCount = 1  '会计科目列号
    Const ctCurrency = 2 '币别
    Const ctRate = 3     '汇率
    Const ctoriginalcurrency = 4 '原币Dim ftmp As Double
    Dim btmp As Boolean
    Dim sText, FsCy, stmp As String
    Dim iLen, iTmp As Integer
    Dim fsy As String
    Select Case PZ.Col
        Case ctACCount: '用户录入会计科目后,准备离开,启动数据检查程序
                 If (Trim(PZ.getCell(ctACCount, PZ.Row)) <> "") Then
                            sText = GetAccName(PZ.getCell(ctACCount, PZ.Row))  '为用户输入的科目代码添加一个显示文本
                            If (UCase(sText) = "ERROR") And PZ.CheckValid Then '用户输入不存的科目代码
                                 MsgBox ("警告:会计科目" + PZ.getCell(ctACCount, PZ.Row) + "不存在")
                                 CanSelect = False
                                 ' keybd_event(VK_F2,0,0,0)               //API 请用户自行补充完整,发送F2是为了置编辑状态
                                 ' keybd_event(VK_F2,0,KEYEVENTF_KEYUP,0) //API 请用户自行补充完整
                            Else
                                Call PZ.setCell(ctACCount, PZ.Row, sText)
                                If (Trim(PZ.getCell(ctCurrency, PZ.Row)) = "") Then      '币别为空
                                      FsCy = UCase(GetCy(PZ.getCell(ctACCount, PZ.Row))) '获取指定科目默认币别
                                      Call PZ.setCell(ctCurrency, PZ.Row, FsCy)
                                      If FsCy <> "RMB" Then      '获取外币汇率
                                           ftmp = GetRate(FsCy)
                                           sText = CStr(ftmp)
                                           Call PZ.setCell(ctRate, PZ.Row, sText)
                                           PZ.Expand
                                      End If  '//if FsCy<>'RMB' then
                                End If  '//if (trim(cells[ctCurrency,row])='')
                            End If
                      End If '// if (trim(cells[ctACCount,row])<>'')
      Case ctCurrency: '用户准备离开币别栏,启动数据检查
                  If Trim(PZ.getCell(ctCurrency, PZ.Row)) <> "" Then
                            Call PZ.setCell(ctCurrency, PZ.Row, UCase(PZ.getCell(ctCurrency, PZ.Row)))
                            btmp = ValidCy(PZ.getCell(ctACCount, PZ.Row), PZ.getCell(ctCurrency, PZ.Row))
                            If btmp = False Then
                                MsgBox ("警告:会计科目" + PZ.getCell(ctACCount, PZ.Row) + "不能核算币别:" + PZ.getCell(ctCurrency, PZ.Row))
                                '//cells[FCurrency,row]='RMB'
                                'keybd_event(VK_F2,0,0,0)                //API 请用户自行补充完整
                                'keybd_event(VK_F2,0,KEYEVENTF_KEYUP,0)  //API 请用户自行补充完整
                                PZ.SetEditStyle_ (0) '//避免出现下拉框或按钮
                                CanSelect = False
                            End If
                            Else
                              If Trim(UCase(PZ.getCell(ctCurrency, PZ.Row))) = "RMB" Then '币别是人民币则不需显示汇率/原币
                                Call PZ.setCell(ctRate, PZ.Row, "")
                                Call PZ.setCell(ctoriginalcurrency, PZ.Row, "")
                              End If  '//floattostrF(FDrSum,ffFixed,15,2)
                              If (Trim(UCase(PZ.getCell(ctCurrency, PZ.Row))) <> "RMB") And (Trim(PZ.getCell(ctRate, PZ.Row)) = "") Then '//币别有效,汇率未输入
                                 ftmp = GetRate(PZ.getCell(ctCurrency, PZ.Row))
                                 Call PZ.setCell(ctRate, PZ.Row, CStr(ftmp))
                              End If '//if trim(cells[ctRate,row])=''
                           End If
       End Select   '// case Col of
    End SubPublic Function GetAccName(sAcct As String) As String
    '本函数相当于用户事件procedure  On_GetAccText(sAccID: String;var sResult:string);请用户根据需要修改
        GetAccName = sAcct + " 科目"  '假定显示文本为"科目"
        If sAcct = "test" Then        '假定不存在test科目
            GetAccName = "error"
        Else
            If sAcct = "1001" Then
                GetAccName = "1001 现金"
            End If
        End If
    End FunctionPublic Function GetCy(sAcct As String) As String
    '本函数相当于用户事件procedure On_GetCy(sAccID:string;var sResult:string);请用户根据需要修改
        GetCy = "RMB"
        If UCase(Left(sAcct, 1)) = "U" Then  '假定以U开头的科目默认核算美元;请用户根据实际情况修改
            GetCy = "USD"
        End If
    End FunctionPublic Function GetRate(ByVal sCy As String) As Double
    '本函数相当于用户事件procedure On_GetRate(sCy:string;var fResult:double);请用户根据需要修改
        If sCy = "USD" Then
            GetRate = 8.1015  '假定美元汇率为8.1015
        Else
            GetRate = 1#      '本币汇率自然为1
        End If
    End FunctionPublic Function ValidCy(sAcct As String, sCy As String) As Boolean
    '本函数相当于用户事件procedure On_ValidCy(sAccID,sCy:string;var bResult:boolean);请用户根据需要修改
       ValidCy = True
       If sAcct = "test" And sCy = "USD" Then '假定科目test不能核算币别USD
        ValidCy = False
       End If
    End Function