310 likes | 504 Views
Keep on walking. 《Delphi 程序设计 》 工学结合特色精品课程. —— 杨丽敬. 菜单 PopMenu 弹出式菜单 ToolBar 工具栏 StatusBar 状态栏 消息框与输入框. * windows 通用对话框 建立 MDI 应用程序 Screen 变量 Application 变量 可视化编程问题补充. Chap4 菜单、工具栏和对话框. 菜单(一). 菜单设计器(用 caption= 减号 ‘‘ - ’’ 可分割菜单项和 ctrl+→ 添加多级菜单等的应用 ) 菜单项的状态见例 4-2
E N D
Keep on walking 《Delphi程序设计》工学结合特色精品课程 ——杨丽敬
菜单 PopMenu弹出式菜单 ToolBar工具栏 StatusBar状态栏 消息框与输入框 *windows通用对话框 建立MDI应用程序 Screen变量 Application变量 可视化编程问题补充 Chap4 菜单、工具栏和对话框
菜单(一) • 菜单设计器(用caption=减号 ‘‘-’’可分割菜单项和ctrl+→添加多级菜单等的应用) • 菜单项的状态见例4-2 • 命令菜单项:一般与actionlist结合使用 • 复选菜单项:checked属性 • 单选菜单项:radioitem属性全设为true,groupindex全设为相同的值如一项的checked属性为true则互斥。 • 对话菜单项
菜单(二) • 菜单图像与ImageList组件见例4-3 • mask属性为真边框不显示;imagelist属性对号入座; • ImageList中装载图像 • 菜单项与ImageList关联 • 菜单模板 • ActionList行为列表组件见例4-4 • Action行为 • ActionList编辑器 • 添加系统定义的标准行为 • 如何自定义行为 快捷键caption:名字&N 含义是:N 热键:ctrl/shift/alt等+N(其中N是某个字母) 一个菜单项可以同时拥有快捷键和热键。所谓快捷键通常只是一个字母, 而热键通常是一个组合键。另外它们的激活方式不一样,例如一个子菜 单项有一个快捷键O和一个热键Ctrl+O,那么使用热键就可以直接激活 这个子菜单项,而使用快捷键你必须首先选中该子菜单项上一层的菜单 项,然后按下快捷键才可以激活这个子菜单项。 cHotkeyPrefix 返回
Popmenu弹出式菜单 • 在某组件上单击鼠标右键,会显示一个PopMenu,即弹出式菜单。PopMenu必须与该组件相关联。方法是将PopMenu作为该组件的PopMenu属性值。 • 具体步骤是: 添加组件 为ActionList添加系统功能 使用Action属性创建菜单项 见例4-5 返回
工具栏 • ToolBar (win32页)是一个功能完善的工具栏组件,它带有自己的按钮ToolButton,并可将按钮设计成多种风格 • 创建ToolBar的按钮ToolButton • ToolButton的style属性决定其功能: tbsButton标准按钮 tbsCheck具有复选功能 tbsDropDown下拉菜单 tbsDivider分隔符有竖线 tbsSeparator分隔符 • ToolBar上添加其他组件 • 在ToolBar上可添加一些常用组件,如SpinEdit、ComboBox等,其使用方法与在窗体上使用的方法相同。 • Coolbar (win32页)可以容纳多个toolbar
实例解析 • 本例将对上一讲中的界面进行优化。见例4-6 • 界面的变化:工具栏的改进; • 字体的实际应用。 • 应用组件:mainmenu、popupmenu、imagelist、actionlist、spinedit、combobox、RichEdit、ToolBar(ToolButton) • 重要属性(property):RichEdit1.SelAttributes\Font \ReadOnly、Screen.Fonts、N27.Checked • 重要事件: FormCreate、 ComboBox1Change、 • SpinEdit1Change、 返回
状态栏 • StatusBar(win 32页)状态栏主要用来显示用户当前所选菜单项的有关信息及程序状态的信息,其主要属性有: • SimplePanel属性 • 决定StatusBar的两种结构: • 单面(True)并显示(simpletext)、多面板(False) • Panel属性 Add New(新增子项值是text) Delect Selected Move Selected Up Move Selected Down
实例解析 • Panel属性是TStatusPanels类型,可用panels[i]引用每个子面板设置其属性。见例4-7 • 重要的系统函数: datetimetostr(now)、 inttostr • 重要属性:richedit.caretpos.y\RichEDit1.Modified • 重要事件:RichEdit1SelectionChange • 如: • 显示系统时间 • panels[3].text:=‘日期:时间’+datetimetostr(now); • 显示当前光标位置 • StatusBar1. panels[0].text:=‘位置:’+inttostr(richedit.caretpos.y+1)+‘行’+ inttostr( richedit.caretpos.x+1 )+‘列’; • 修改当前状态 • if RichEDit1.Modified then • StatusBar1.Panels[1].Text:='当前状态 '+'修改'; caret脱字符号( ^ 文章中插字使用) 数据库操作 返回
实验八、主界面的设计 • 实验内容: • 完成一个文本编辑器 • 实验要求: • 含有菜单项、工具栏、状态栏等
消息框与输入框 • 消息框与信息函数 Show message(显示一个简单的信息对话框) 调用格式: Precedure showmessage (const Msg: string); 如:showmessage (‘当前字体:’+richedit1.selattributes.name); MessageDlg(定制一个对话框) 调用格式: Function MessageDlg (const Msg: string;DlgType: TMsgDlgType;aButtons:TMsgDlgButtons;HelpCtx:Longint) :Integer; Msg为显示信息,DlgType指定对话框 aButtons按钮类型TMsgDlgButtons的集合注意要用“[]”。HelpCtx是帮助系统的context ID,当消息对话框显示时,如果用户按下F1键寻求帮助,就会根据这个整数值找到相应的帮助信息。
输入框与输入函数 Inputbox见例4_8 调用格式: Function inputbox(constAcaption ,Aprompt ,Adefault: string) :string; Acaption输入框的标题 Aprompt 输入提示 Adefault输入默认值 Var Loginname:string; Loginname:=Inputbox(‘登录’,‘请输入用户名’,‘users’); InputQuery 调用格式: Function inputQuery( const Acaption , Aprompt : string ; var Value : string) : Boolean; 与Inputbox的不同之处:用户单击ok时,输入框内的字符串赋给变量参数value,函数返回true;单击cancel按钮,value值保持与调用前相同,并返回false. If InputQuery(‘更改用户’,‘新的用户名’,userstr) Then… 返回
Windows通用对话框 • OpenDialog与SaveDialog(Dialogs页) • 见example10_3 • OpenDialog的主要属性与方法 • 调用OpenDialog组件(Execute方法) • 文件类型的过滤(filters) (filterindex) • 选择多个文件\是否覆盖\.....(options→ofallowmultiselect\ofoverwriteprompt) • OpenPictureDialog与SavePictureDialog • 在此组件中可识别的图片类有:.bmp .ico .emf .wmf否则预览不出。 • FontDialog字体选择框与ColorDialog颜色选择框 • (单击确定Execute方法返回true,否则返回false) • FindDialog见例*10-2与ReplaceDialog 要查找的文字放入Findtext属性 按下“查找下一个”触发onfind事件 • PrintDialog与PrintSetupDialog
组件的通用事件 返回
建立MDI应用程序 • Windows应用程序包括SDI和MDI。 • 显示给用户的窗体有两种:模式的和无模式的(是否窗口与其它进行切换) • 他们的显示分别要用showmodal(普通窗体)和show方法来实现。 • MDI窗体包含: • 框架窗体(应用程序的主窗体)和MDI子窗体(实际的文档) • 创建子窗体 窗体类型:例4_9 fsNormal、fsMDIForm、fsMDIChild、fsStayOnTop 主窗体与子窗体(子窗体不需要show自然会出现) 窗体的自动创建方式 • 动态建立子窗体 子窗体不在启动时自动建立 动态创建子窗体 创建窗体代码: 子窗体对象:=Tformchild.create(application); 关闭子窗体代码:例非模态窗体 Onclose事件 Action:=cafree;
MDI的属性和方法 MDI的主要属性 • WindowMenu • MDIChildren • MDIChildCount // if MainForm.MDIChildren[i].Caption = 'NONAME3' then 主要方法 • Next和Previous焦点在不同窗体间切换 • Cascade重叠 • Tile 平铺 • ArrangeIcons最小化
MDI的菜单设计 合并菜单 MDI的主窗口和子窗口都可带自己的菜单、工具栏、状态栏等。程序启动后,最初只有主窗口被激活,系统显示主窗口的菜单;当创建子窗口后,系统将主窗口和子窗口的菜单合并起来显示。 建立“窗口”菜单 • 两种方式: • 建立菜单并调用方法 • 使用ActionList组件
实验十 MDI程序的生成 • 要求自己做一程序实现子窗体关闭 • 子窗体动态建立的方式 • 试想子窗体能否用show/showmodal方法 • 能否让当前打开的窗口显示在菜单的下边 • 把前两个实验作业补充完成 返回
Screen变量 • Screen变量是Forms单元中定义的一个Tscreen类型的全局变量,它控制着整个屏幕的状态,其主要属性: • DesktopHeightDesktopWidth • 当前屏幕分辨率的高度与宽度,单位为像素,integer类型 • Fonts • 存储所有系统支持的字体名,TStrings类型 • DesktopLeftDesktopTop • ActiveForm和ActiveControl • 表示在应用程序中当前活动的窗体和当前活动窗口中获得焦点的窗口控件 • Forms和FormCount • 包含应用程序所有显示的窗体及其个数 • CustomForm和CustomFormCount • 包含应用程序中所有显示的窗体和属性选项卡及其个数 返回
Application变量 • TApplication是Delphi应用程序的类型,是Delphi与Windows环境之间的接口。它封装了以下4个功能:Windows消息处理、菜单加速和键盘处理、异常处理和上下文联机帮助 • TApplication类的属性 • Active • ExeName • Handle • Icon • ShowMainForm • Title • TApplication类的常用方法 • Minimize • Restore • ProcessMessages • TApplication类的事件 • OnActive • OnDeactive • OnMinimize • OnRestore 返回
练习: • 在一个MDI程序中,若主窗体和子窗体都有菜单,则程序运行时,系统将显示谁的菜单,如何实现菜单合并? 如何判断新添加的combobox项是否含重复项?
备选试验:对话框的练习 • 实验目的:各种windows对话框的使用 • 内容: • 参照example10_3为自己的系统添加对话框; • 实现记事本程序的基本功能; • 要求:分别试用action和代码实现;
可视化编程要说明的问题 • Parent属性与Owner属性 • MDI Winzard • TStringList = class(TStrings) • 路径的问题:getcurrentdir/GetDir(0,CurDir)/extractfilepath等 • 可用于图片文件数据库等---如启动画面的制作 • 模态窗体与按钮的modelresult属性 • form2.ShowModal=mryes
组件的布局 • 布局工具 选择多个组件(按下shift再选择) 对齐组件工具Edit|size、align 调整组件大小 • Parent属性:父控件(包容器)见例窗体的嵌入 • Owner属性:指组件的所有者,他负责组件的组件的创建和释放。比如窗体上的组件的所有者就是窗体,而窗体的所有者是Application • Owner是拥有该控件的类,最后负责删除该控件 Parent该控件的父控件,该控件放在Parent控件上。 例如:一个Label的Owner一般是Form,但 Parent可能是一个Panel. • 共同点:运行阶段的属性,只能通过代码设置
Var • I:integer; • st:TStringlist; • st:=TStringList.Create; //这必须要用 TStringList • //因为TStrings并没有实际create(虚函数),要调用子类的来override(覆盖),这是多态的概念 • For I:=0 t o listbox1.count-1 do • begin • st.Add(listbox1.items[i]); • end; • ComBobox1.Items:=st;
感谢聆听! Thanks for your time!