问题是这样的:在C#程序中调用Activex控件中的一个事件,该事件带有四个参数为 FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax),该事件所在的类为  FSCANCLIENTREALTIMELib.FScanClientRealTime。 在按钮btnok下调用此事件。请问在C#中怎么实现呀,请大侠帮忙解决!

解决方案 »

  1.   

    该事件带有四个参数为 FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax),是事件,还是方法呢?是方法就直接调用。
      

  2.   

    该事件带有四个参数为 FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax),
    ---------------------------------
    这应该是一个方法,用于触发控件中的某个事件。1.在项目中添加该控件dll的引用。
    2.创建包装过的对象。
    3.使用该对象来调用此方法。
      

  3.   

    FireWindowParamChange是VC中的事件,现在要在C#中调用,怎么调呢
      

  4.   

    如果创建对象的步骤正确,那么这个对象就可以象普通的.Net对象一样使用。
    包括设置属性,调用方法都没有什么差别。
      

  5.   

    这里是调用事件,一定要通过委托调用吧,但一时不知道怎么调,像这种调用VC ACTIVEX控件的事件真不知道怎么调,请帮忙解决下
      

  6.   

    为什么需要委托?比如我们在项目中导入Windows Media Player,包装的对象一般会命名为axWindowsMediaPlayer1之类的,然后调用方法时就是axWindowsMediaPlayer1.controls.play(),只要前面的步骤正确,使用起来与.Net对象基本上感觉不到差别,因为导入的时候这些都已经给你包装好了。
      

  7.   

    C#调用方法和事件是不一样的,你可以试试,调用事件一定要通过委托,不然就提示"错误 1 事件“FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_Event.WindowParamChange”只能出现在 += 或 -= 的左边" ,调用方法就不会了。
      

  8.   

    这样很明显了,事件是这个:WindowParamChange而非你前面贴出的。
    象C#中事件一样处理:使用+=附加一个事件处理方法就是了。
      

  9.   


    能不能写点代码出来参考下,我是这样写的:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using FSCANCLIENTMISCLISTLib;
    using AxFSCANCLIENTMISCLISTLib;
    using AxFSCANCLIENTREALTIMELib;
    using FSCANCLIENTREALTIMELib;
    namespace csharpexportvc
    {
          public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                btnscan.Parent = axFScanClientMiscList1;
                axFScanClientMiscList1.Parent = this;
                 //realtime.WindowParamChange+= new EventHandler((FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_WindowParamChangeEventHandler)paramchange);
            }        private void Form1_Load(object sender, EventArgs e)
            {
              
              //  dfscanmisc.ClearAllData();
               
            }
            public delegate void FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax);
            public event EventHandler  paramchange;
            public delegate void Crusorfreqchange(double dfFreq);
            public event EventHandler freqchange;
            private FSCANCLIENTREALTIMELib.FScanClientRealTime realtime = new FScanClientRealTime();
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                   
                //    object ob1=null;
                //    realtime.AddData(ob1,System.DateTime.Now,20);
                }
                catch(Exception err)
                {
                    MessageBox.Show(err.Message);
                }        }
        }
    }
    能否提示下要改哪些地方呀
      

  10.   


    realtime.WindowParamChange+= new FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_WindowParamChangeEventHandler(paramchanged); 应该是这样的写法。注意要添加名为paramchanged的方法。
      

  11.   

     realtime.WindowParamChange += new FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_WindowParamChangeEventHandler(paramchange);提示报错: paramchange为null。该怎么改
      

  12.   

    paramchanged 方法本想在 button1_Click事件中调用的
      

  13.   

    realtime.WindowParamChange += new FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_WindowParamChangeEventHandler(paramchange);提示报错: paramchange为null。该怎么改
    ---------------------------------------------
    说了嘛,要有名为paramchange的方法。paramchanged 方法本想在 button1_Click事件中调用的
    --------------------------------------------------
    这个是事件,由该对象内部触发,你只需要提供对这个事件的处理方法就是了。如果你的想法是点击某个Button之后,触发该事件,那么,你可以去看看它有没有提供其他的方法或属性。
      

  14.   

    我是想窗体初始化的时候,注册该事件,然后在Button后触发改事件,FSCANCLIENTREALTIMELib._DFScanClientRealTime类提供了很多方法和事件。现在就是不知怎么去实例化paramchange方法
      

  15.   

    我这里有一个方法:
    采用事件委托的方法
    对象:主窗体:FrmMain 加载窗体:FrmLoading
    思路:
    在主窗体加载前显示窗体FrmLoading,当主窗体加载完毕后(第一次显示的时候),关闭FrmLoading代码:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace CDemoTest
    {
        public partial class FrmMain : Form
        {
            private FrmLoading loadForm;
            public FrmMain()
            {
                //创建加载窗体
                loadForm = new FrmLoading();
                //指定窗体加载完毕时的事件
                this.Shown += FrmLoading_Close;            loadForm.Show();
                //主窗体初始化方法
                InitializeComponent();
            }
            //声明关闭加载窗体方法
            private void FrmLoading_Close(object sender, EventArgs e)
            {
                loadForm.Close();
            }        private void FrmMain_Load(object sender, EventArgs e)
            {            Thread.Sleep(3000);
            }
        }
    }
      

  16.   

    我是想窗体初始化的时候,注册该事件,然后在Button后触发改事件,FSCANCLIENTREALTIMELib._DFScanClientRealTime类提供了很多方法和事件。现在就是不知怎么去实例化paramchange方法
    ------------------------------------------------
    不是实例化方法,而是为对象的事件提供相应的处理方法。
    你需要在该事件发生的时候做什么,就在方法中写什么。
      

  17.   

    是这样的,在VC ACTIVEX包括多个接口事件和方法,我现在在C#要调用它其中的事件和方法。这就是目的,就是实现不成功,实现接口方法很容易,但实现接口事件就出现上面的问题了,请指教!
      

  18.   

    还是不明白,你要使用属性,就可以使用属性,你要使用方法,就可以使用方法,但是事件,是需要你自己来编写代码来处理的,该事件发生的时候,你的程序要如何动作,这是由你来控制的。比如.Net中的Button,你为它的Click事件附加一个处理方法,你在代码中写什么,用户点击这个按钮就能得到什么。
      

  19.   

    好吧,在简单点说就是 用C#调用VC 的ACTIVEX控件的接口事件 出现上面的问题 
      

  20.   

    好的,我再把问题说清楚点:
    在VC中接口事件有: dispinterface _DFScanClientRealTimeEvents
    {
    properties:
    //  Event interface has no properties methods:
    // NOTE - ClassWizard will maintain event information here.
    //    Use extreme caution when editing this section.
    //{{AFX_ODL_EVENT(CFScanClientRealTimeCtrl)
    [id(1)] void WindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax);
    [id(2)] void SetNewFFMFreq(double dfNewFFMFreq);
    [id(3)] void CursorPosChange(long x);
    [id(4)] void CursorFreqChange(double dfFreq);
    [id(5)] void UnknownLevelChange(double dfLevel);
    [id(6)] void DClickEvent(double dfFreq);
    [id(7)] void UnStComing(double dfFreq, double dfLevel, DATE dtDate);
    [id(8)] void UnStLeving(double dfFreq, double dfLevel, DATE dtDate);
    [id(9)] void SelectException(double dfFreq);
    //}}AFX_ODL_EVENT
    };
    接口方法有:
    dispinterface _DFScanClientRealTime
    {
    properties:
    // NOTE - ClassWizard will maintain property information here.
    //    Use extreme caution when editing this section.
    //{{AFX_ODL_PROP(CFScanClientRealTimeCtrl)
    [id(1)] VARIANT FreqRange;
    [id(2)] double OccupationLevelThreshold;
    [id(3)] double UnknownLevelThreshold;
    [id(4)] IDispatch* SystemLogonObject;
    //}}AFX_ODL_PROP methods:
    // NOTE - ClassWizard will maintain method information here.
    //    Use extreme caution when editing this section.
    //{{AFX_ODL_METHOD(CFScanClientRealTimeCtrl)
    [id(5)] void ClearAllData();
    [id(6)] void AddData(VARIANT valData, DATE time,BOOL bInvalidateImmediately);
    [id(7)] void GetWindowParam(double* pdfXCurMin, double* pdfXCurMax, double* pdfYCurMin, double* pdfYCurMax);
    [id(8)] void SetWindowParam(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax);
    [id(9)] void GetShowCurves(boolean* bShowMax, boolean* bShowMin, boolean* bShowAvg, boolean* bShowReal,boolean* bShowUnknown);
    [id(10)] void SetShowCurves(boolean bShowMax, boolean bShowMin, boolean bShowAvg, boolean bShowReal, boolean bShowUnknown);
    [id(11)] void ZoomAll();
    [id(12)] void GetFinalStatData(VARIANT* valCurveMin, VARIANT* valCurveMax, VARIANT* valCurveReal, VARIANT* valCurveAvg);
    [id(13)] void SetFinalStatData(VARIANT valCurveMin, VARIANT valCurveMax, VARIANT valCurveReal, VARIANT valCurveAvg);
    [id(14)] void SetCursorPos(long x);
    [id(15)] void GetMarker(boolean* bShow0, boolean* bShow1, boolean* bShow2, boolean* bShow3, double* dfFreq0, double* dfFreq1, double* dfFreq2, double* dfFreq3);
    [id(16)] void SetMarker(boolean bShow0, boolean bShow1, boolean bShow2, boolean bShow3, double dfFreq0, double dfFreq1, double dfFreq2, double dfFreq3);
    [id(17)] void ExportToWord(IDispatch* pDoc, IDispatch* PSelection, VARIANT valStatParam);
    [id(18)] void Print(long hdc, long* pLeft, long* pTop, long* pRight, long* pBottom, VARIANT valStatParam);
    [id(19)] void GetUnSaveData(VARIANT* valData);
    [id(20)] void GetUnknownData(VARIANT* valData);
    [id(21)] void GetMarker2(boolean* bShow0, boolean* bShow1, boolean* bShow2, boolean* bShow3, boolean* bShow4, boolean* bShow5, boolean* bShow6, boolean* bShow7, boolean* bShow8, boolean* bShow9, boolean* bShow10, boolean* bShow11, double* dfFreq0, double* dfFreq1, double* dfFreq2, double* dfFreq3, double* dfFreq4, double* dfFreq5, double* dfFreq6, double* dfFreq7, double* dfFreq8, double* dfFreq9, double* dfFreq10, double* dfFreq11);
    [id(22)] void SetMarker2(boolean bShow0, boolean bShow1, boolean bShow2, boolean bShow3, boolean bShow4, boolean bShow5, boolean bShow6, boolean bShow7, boolean bShow8, boolean bShow9, boolean bShow10, boolean bShow11, double dfFreq0, double dfFreq1, double dfFreq2, double dfFreq3, double dfFreq4, double dfFreq5, double dfFreq6, double dfFreq7, double dfFreq8, double dfFreq9, double dfFreq10, double dfFreq11);
                [id(23)] void AddExceptionData(VARIANT valData);
    [id(24)] void GetShowExceptionType(boolean* bShowLevelOver, boolean* bShowUnknown, boolean* bShowFreqOffset, boolean* bShowBWOver);
    [id(25)] void SetShowExceptionType(boolean bShowLevelOver, boolean bShowUnknown, boolean bShowFreqOffset, boolean bShowBWOver);
    //}}AFX_ODL_METHOD [id(DISPID_ABOUTBOX)] void AboutBox();
    };
    现在在C#中要调用其中的两个接口事件 WindowParamChange、CursorFreqChange和接口方法AddData
    想在Button_click触发上面的事件和方法
      

  21.   

    我实现的代码是:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using FSCANCLIENTMISCLISTLib;
    using AxFSCANCLIENTMISCLISTLib;
    using AxFSCANCLIENTREALTIMELib;
    using FSCANCLIENTREALTIMELib;
    namespace csharpexportvc
    {
          public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                btnscan.Parent = axFScanClientMiscList1;
                axFScanClientMiscList1.Parent = this;
               // paramchange = new FireWindowParamChange(realtime);
                realtime.WindowParamChange += new FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_WindowParamChangeEventHandler(paramchange);
                realtime.CursorFreqChange += new FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_CursorFreqChangeEventHandler(freqchange);
            }        private void Form1_Load(object sender, EventArgs e)
            {
              
              //  dfscanmisc.ClearAllData();
               
            }
            public delegate void FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax);
            public event FireWindowParamChange paramchange;
            public delegate void Crusorfreqchange(double dfFreq);
            public event Crusorfreqchange freqchange;
            private FSCANCLIENTREALTIMELib.FScanClientRealTime realtime = new FScanClientRealTime();
            private void btnscan_Click(object sender, EventArgs e)
            {
                try
                {
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                }
            }
        }
    }
    但在上面运行  realtime.WindowParamChange += new FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_WindowParamChangeEventHandler(paramchange);
    这两句报错,提示paramchange是null
    现在不知道怎么实例化paramchange了。请指教!
      

  22.   

    接口方法AddData 
    -----------------
    可以直接调用接口事件 WindowParamChange、CursorFreqChange
    ------------------------------------------
    SetWindowParam这个方法应该可以触发前一个事件,至于后一个事件,没有找到相关的属性,也没找到相关的方法。我忽然想到了一点:如果是调用它自身为事件附加的处理方法,不知道可行不可行,你试着看这样写:
    realtime.WindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax); 
      

  23.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace CDemoTest
    {
        public partial class FrmMain : Form
        {        //定义与Activex控件中的一个事件相对应的委托
            delegate void DelegateFireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax);
            //定义与Activex控件中的一个事件相对应的委托的事件
            event DelegateFireWindowParamChange FireWindowParamChangeEvent;        private FrmLoading loadForm;
            public FrmMain()
            {
                //FSCANCLIENTREALTIMELib.FScanClientRealTime.FireWindowParamChange为你那个什么控件的事件
                FireWindowParamChangeEvent += FSCANCLIENTREALTIMELib.FScanClientRealTime.FireWindowParamChange;
                ////创建加载窗体
                //loadForm = new FrmLoading();
                ////指定窗体加载完毕时的事件
                //this.Shown += FrmLoading_Close;            //loadForm.Show();
                ////主窗体初始化方法
                //InitializeComponent();
            }
            //声明关闭加载窗体方法
            private void FrmLoading_Close(object sender, EventArgs e)
            {
                loadForm.Close();
            }        private void FrmMain_Load(object sender, EventArgs e)
            {
                Thread.Sleep(3000);
            }        private void btnClick_Click(object sender, EventArgs e)
            {            //在按纽的点击事件中调用事件
                double a = 1;
                double b = 2;
                double c = 3;
                double d = 4;
                //C#程序中调用Activex控件中的一个事件
                FireWindowParamChangeEvent(a, b, c, d);
            }
        }
    }
      

  24.   

    改写成  realtime.WindowParamChange(0,300,0,300); 
    不行,提示:
    错误 1 事件“FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_Event.WindowParamChange”只能出现在 += 或 -= 的左边 F:\ctest\csharpexportvc\csharpexportvc\Form1.cs 45 26 csharpexportvc
      

  25.   

    把这个改成你的VC控件的事件就行了
    FSCANCLIENTREALTIMELib.FScanClientRealTime.FireWindowParamChange改成realtime.WindowParamChange

     FireWindowParamChangeEvent +=realtime.WindowParamChange;
      

  26.   

    按照你的代码修改了一下,请看注释为“//进行了修改的地方”的地方using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using FSCANCLIENTMISCLISTLib;
    using AxFSCANCLIENTMISCLISTLib;
    using AxFSCANCLIENTREALTIMELib;
    using FSCANCLIENTREALTIMELib;
    namespace csharpexportvc
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                btnscan.Parent = axFScanClientMiscList1;
                axFScanClientMiscList1.Parent = this;
                //进行了修改的地方
                paramchange += realtime.WindowParamChange;
                freqchange += realtime.CursorFreqChange;
            }        private void Form1_Load(object sender, EventArgs e)
            {            //  dfscanmisc.ClearAllData();         }
            public delegate void FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax);
            public event FireWindowParamChange paramchange;
            public delegate void Crusorfreqchange(double dfFreq);
            public event Crusorfreqchange freqchange;
            private FSCANCLIENTREALTIMELib.FScanClientRealTime realtime = new FScanClientRealTime();
            private void btnscan_Click(object sender, EventArgs e)
            {
                try
                {
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                }
            }
        }
    }
      

  27.   

    还有调用方法: private void btnscan_Click(object sender, EventArgs e)
            {
                try
                {
                    //realtime.WindowParamChange调用
                    paramchange(1, 2, 3, 4);
                    //realtime.CursorFreqChange调用
                    freqchange(1);
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                }
            }
      

  28.   


    不行,paramchange+= realtime.WindowParamChange;
                freqchange+= realtime.CursorFreqChange;
    提示 错误 1 事件“FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_Event.WindowParamChange”只能出现在 += 或 -= 的左边 F:\ctest\csharpexportvc\csharpexportvc\Form1.cs 27 37 csharpexportvc
      

  29.   


    搞了半天才知道你是想直接调用FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_Event.WindowParamChange的事件啊,这个是行不通的,不能调用,如29楼说的一样,事件只是提供一个你自己用来处理当事件发生时的业务逻辑的方法,这个事件是你自己写的方法,明白了吗?
      

  30.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using FSCANCLIENTMISCLISTLib;
    using AxFSCANCLIENTMISCLISTLib;
    using AxFSCANCLIENTREALTIMELib;
    using FSCANCLIENTREALTIMELib;
    namespace csharpexportvc
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                btnscan.Parent = axFScanClientMiscList1;
                axFScanClientMiscList1.Parent = this;
                //进行了修改的地方
                realtime.WindowParamChange += WindowParamChange_Methold;
                realtime.CursorFreqChange += Crusorfreqchange_Methold;
            }        private void WindowParamChange_Methold(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax)
            { 
                //业务逻辑
                //自己要进行什么处理在这里写        }        private void Crusorfreqchange_Methold(double dfFreq)
            {
                //业务逻辑
                //自己要进行什么处理在这里写        }
            private void Form1_Load(object sender, EventArgs e)
            {            //  dfscanmisc.ClearAllData();         }        private FSCANCLIENTREALTIMELib.FScanClientRealTime realtime = new FScanClientRealTime();
            private void btnscan_Click(object sender, EventArgs e)
            {
                try
                {            }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                }
            }
        }
    }
      

  31.   

    还有个问题是最简单的调用 realtime.AboutBox();
    提示报错 :灾难性故障 (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
    是找不到容器的原因,但不知道怎么解决,在这里请教怎么解决!
      

  32.   

    API函数中倒是有个SetParent方法,有没有用就不知道了。
      

  33.   

    已有另发帖子 
    http://topic.csdn.net/u/20090818/08/bf3d6c98-9fd6-47f3-a768-2a1711115c23.html?32741
      

  34.   


    这个事件按你的方法注册了,但怎么在btnscan按键触发改事件呀
      

  35.   

    realtime.WindowParamChange并不能通过你的按键来触发的,他这个事件是由realtime里的某一个方法来触发的,不能由外部触发
    你看一下realtime有哪些方法是有引发WindowParamChange事件的,你就在你的按键方法里调用这些方法,这样就会触发WindowParamChange事件
    建议你还是先了解一些关于委托和事件的东西
      

  36.   

    你的委托和事件使用方法有很大问题
    public delegate void FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax); 
    public event FireWindowParamChange  paramchange;//你这里用错了! 以上是定义委托和事件然后在窗体Init中加入
    praamchange += new FireWindowParamChange(你的事件处理名);事件处理名必须和委托的参数一致!
    好好改改吧......