4.2 多页面界面 多页面界面是一种非常友好的界面形式。它由一个窗体和多个页面组成, 关于每个页面的信息列在窗体底部的标签(Tabs)上,用户可通过选择标签来进行页面切换。 每次只有一个页面显示在窗体中。MPI较MDI使用更为方便,且切换速度更快。本章例程就是多页面界面的例子。另外Delphi集成开发环境中的代码编辑(Code Editor)窗体是MPI应用在文本编辑中的实例。在MPI中,一个窗体内的多个文件可以方便地进行切换和交换数据。 多页面界面分为静态MPI和动态MPI两种形式。静态MPI的标签数量固定,用户在事先设计好的多个页面上进行切换。象选择对话框(Option Dialog)就属于静MPI。动态MPI的标签数量不固定,由程序根据需要动态的产生或消除,象代码编辑窗体就是动态MPI,程序可根据用户的需要产生多个文本页面,也可以动态地关闭页面。利用Delphi的TNotebook和Ttabset 可十分方便地设计静态MPI。设计动态MPI则需要编写专门的代码。 4.2.1 静态多页面界面 TNotebook,TTabSet可用来开发静态多页面界面。TNotebook部件能显示多页, 每页都有相应的控制。通常TNotebook与TTabset配合进行控制。TTabset 有一组水平的标签,每个标签可通过创建字符串列表进行某种控制。 MPIEDit例程中的主窗体中有一个TNotebook 部件和 TTabSet 部件。 把两个部件的Aglin属性设置成bsTop和bsBotton,使它们分别处在窗体的上下两部分。为了使TTabSet与TNotebook配合工作,使用下代码: TabSet1.Tabs := Notebook1.Page; 另外,在TabSet的OnClick事件中定义下如下代码,可使用户在选择标签时开打相应的页。 procedure TEditForm.TabSetClick(Sender : TObject);… beginNotebook1.PageIndex := TabSet1.TabIndex; … end; 设计静态MPI时,可在部件窗体(Component Palette)的WIN3。1页面中选中TNotebook 部件,然后在Object inspector窗体中双击TNotebook的Pages属性,Dephi 将弹出对话框,用户可以在此确定Notebook的页数和字符串列表,如图4.6。关闭对话框后, 可对每一页进行设计,使用鼠标右按钮弹出快速菜单进行页面切换。 4.2.2 动态多页面界面 使用Delphi进行静态MPI设计非常简单,进行动态MPI设计则需编写专门的代码。 对 于一个多页面文本编辑器,应能实现以下功能: ● 动态生成页面,每个页面均能进行文本编辑 ● 动态关闭页面,直到窗体中只有一个页面为止 ● 页面切换不影响各种文本编辑操作 为了实现以上功能,程序中使用了动态页面类(TDynaPage),其定义如下: type TDynaPage = Class(TObject); 该类可根据需要动态的产生页面, 每个页面上创建了可进行文本编辑的TMeno部件。 procedure... puclicCurPage : integer; FileList : TSringList; end; CurPage表示当前用户选择的页面数,用户切换、增加、删除页面均影响CurPage 的值,CurPage初如化为零页。FileList存放打开或创建文件的名字以及与这些文件相关的编辑部件TMemo,页面动态创建、删除将影响FilstList的值。 TNotebook部件创建后至少有一个页面,因此Pages属性不是空值,只要往Pages中加入字符串,Delphi自动地把该字符串与TPage类对象相联系。TPage类是TCustomEdit派生出来的,在对象浏览器(Object Browse)中可观察到TPage的数据成员和方法。静态生成的页面也是 TPage类。 要创建多页面编辑器,必须从TPage的父件(Parent属件)创建相应编辑部件。但在动态创建页面时,TPage只是一个与字符串相联系的TObject类,不能写成: MemoParent := Notebook1.Pages.Object[ ]; 在Delphi中,宣称对象和创建对象都是用指针来标识, 因此可用无类型指针进行指针传递。 var Pi : Pointer; begin Pi := Notebook1.Pages.Object[]; Memo.Parent := Pi; end; 这样就可在TPage上动态创建编辑部件了。 往Notebook1中动态生成页面时,页面应所相应的切换,TDynaPage. Notebook1.Tabset1有关的属性要作相应的调整。 TDynaPage的DynaAdd方法定义如下: procedure TDynaPage.DynaAdd(Sender:TNotebook;FileName:String); var Pi:Pointer; Memo:TMemo; begin Sender.Pages.add(FileName); Pi:= Sender.Pages.Objects[Sender.Pages.Count-1]; DynaMemo(pi); DynaPage.FileList.addObject(FileName,Memo1); EditForm.TabSet1.Tabs := Sender.Pages; EditForm.Tabset1.TabIndex:=Sender.Pages.Count-1; EditForm.Notebook1.PageIndex := EditForm.Tabset1.TabIndex; DynaPage.CurPage:= Sender.Pages.Count-1; end; procedure DynaMemo(Pi:Pointer); var Memo:TMemo; begin Memo:=TMemo.Create(Pi); Memo.Parent:=Pi; Memo.Align:=alClient; Memo.borderStyle:=bsNone; Memo.HideSelection:=False; Memo1:=Memo; end; procedure TDynaPage.Del(Sender:TNotebook;No:integer); var Pi:pointer; begin Sender.Pages.delete(No); EditForm.TabSet1.Tabs.delete(No); Filelist.Delete(No); DynaPage.CurPage:=EditForm.TabSet1.TabIndex; Sender.PageIndex := EditForm.Tabset1.TabIndex; Pi:=FileList.Objects[DynaPage.CurPage]; Memo1:=Pi; EditForm.Caption:=Sender.Pages.Strings[DynaPage.CurPage]; end;  
2/2 首页 上一页 1 2 |