问题是这样的:在C#程序中调用Activex控件中的一个事件,该事件带有四个参数为 FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax),该事件所在的类为 FSCANCLIENTREALTIMELib.FScanClientRealTime。 在按钮btnok下调用此事件。请问在C#中怎么实现呀,请大侠帮忙解决!
解决方案 »
- 请教入门问题
- c# iis Active控件
- 为什么application统计的Sssion个数和实际Session个数不一样
- treeview +xml 问题
- c#的委托和事件方面的专家那,救命啊~!
- WinForm中DataGridView绑定对像后,数据发表变化后更新实体层的问题(解决后再给50分)
- PictureBox随机显示图片?》~!
- 想写一个简单的带附件功能的发送邮件的demo,哪种方法较好。using System.Web.Mail 为什么报错?
- 如何应用Code Access Security把代码保护起来,不致被第三方不正确调用?
- C#中怎样向串口发消息呀?
- 一读串口,程序就停止了
- 求一段时间内分钟数
---------------------------------
这应该是一个方法,用于触发控件中的某个事件。1.在项目中添加该控件dll的引用。
2.创建包装过的对象。
3.使用该对象来调用此方法。
包括设置属性,调用方法都没有什么差别。
象C#中事件一样处理:使用+=附加一个事件处理方法就是了。
能不能写点代码出来参考下,我是这样写的:
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);
} }
}
}
能否提示下要改哪些地方呀
realtime.WindowParamChange+= new FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_WindowParamChangeEventHandler(paramchanged); 应该是这样的写法。注意要添加名为paramchanged的方法。
---------------------------------------------
说了嘛,要有名为paramchange的方法。paramchanged 方法本想在 button1_Click事件中调用的
--------------------------------------------------
这个是事件,由该对象内部触发,你只需要提供对这个事件的处理方法就是了。如果你的想法是点击某个Button之后,触发该事件,那么,你可以去看看它有没有提供其他的方法或属性。
采用事件委托的方法
对象:主窗体: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);
}
}
}
------------------------------------------------
不是实例化方法,而是为对象的事件提供相应的处理方法。
你需要在该事件发生的时候做什么,就在方法中写什么。
在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触发上面的事件和方法
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了。请指教!
-----------------
可以直接调用接口事件 WindowParamChange、CursorFreqChange
------------------------------------------
SetWindowParam这个方法应该可以触发前一个事件,至于后一个事件,没有找到相关的属性,也没找到相关的方法。我忽然想到了一点:如果是调用它自身为事件附加的处理方法,不知道可行不可行,你试着看这样写:
realtime.WindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax);
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);
}
}
}
不行,提示:
错误 1 事件“FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_Event.WindowParamChange”只能出现在 += 或 -= 的左边 F:\ctest\csharpexportvc\csharpexportvc\Form1.cs 45 26 csharpexportvc
FSCANCLIENTREALTIMELib.FScanClientRealTime.FireWindowParamChange改成realtime.WindowParamChange
即
FireWindowParamChangeEvent +=realtime.WindowParamChange;
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);
}
}
}
}
{
try
{
//realtime.WindowParamChange调用
paramchange(1, 2, 3, 4);
//realtime.CursorFreqChange调用
freqchange(1);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
不行,paramchange+= realtime.WindowParamChange;
freqchange+= realtime.CursorFreqChange;
提示 错误 1 事件“FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_Event.WindowParamChange”只能出现在 += 或 -= 的左边 F:\ctest\csharpexportvc\csharpexportvc\Form1.cs 27 37 csharpexportvc
搞了半天才知道你是想直接调用FSCANCLIENTREALTIMELib._DFScanClientRealTimeEvents_Event.WindowParamChange的事件啊,这个是行不通的,不能调用,如29楼说的一样,事件只是提供一个你自己用来处理当事件发生时的业务逻辑的方法,这个事件是你自己写的方法,明白了吗?
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);
}
}
}
}
提示报错 :灾难性故障 (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
是找不到容器的原因,但不知道怎么解决,在这里请教怎么解决!
http://topic.csdn.net/u/20090818/08/bf3d6c98-9fd6-47f3-a768-2a1711115c23.html?32741
这个事件按你的方法注册了,但怎么在btnscan按键触发改事件呀
你看一下realtime有哪些方法是有引发WindowParamChange事件的,你就在你的按键方法里调用这些方法,这样就会触发WindowParamChange事件
建议你还是先了解一些关于委托和事件的东西
public delegate void FireWindowParamChange(double dfXCurMin, double dfXCurMax, double dfYCurMin, double dfYCurMax);
public event FireWindowParamChange paramchange;//你这里用错了! 以上是定义委托和事件然后在窗体Init中加入
praamchange += new FireWindowParamChange(你的事件处理名);事件处理名必须和委托的参数一致!
好好改改吧......