当前位置: 首页 > 图文教程 > 开发语言 > VC++ > Visual Basic .NET 中多 Windows 窗体的同步

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 Visual Basic .NET 中多 Windows 窗体的同步


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 109 ::
收藏到网摘: n/a

Advanced Basics 专栏...

Visual Basic .NET中多 Windows 窗体的同步


原著:Ken Spencer

翻译:小刀人



原文出处:MSDN Magazine April 2004 (Advance Basics)

原代码下载:AdvancedBasics0404.exe(135KB)

我用单个窗体的多实例构建一个 Windows 窗体应用程序。我想把它写成 这样一个程序:对该窗体任何一个实例的操作都会在所有其它实例上反映出来。我该怎么做?

这是一个有趣的问题。我保证某些聪明的编程好手会建议我使用委托。在这种事情发生之前,让我们 先探究一下这个问题的几种解决方案。
  假定我有两个窗体,每个窗体都有两个 textbox 控件:txt1stData 和 txt2ndData。我怎样才能保持这两个窗体中的控件同步呢?对于我们讨论的问题来说,有两个或十个窗体都不重要,问题是相同的。
  第一个办法相对简单。事实上,它甚至比我们直接使用委托更为简单,我想委托有时会给人用牛刀杀鸡的感觉。首先,我建立一个类它包含我希望与应用程序中的所有窗体共享的属性(参见 Figure 1)。例如,MyData 和 MoreData 拥有每个窗体都能显示的数据。我将很快回到这个类来。
  第二,正如我早先提到的我用相同的控件(txt1stData 和 txt2ndData)建立了两个窗体。你可以参考 Figure 2 的布局。两个窗体都有完全相同的数据,并且我将很快解释为什么。


Figure 2 窗体布局

下面,我建立一个名为 modGeneral 的模块并加入下面一行代码:

Friend DataStuff As DataClass 
  这一行代码为我的新类 DataClass 创建了一个友元变量,使你可以完全访问程序集,对这个简单例子来说,也就是指完整的应用程序。然后我添加了下面的代码到 Form1 的 Load 事件:
DataStuff = New DataClass Me.txt1stData.DataBindings.Add("Text", DataStuff, "MyData") Me.txt2ndData.DataBindings.Add("Text", DataStuff, "MoreData") 
  第一行建立一个 DataClass 新实例。下面两行代码将数据绑定到 textbox 控件。对这个窗体而言,就这么些操作!
  现在,你怎样让它们与 Form2 和其它窗体上的数据同步呢?将下面两行加入到 Form 2 的窗体load 事件中去:
Me.txt1stData.DataBindings.Add("Text",DataStuff, "MyData") Me.txt2ndData.DataBindings.Add("Text",DataStuff, "Moredata") 
  这个方法容易确保所有窗体上的几乎任何类型的数据处于同步状态。你可以简单地将控件绑定到某个类的相同实例上,这就行了。
  现在来看另一个方法。我创建了一个名为 frmBase 的新窗体。这时我在上面放一个 textbox (txtNextData)和 label。我想 让应用程序的每个窗体都共享这个 textbox 和 label,并且我希望它们互相之间保持同步,于是我重建这个工程。通过从新的 frmBase 中的继承 ,我创建了 Form1 和Form2,因此它们继承了所有新的控件。但是我怎样能保持这些控件同步呢?这时必须写一点代码去达到此效果,这些代码在单个的类中,通过简单地调用一个函数而被复用。
  Figure 3 中的代码展示了这个称为 modGeneral 模块。它的第一个任务是定义两个变量:MyForms 和 localNextData。MyForms 是一个 集合,它将包含我想要同步的窗体列表。localNextData变量将储存所有我想要在窗体里显示的数据。注意这些变量可以驻留于某个类中而不是某个模块里。
  AddForm 过程来自 modGeneral,带一个窗体实例参数,并将其加入 MyForms 集合中。我将在UpdateControlsNextData 过程中使用这个 集合以决定哪些窗体要更新。AddForm 也调用UpdateControlsNextData 来确保一个新窗体是用正确的数据更新的。
  modGeneral 中的其它代码是 NextData 属性。这些属性的 set 存取器更新 localNextData 并也调用 UpdateControlsNextData 去同步所有窗体。这时所有我需要做的是 在想要改变它时设置 NextData,通过调用 UpdateControlsNextData,所有窗体将被更新。
  第三个方法是定制链接,它是第二个方法的精华版。我创建它以获得多一些窗体控件处理的灵活性。例如,我只想跟踪和处理某些窗体,这些窗体包含必须同步的控件。这个方法 还可以让我自己