|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我见过java运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《Java的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。 关于窗体间复杂的通讯,接纳VB6.0的办法就可以满意我们的请求,但在一些架构计划庞大的使用中,这类办法就显得有点左支右绌了,同时该办法另有一个弱点,就是它仅仅对经由过程.NET窗体导游增加出来的窗体起感化,而关于自界说的窗体范例我们是没法增加到Forms工具汇合中的。并且也和别的诸如机关函数传参等办法一样,会在窗体间大批相互援用各自的成员,形成了相互之间存在着很年夜的耦合性,十分倒霉于窗体模块间的自力,这不切合优秀软件计划形式的头脑。
假如我们想在一个窗体中会见另外一个窗体中自界说的成员,必需把该成员的可见性设置为Public大概经由过程属性公然,经由过程属性公然的话还说得已往,但假如把可见性设置成Public的,如许做就无可制止的损坏了范例封装性的准绳,而这一做法也是我们在.NET下开辟相称愿意做的,出格是关于初度打仗.NET的开辟职员,完成会见另外一范例中成员的话开始想到的就是把该成员的可见性设置为Public,固然如许做算不上是毛病,但把这一做法作为本人的主要灵感,最少从面向工具的角度动身明显是分歧适的。
在.NET下,还为我们供应了别的一种壮大的机制来完成窗体通讯,这就是托付。托付可了解为一品种型平安的函数指针,.NET下的事务的完成都是以托付做为基本的。关于托付在这篇文章中我就不具体先容了,后边会有文章专门先容这一观点。在此我演示经由过程在一个窗体里向别的一个窗体里的ListBox控件增加Item项来讲明这一办法。因而必要两个窗体,一个MainFrm窗体,一个ChildFrm窗体,别的还必要一个Middle类,作为MainFrm和ChildFrm之间通讯的桥梁。我也将给出VB.NET和C#两种言语的代码,以便人人能够做一下对照。
起首是MainFrm窗体,在MainFrm窗体中,拖一个ListBox控件便可,MainFrm.vb的代码以下(为复杂起见,在此省往主动天生的代码):
PublicClassForm3
PrivateSubForm3_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
AddHandlerMiddle.SendMessage,AddressOfDoMethod
EndSub
PrivateSubDoMethod(ByValgetstrAsString)
Me.ListBox1.Items.Add(getstr)
EndSub
EndClass
再看ChildFrm窗体,在个中拖一个TextBox和一个Button控件,经由过程在TextBox中输出值后,按Button按钮向MainFrm窗体的ListBox控件中增加Item项。
PublicClassForm2
PrivateSubButton1_Click_1(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
Middle.DoSendMessage(TextBox1.Text)
TextBox1.Text=""
TextBox1.Focus()
EndSub
EndClass
最初看Middle类:
PublicClassMiddle
PublicSharedEventSendMessage(ByValstrAsString)
PublicSharedSubDoSendMessage(ByValstrAsString)
RaiseEventSendMessage(str)
EndSub
EndClass
为了更好的演示MainFrm和ChildFrm之间的自力性,修正一下Application.Designer.vb的代码:
<Global.System.Diagnostics.DebuggerStepThroughAttribute()>
ProtectedOverridesSubOnCreateMainForm()
Me.MainForm=Global.WindowsApplication3.MainFrm
ChildFrm.show()
EndSub
好了,代码完了,是否是很复杂?经由过程下面的代码能够看出来,经由过程Middle类,MainFrm和ChildFrm都和Middle类通讯,它们之间除参数的耦合外,已不再援用相互的外部成员,如许就显得加倍自力了。
上面是对应的C#代码,MainFrm.cs:
publicpartialclassMainFrm:Form
{
privatevoidMainFrm_Load(objectsender,EventArgse)
{
Middle.sendEvent+=newMiddle.SendMessage(this.DoMethod);
}
publicvoidDoMethod(stringgetstr)
{
listBox1.Items.Add(getstr);
}
}
ChildFrm.cs:
publicpartialclassChildFrm:Form
{
publicChildFrm()
{
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
Middle.DoSendMessage(this.textBox1.Text);
textBox1.Text="";
textBox1.Focus();
}
}
Middle.cs:
publicstaticclassMiddle
{
publicdelegatevoidSendMessage(stringstr);
publicstaticeventSendMessagesendEvent;
publicstaticvoidDoSendMessage(stringstr)
{
sendEvent(str);
}
}
一样我们修正一下Program.cs的代码:
staticclassProgram
{
[STAThread]
staticvoidMain()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(newForm1());
Form1mainFrm=newForm1();
childFrmsecondFrm=newchildFrm();
secondFrm.Show();
Application.Run(mainFrm);
}
}
对照下面的VB.NET和C#代码,我们能够看出VB.NET同意间接用Event关头字声明事务,而C#则必需由我们本人起首声明事务的托付原型,然后再基于该托付声明事务,从这点看来VB.NET显得更简便,实在VB.NET编译器在面前会主动的为我们界说一个托付工具,并且该托付与C#代码声明的托付所天生IL代码是一样的,这点人人能够经由过程Ildasm两头代码检察器来检察一下。激发事务,VB.NET是经由过程RaiseEvent关头字加上事务称号,而C#则是经由过程间接利用事务称号;最初是绑定事务的代码,VB.NET是经由过程AddHandler关头字,C#经由过程重载的+=操纵符,关于以上两点,编译器一样会为我们天生分歧的IL代码。
固然,下面的例子对照复杂,不外我们完整能够经由过程托付完成庞大的窗体通讯,好比能够传送庞大的数据范例,同时,能够在计划布局加倍优秀的两头通讯类。但也要提示人人,不要动不动就要用托付,它会增添程序的庞大性,应当依据本人的需求思索用何种办法。可怜的程序员,还是逃不出移植的命运! |
|