第6章多文档界面设计6.1组件6.2父窗体的设计6.3子窗体的设计6.4关于窗体设计6.5编写程序代码6.6编译运行程序6.7小结习题六6.1组件使用的组件主要有以下几个:(1)主菜单栏:用于执行相关操作的命令,在主窗体上使用。(2)工具栏:用于执行常用操作的命令,在主窗体上使用。(3)状态栏:用于显示应用程序执行的状态。(4)TImageList组件:用于修饰菜单和工具栏,把它们设计成图标菜单和图标工具栏。(5)对话框组件:用于特定的目的对话框,包括保存文件对话框、打开文件对话框、颜色对话框和字体对话框等。(6)弹出式菜单:用于在TRichEdit组件中单击鼠标右键。(7)TRichEdit组件:用于编辑文本。(8)TActionList组件:用于关联菜单和工具栏,以尽量达到少编写代码的目的。(9)TTimer组件:用于在状态栏显示系统时间。6.2父窗体的设计新建一个项目,将Form1设置为父窗体,即默认时为主窗体。当运行时此窗体需要最大化显示,下面讲述设置主窗体的属性。6.2.1窗体Form1属性设置窗体Form1属性的主要设置如下:(1)Caption属性:设置标题名为“多文档程序”。(2)FormStyle属性:属性值设置为fsMDIForm。这是设置父窗体的重要一步。(3)Icon属性:设置标题栏最左侧的图标。单击Icon属性选项左侧的按钮,可以从计算机*.Ico格式的图标中选择一个合适的图标。(4)WindowState属性:属性值设置为wsMaximized,当启动应用程序时,主窗体以最大化形式显示在屏幕中。6.2.2菜单的设计双击工具面板上的“TMainMenu”组件,在窗体中显示主菜单的图标,双击该图标,打开菜单设计器,在菜单设计器中设计菜单。菜单设计器如图6.2.1所示。其中,编辑菜单、格式菜单和窗口菜单在其子窗体中设计成动态菜单,即菜单的合并。图6.2.1菜单设计器设计复选菜单时,在“查看”下拉菜单中,有两个菜单项,即工具栏和状态栏。若“工具栏”菜单项为选中“工具栏”状态,则显示工具栏;若“工具栏”菜单项为未选中“工具栏”状态,则不显示工具栏。最后设计添加TImageList组件,并设置图标,此组件支持的格式有*.Ico和*.bmp。把图标添加到菜单中。注意:设计菜单时最好把热键和快捷键也设计在内。6.2.3工具栏的设计添加TCoolBar工具栏,其作用是作为容器存放TToolBar工具栏。然后再添加两个TToolBar工具栏,一个用于设计常用工具栏,一个用于设计格式工具栏。1.ToolBar1常用工具栏设计在常用工具栏中,有“新建”、“打开”、“保存”、“剪切”、“复制”和“粘贴”按钮。(1)用鼠标右键单击ToolBar1工具栏,在弹出的快捷菜单中选择“NewButton”命令,即可创建按钮。(2)设置ToolBar1工具栏和ImageList1组件关联。2.ToolBar2格式工具栏设计在格式工具栏中,有“粗体”、“斜体”、“下画线”、“左对齐”、“居中对齐”和“右对齐”按钮。(1)用鼠标右键单击ToolBar2工具栏,在弹出的快捷菜单中选择“NewButton”命令,即可创建按钮。(2)工具栏复选按钮设计。其中有加粗、倾斜和下画线按钮要设置为复选按钮。设置这组按钮时,Style属性值为tbsCheck。(3)工具栏单选按钮设计。其中有左对齐、居中对齐和右对齐按钮组,设计单选按钮要设置的属性有Grouped属性和Style属性。如果全选需要设置单选按钮的按钮组,设置这组按钮的Grouped属性值为true,Style属性值为tbsCheck。工具栏的设置如图6.2.2所示。图6.2.2工具栏的设置6.2.4状态栏的设计添加状态栏并划分为4个区域,其作用分别如下:第一个区域:用于设置指向按钮的提示信息。第二个区域:用于设置打开的或者保存后的文件是否被修改。第三个区域:用于显示系统的日期时间。第四个区域:用于显示“欢迎使用多文档程序”语句。6.3子窗体的设计设计子窗体,首先新建一个窗体,选择“New”→“VCLForm”命令,即可创建第二个窗体Form2。6.3.1窗体Form2属性设置窗体Form2属性设置如下:(1)FormStyle属性:属性值设置为fsMDIChild。(2)Icon属性:用于设置子窗体标题栏左侧的图标。(3)Caption属性:设置为空,可以在打开此窗体时命名。(4)设置Form2在应用程序启动时不自动启动,选择“Project”→“Options”命令,弹出“ProjectOptionsforProject1.exe”对话框,将“Auto-createforms”列表框中的Form2移到“Availableforms”列表框中,即可实现启动应用程序时不启动Form2,如图6.3.1所示。图6.3.1“ProjectOptionsforProject1.exe”对话框6.3.2Form2菜单设计添加主菜单组件,添加菜单项“编辑”、“格式”和“窗口”,设计主菜单如图6.3.2所示。图6.3.2Form2主菜单1.菜单合并技术菜单合并技术是指在主窗体的主菜单不隐藏的基础上直接插入子窗体的主菜单,也可以替换部分或者全部主菜单。一般地,不但主窗体上有主菜单,而且子窗体上也自带主菜单。当子窗体获得焦点时,需要合并整个应用程序的主菜单和子窗体的主菜单。如果直接运行以上程序,当子窗体获得焦点时,主窗体的主菜单消失,此位置显示子窗体的主菜单,如图6.3.3所示。菜单的合并主要是设置菜单项的GroupIndex属性,默认值为0。若不同窗体的菜单的GroupIndex属性值相同,子窗体未被激活时,则显示主窗体的主菜单;如果子窗体被激活,则显示子窗体的主菜单,而不显示主窗体的主菜单。如果使两个窗体的主菜单都显示,则只设置子窗体的GroupIndex属性即可。图6.3.3子窗体的主菜单GroupIndex属性值越小,菜单的位置越靠左。主窗体的主菜单中有“文件”、“查看”、“帮助”;子窗体的主菜单中有“编辑”、“格式”、“窗口”。若设计子窗体获得焦点时显示的菜单为“文件”、“编辑”、“查看”、“格式”、“窗口”、“帮助”,则应设置主窗体中“文件”的GroupIndex属性值为1,“查看”的GroupIndex属性值为3,“帮助”的GroupIndex属性值为6;设置子窗体中“编辑”的GroupIndex属性值为2,“格式”的GroupIndex属性值为4,“窗口”的GroupIndex属性值为5。设置完毕,单击“运行”按钮,运行界面如图6.3.4所示。2.菜单覆盖技术有时需要用到菜单覆盖技术,与菜单合并技术原理相似。当GroupIndex属性值相同时即可覆盖,如果主窗体中主菜单的“文件”的GroupIndex属性值为1,则子窗体中主菜单“编辑”的GroupIndex属性值也为1。运行程序即可完成子窗体的主菜单“编辑”覆盖主窗体的主菜单“文件”。图6.3.4运行界面6.3.3TRichEdit组件添加TRichEdit组件,用于编辑文本,它是子窗体中占用面积最大的一个组件。TRichEdit组件属性如下:(1)Align属性:设置此属性值为alClient,使该组件充满菜单以外的剩余空间。(2)ScrollBar属性:设置此属性值为ssBoth,当文字到达右边界或底边界时,出现水平滚动条或垂直滚动条。6.3.4TPopupMenu组件添加弹出式菜单,并设计复制、剪切、粘贴、全选菜单,如图6.3.5所示。6.3.5TActionList组件添加TActionList组件并设置复制、粘贴、剪切、全选选项。将ActionList1组件和PopupMenu1组件关联并将ActionList1组件和MainMenu1组件关联。将RichEdit1的PopupMenu属性值设置为PopupMenu1。当运行程序时,单击鼠标右键即可弹出快捷菜单。图6.3.5弹出式菜单设计6.4关于窗体设计新建窗体Form3,此窗体只是版本声明之类的对话框,只需要设置属性值。1.窗体Form3属性设置(1)Caption属性:其属性值设置为“关于多文档程序”。(2)BorderStryle属性:其属性值设置为bsDialog。(3)Position属性:其属性值设置为poDesktopCenter。2.TImage组件添加TImage组件,默认名为Image1,选择Image1属性选项卡中的picture属性,添加一幅具有一定意义的图片。3.TLabel组件添加组件并设置组件的属性。(1)Caption属性:其属性值设置为“多文档程序1.0版,版权所有(c)拷贝必纠”。(2)AutoSize属性:其属性值设置为false。(3)WordWrap属性:其属性值设置为true。4.TButton组件添加组件并设置按钮的属性。(1)Caption属性:其属性值设置为确定。(2)Default属性:其属性值设置为true。按钮中的程序代码如下:procedureTForm3.Button1Click(Sender:TObject);beginclose;end;设置后的界面如图6.4.1所示。图6.4.1关于多文档程序设计界面6.5编写程序代码界面设计已经完成,下一步是编写程序代码。6.5.1主窗体的工具栏添加工具栏中按钮的程序代码。1.“新建”按钮程序代码(1)完成新建一个子窗体功能,双击“新建”按钮,添加程序代码如下:procedureTForm1.ToolButton1Click(Sender:TObject);begin//由于应用程序未完成自动生成窗体Form2form2:=tform2.Create(application);form2.Show;//子窗体的标题名form2.Caption:=‘文档’+inttostr(mdichildcount);end;(2)当鼠标指向“新建”按钮时,在状态栏第一个区域中提示“新建”,完成此功能,其事件和程序代码如下:procedureTForm1.ToolButton1MouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);Begin//StatusBar1.Panels[0]指向状态栏的第一区域StatusBar1.Panels[0].Text:=‘新建’end;2.“打开”按钮程序代码(1)添加组件TOpenDialog,并双击“打开”按钮,添加程序代码如下:procedureTForm1.ToolButton2Click(Sender:TObject);begin//判断子窗体是否打开ifmdichildcount=0thenToolButton1.Click;ifOpenDialog1.Executethenbeginform2.RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);//打开的文件路径赋值给变量filepath:=OpenDialog1.FileName;endelse;end;其中,单击“保存”按钮时,要考虑保存路径。所以设置单元变量filepath代码如下:implementationusesUnit2;usesUnit3;var//保存路径filepath:string;(2)当鼠标指向“打开”按钮时,在状态栏第一个区域中提示“打开”,完成此功能,其事件和程序代码如下:procedureTForm1.ToolButton2MouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);begin//状态栏的提示标记信息为打开StatusBar1.Panels[0].Text:=‘打开’;end;3.“保存”按钮程序代码(1)添加组件TSaveDialog,“保存”按钮程序代码的功能是当用户打开文件时,单击此按钮自动保存到原文件中;当用户新建文件时,单击“保存”按钮,弹出“保存”对话