|
事实上它是Broland公司开发的一套FrameWork soft10/tvision-0.6.tar.gz 该连接是详细说明。 电脑技术信息 Computer Technology Information 1999年 第10期 No.10 1999 -------------------------------------------------------------------------------- Turbo Vision编程中视图通讯问题初探 李振海 摘 要 本文探讨了Turbo Vision中视图间的数据通讯问题,并对Turbo Vision的事件机制做了简要介绍。 关键词 Turbo Vision 视图 数据通讯 1. 引言 Turbo Vision是一个完整的面向对象的函数库,它提供给用户一个窗口式的、面向对象的程序框架。Turbo Vision的两项主要内容是内置的窗口支持和事件处理,前者包括一系列有用的视图(菜单、对话框等),后者提供了事件驱动程序的设计方法,本文主要对用Turbo Vision进行事件驱动程序设计中视图间的通讯问题谈几点看法。 2. Turbo Vision的事件机制 事件是一个记录,它的核心是一个称作“What”的字类型域。What域的数字值描述事件的种类,事件记录的其它部分保存着有关该事件的特别的信息:击键事件的键扫描码,鼠标事件的位置信息和鼠标器按钮状态信息。事件有四种:鼠标事件(evMouse)、击键事件(ev-Key Down)、消息事件(evBroad Cast)、“空”事件(ev-Nothing)。每类事件都定义一掩码,对象能迅速判定发生的事件属于一般事件中的哪一类,例如判断一事件是否鼠标事件只须用下面一条语句,而不必依次判断是哪一种鼠标事件。 if Event.What and evMouse <> o then… TApplication对象的Run方法通过对TGroup.Execute方法的调用,实现对事件的寻找、检查并建立事件记录,然后由Handle Event方法把事件传送到合适视图,事件的传递途径有三种:位置、聚焦点和“广播”事件。位置事件对应鼠标事件、聚焦事件对应击键事件或命令事件 (evCommand)、广播事件是“广播节目”(evBroadcast)或用户自定义的消息,视图间正是通过广播事件进行通讯的。 最后,大多数事件都以被转换成某种命令而结束,对位置事件和聚焦事件来说,对象通常产生一个命令以响应按鼠标键或击键操作,这是通过对Handle Event方法的调用来实现的。 3.视图间的通讯 Turbo Vision中的视图都是数据被封装起来的对象,它们间的数据传递问题,成为用Turbo Vision进行事件驱动设计中的难点。 视图之间是通过广播事件进行通讯的,通过下面一个程序,可以了解视图间是怎样进行通讯的。StdDlg单元包含一个TFileDialog会话框。视图TFile Dialog有一个TFile List子视图用来显示磁盘目录,在磁盘目录上方还有一个File Input Line子视图显示当前选取的要加载的文件名。每次用户在File List中选取另外一个文件时,FileList通知FileInputLine显示相应的文件名。 例:procedure TFileList.FocusItem(Item:Integer); var Event:TEvent; begin TSortedlistBox.FocusItem(Item); Message(Top View,evBroadeast,cmFileFocused,list^.At(Item); end; procedure TFileInputLine.HandeEvent(var Event:TEvenent); var Name:NameSty; begin IInputLine.HandleEvext(Event); if(Event.What=evBroadcast)and(Event.Command=cmFileFocused)and(State and sfSelected=0)then begin if PSearchRec(Event.Infoptr)^.Attr and Directong <> 0 then Data^:=PSeachRec(Event.InfoPtr)^.Name+ '\’+ PFileDialog(Owner)^.WcldCord else Date^:=PSearch(Event.InfoPtr)^.Name; Draw View end; end; 首先,TFileList通过继承来的方法FocusItem(Item)把Focused域置为Item,使给定的项聚焦,即所选的文件被聚焦,然后调用Message方法,创建一个命令事件,采用广播事件的方式,将cmFile Focused命令和内容List^.At(Item)发送出去,调用物主视图Top-View 的HandleEvent方法(此时为TFile Dialog)对此事件进行处理。TFile Dialog 得到cmFileFocused 命令后,本身无法处理该命令,就把它传给各个子视图(包括TFileInputLine), TFileInputLine得到 cmFile Focused 命令后,调用其 Handle Event处理该命令。将内容 List^.At(Item)写入输入行中。 程序中可以利用上面的通讯方式来查寻是否已经打开一个指定窗口,只需发送一条广播消息: Are You There:=Message(Desk Top,evBroadcast,cmFindWindow,nil);在指定窗口的Handle Event 方法中加一条判断语句消除该事件以响应cm FindWindow命令。 case Event.Command of … cm Find Window:Clear Event(Event); … end; 该窗口若已经打开,则把事件记录的What域置为evNothing,并把事件记录的 IntoPtr域置成 @Slef.Message方法读进这些域,并返回一个指向处理该消息事件的对象的指针。可以接着发送广播事件的代码段,加入: if Are You There=nil then CreatWatchWindow {} else Are You There^.Select; 这样,若指定窗口已打开,就把它拉到前面来;否则就创建一个指定窗口。 利用上面所说的通讯方法,用户可以在应用程序中建立一个上下文敏感的求助系统。 4.结束语 上面简要介绍了Turbo Vision的视图间通讯的一般方法。通过用Turbo Vision编程,不仅可以提高自己面向对象的编程能力,而且对事件驱动程序的设计方法也有了一些了解,其中的细节问题还需大家在实际编程中体会。 作者单位:深圳市红岭中学(深圳518028) 参考文献 [1]《Turbo pascal面向对象程序设计技术与工具》,南京大学出版社,1996。
|