第9章 Delphi用户接口设计详述
TObject->TPersistent->TComponent->TControl->大部分VCL组件(例外的如Ttimer父类为TComponent)
Delphi组件分两大类:父类(其对象实体可作为其他对象的容器)和普通组件(需放置在父类对象中)。父类组件必定继承自TWinControl,而普通组件则未继承TWinControl。
TForm和TLabel的继承图:
TObject
|
TPersistent
|
TComponent
|
TControl
| |
TWinControl TGraphicControl
| |
TScrollingWinControl TCustomLabel
| |
TCustomForm TLabel
|
TForm
说说TWinControl类:此类是所有窗口控制组件的基础类,它具有下列特性,只有继承了此类的组件,才会具有这些特性。
Ø 程序运行时,可接受程序的焦点。如TLabel不能通过Tab来移动到该控件。
Ø 可作为其他控制组件的父类。
Ø 拥有handle属性。
然而并非所有继承自TWinControl的控件都有以上所有属性,有些仅有以上部分属性。
二、TForm的属性
1、继承自TComponent(组件)
1)ComponentCount:只读。该组件实体内部拥有的组件数量,运行时dock(附着)到该组件实体的其他控制组件,不计入总数。如form拥有多少控件。
2)ComponentIndex:只读。指出该组件在其父类所有组件中的位置编号,以0开始。Form上有好多个控件,一般使用时,用的是form的ComponentCount属性和form子控件的componentindex属性。
3)Components定义:property Components[Index:Integer]:TComponent;
使用此属性配合ComponentIndex的属性值可操作其拥有的任意一个控件,而不必使用其其拥有的控件的name。如form1拥有label1和edit1,假设label1的componentindex为0,则有两种方式控制这俩控件:①form1.Components[0].caption②label1. caption。
4)ComponentState:只读。指出该组件当时所处的状态,此值是一个集合值。
5)Owner:只读。指出拥有它的组件,换言之,即负责析构该组件的是哪个组件。
6)Tag:读写。一个integer类型的值,由程序员自由使用。其意义如同一个全局变量。
2、由TControl继承来的属性
1)Action:参考第10章ActionList。
2)Align:读写。决定该组件在父类里如何排列。如form1的父类是整个屏幕,其Align属性决定了在桌面如何排列。
3)Anchors:读写。决定该组件以何种方式固定在它所属的父类里。Anchors属性有四个项目:akLeft、akRight、akTop、akBottom。四者分别对应到该组件的4个边,且以上四者的值为True或False。当某项目的值为true时,表示当该组件的父类改变大小时,该项目所对应的边与其父类的边的距离保持不变。Form的Anchors属性值无意义(即使改变也看不出),其他组件的Anchors有用。
4)AutoSize:若为true,则该组件的大小会随时调整为正好容纳得下内容的尺寸。
5)BiDiMode:一般默认文字显示是自左向右,若程序在由右向左模式下时,就可更改它使符合要求。
6)BoundsRect:只读。表示该组件四方外线与其父类在位置上的关系。
7)color:决定该控制组件的背景颜色。
8)Constraints:读写。决定该组件大小的限制值是什么:可设置高度最大值和最小值,宽度最大值和最小值。
9)Cursor:光标移到该组件时,光标的外观图形。
10)关于拖拽:过程是先使得某个组件支持拖拽,再选择拖拽的方式(手动还是自动),要拖拽并放置到另一个组件上时,需设置该组件使得其支持放置。
DragKind:决定该组件以正常方式拖拽时可以有附着的行为。DragKind属性值有两种:dkDrag(仅对支持拖拽的组件(如form)只做拖拽不附着)和dkDock(该组件即使不是浮动的组件(如button、label等)也可在执行中拖拽,且会附着在最后停滞的父类上)。DragMode:决定该组件开始拖拽(drag-and-drop)或拖放并附着(drag-and-dock)的操作。其值有两种:dmAutomatic(鼠标拖动该组件时,会自动开始拖拽行为的操作)和dmManual(无法直接拖拽,仅限于执行BeginDrag时,每调用一次,可拖拽一次)。DockSite:指定该组件是否可作为其他组件拖拽并附着其上的目标。
LRDockWidth:该组件以水平方式附着到父类时该组件的宽度值。
TBDockHeight:该组件以垂直方式附着到父类时该组件的高度值。
UndockWidth和UndockHeight:该组件在浮动状态下的宽度和高度。
HostDockSite:指出该组件所附着的组件是什么。若未曾有过附着(dock)的行为,即该组件在设计时就放置在父类上,则此值为nil。
FloatingDockSiteClass:指定该组件的临时父类的类型。当拖拽一个组件令他附着在某个父类前,在该组件脱离原本的父类,而尚未附着到另一个父类前,该组件处于浮动的状态。而组件无法独自浮动在窗体外,因此当组件处于浮动状态时必须有一个临时父类来收纳该组件。而该暂时父类会在该组件一脱离父类时,自动建立,供该组件附着,等该组件附着到目的地父类时,此暂时父类自动析构。
11)关于字体。Font:设置该组件上的文字属性。ParentFont:组件的font属性是否需要参照其父类的font属性。为true时,与父类相同;若更改组件的font值,则此属性自动变为false,即不再参照其父类。
12)鼠标放在某组件上时的提示文字。要允许提示(ShowHint),然后显示提示文字(Hint)。
13)PopupMenu:设置该组件的弹出式菜单。
14)ControlState:指出该组件在运行时的状态。ControlState:决定该组件的类特征,比如是否可接受鼠标点击消息。
3、由TWinControl继承的属性
1)AlignDisabled:只读。该组件是否允许其内的子组件重新布置。通过EnableAlign和DisableAlign来设置。
2)BorderWidth和Brush:组件的边的宽度;画该组件背景的画刷的颜色和花纹。
3)ControlCount:直接放置在该组件(父类)中的组件数量。只有可作父类的组件才拥有此属性。且ControlCount属性必定比起Controls属性中最大索引大1。
4)Controls:列出直接放置在该组件(父类)上的所有组件。用法同ComponentCount和Components。
5)关于附着。DockClientCount:附着在父类上的组件数量。VisibleDockClientCount:附着在父类上的可视的组件数量。DockClients:列出所有附着在父类上的组件。
6)Handle:调用需要窗口处理的Windows API时,会用到此属性。
7)关于显示帮助。HelpContext:在该组件上按下F1时,显示的内容。HelpKeyword:为组件说明文件标题的关键字。HelpType:此组件说明文件的标题由ID编号还是关键字决定。
8)关于Tab。TabOrder:在该组件父类中,对Tab反应的顺序位置。TabStop:是否可用Tab键来选择该组件。
4、由TScrollingWinControl继承来的属性
1)AutoScroll:该组件外框是否可自动产生滚动条。
2)HorzScrollBar和VertScrollBar:该父类的水平和垂直滚动条。
5、由TCustomForm继承来的属性
1)Active:只读。指出该form是否拥有程序的焦点。
2)ActiveControl:读写。决定程序焦点在该form的哪个组件上。
当程序焦点刚进入一个Form时,此Form中ActiveControl属性为True的控件接受焦点。一个Form中不会有两个组件其ActiveControl属性同时为True。当程序焦点要离开某个组件时,则在该组件的OnExit发生前,其ActiveControl属性会自动更新为False,而接受焦点的组件,其ActiveControl属性立即更新为True。
3)MDI窗体。ActiveMDIChild:指出焦点在该MDI窗体的哪个组件上。MDIChildCount:这个Form的MDI窗体的数量。MDIChildren:列出此MDI Form的所有子窗体。
4)控件透明。AlphaBlend:指出此Form(包括其子组件)的颜色是否为透明色。为True时,透明。透明程度由AlphaBlendValue决定。当AlphaBlendValue属性值不超过5时,几乎看不到。
5)设置某个颜色变为透明色。TransparentColor:该Form(包括其子组件)是否可以有一种颜色以完全透明的状态显示。TransparentColorValue:指出该Form内要显示为透明的颜色。
6)设置border外观。BorderIcons:指定显示在该Form的标题栏上的Icon。属性定义:
type TBorderIcon = (biSystemMenu, biMinimize, biMaximize, biHelp);
TborderIcons = set of TborderIcon;
属性应用:Form1.BorderIcons := [biSystemMenu, biMaximize, biHelp];
BorderStyle:指定该Form在外框上的外观和行为展现。属于TformBorderStyle类,其值有以下六种:
bsDialog:外框固定,为标准对话框。bsSingle:外框固定,但拥有标准单线外框线条。
bsNone:外框固定,无外框线条且无标题栏。bsSizeable:拥有可改变大小的外框。
bsToolWindow:和bsSingle相似,但该Form的Caption没有图示。
7)
Canvas:提供对该组件可绘图范围的处理。有些组件表面的可用范围(client area)可在其上绘图,那是一个抽象的绘图空间,此范围可视为一块画布,而Canvas属性则提供了在该组件可绘范围内绘图的行为。
Floating:只读。指出该Form是否附着到其他窗口上。一个窗口要么为浮动窗口,要么附着(dock)在其他窗口上。
FormState和FormStyle:Form当时的状态和样式。
Icon:Form标题栏的图标,此图标在Form最小化时显示。
KeyPreview:决定该Form是否可在控制组件前接受键盘消息。
如:Form1上放置多个Edit控件,让用户在Edit控件输入文字后,按“Enter”键直接让焦点进到下一个Edit,就需设置此属性为True。在FormKeyDown事件中:
if key = 13 then
Form1.Perform(WM_NEXTDLGCTL, 0, 0);
Menu:读写。决定该Form的主菜单。程序设计时,第一个放到该Form上的MainMenu组件会自动设为主菜单。若放了多个MainMenu控件,则需设置此属性。
ModalResult:读写。此值为ShowModal的返回值。此属性默认为mrNone。当调用一个form的ShowModal后,若将此值设置为任何非0值,则会立即关闭该Form。
Parent:读写。作用:当设置一个Form的Parent后,其浮动范围不能超出其父类的可用范围。
ParentBiDiMode:决定此属性是否参考父类的BiDiMode属性。
依据屏幕分辨率调整Form大小:Scaled:决定该Form大小是否依据PixelsPerInch属性所设置的值变化。PixelsPerInch:读写。此Form设计时所在系统的分辨率。
当Scaled为True时,若设置PixelsPerInch不同于系统,则会据此值重设该Form的大小。
Position:该Form的大小及其在屏幕上的位置。
WindowMenu:指定MDI父窗体的窗口菜单。
WindowState:代表该Form如何显示在屏幕上。如最大化最小化:wsMinimized和wsMaximized。
二、TForm的方法:
1、由TObject继承来的方法。
关系调查:
ClassName:以字符串形式返回该对象所属实体的类名称。
ClassNameIs:判别该对象是否属于某个类。当传入值等于ClassName的返回值则为True。
ClassParent:该对象所属类的父类。
InheritedFrom:判断两个类之间是否有继承关系。
对象销毁:
Free:释放对象实体所占内存。当对象变量的值为nil,即未建立实体时,可用Free。不要在某对象的事件区,使用自己的Free方法。如不要在Form1的OnClick中,调用该Form 的Free方法。
Destroy:与Free区别:不可对无实体变量执行Destroy。
CleanupInstance:不要直接调用,对象析构时,自动调用。
FreeInstance:不要直接调用,对象析构时,自动调用。
对象建立:
NewInstance:所有的建立方法都会自动调用NewInstance,勿直接调用。配置内存给该类的类型实体,并返回新实体的指针,内部调用InstanceSize方法。
InstanceSize:以字节大小返回该对象类每个实体所占的空间大小。
InitInstance:不要直接调用。
2、由TPersisteng继承的方法
Assign:复制另一个相似对象的内容。TForm类的这个方法必须override后再使用。
3、由TComponent继承的方法
关系调查
HasParent:是否有父类。
对象销毁
DestroyComponents:不要直接调用。销毁该对象所拥有的所有组件。
Destroying:不要直接调用。该组件及其所拥有的组件都将被销毁。
子组件更改:
InsertComponent和RemoveComponent:将某个组件加入为这个组件所有的子组件。将某个组件由该组件的Components属性值中删除。
IsComponentOf:指出该组件是否为某个接口的实现。
ExecuteAction和UpdateAction:不要直接调用。
4、由TControl继承的方法
还记得介绍属性的时候说的拖拽吗?DragMode为dmManual时这些方法就派上用场了。
BeginDrag、EndDrag、Draging(判断该组件是否处于拖拽状态)、DragDrop(出发该组件的OnDragDrop事件)。
移动组件位置:显示前后位置、附着行为、坐标更改
BringToFront:将该组件放置在它所在父类中所有组件之前。
SendToBank:把该组件放置在它所在父类中所有组件的最下层。
ClientToScreen:返回该组件内的某一坐标点在屏幕坐标上的位置。
ScreenToClient:将屏幕上的某一坐标点位置,转为该组件可用范围内的坐标位置。
ParentToClient:将该组件父类的某个坐标点位置转为该组件可用范围内的坐标位置。
Dock:勿直接调用。Dock行为的内部操作。
ManualDock:作该组件的Dock行为。
ManualFloat:令该组件解除Dock状态。
ReplaceDockedControl:让该组件附着到另一组件所附着的位置。
文字显示:显示方式(由右向左还是由左向右)、文本内容
DrawTextBiDiModeFlags:返回标志,表面当时该组件的BidiMode属性的设置。
DrawTextBiDiModeFlagsReadingOnly:指出该组件的文字是否要由由右向左读。
GetControlsAlignment:指出该组件内的文字以何种方式排列。
UseRightToLeftAlignment:文字显示由右向左。
UseRightToLeftReading:指出该组件内的文字读取时是否使用由右向左。
UseRightToLeftScrollBar:指出该组件的垂直滚动条是否出现在左边。
IsRightToLeft:指出该组件是否要倒转为由右向左。用于中东地区时有用。
GetTextBuf:取得该组件的文字,并将文字拷贝到buffer中,然后返回所拷贝的字符串的数量。
GetTextLen:返回该组件的Text属性值的长度。
SetTextBuf:设置该组件内的文字。
Perform:响应该组件是否接受了特定的Windows系统信息。Perform可以依序处理Windows的信息队列,并立刻响应信息给该组件的窗口程序。
Refresh:重画屏幕上的组件。它会调用Repaint方法。
5、由WinControl继承来的方法。
BroadCast:给窗口控件内的所有组件广播消息。传入的参数即代表要发送的消息。
ControlAtPos:返回在该组件内部某个位置上的组件。
ContainsControl:辨别某个组件是否位于该组件之内。
排序:DisableAlign、EnableAlign、ReAlign
DockDrap:触发该窗口的OnDockDrap事件
子组件位置更改:少用。尽量通过更改Parent属性值实现。
InsertControl:将某个组件加入到父类的Controls属性值之列。
RemoveControl:将某个组件由此父类的Controls属性值之列删除。
Invalidate:重画该组件。当该组件内部有两个以上的区域需重画时,Invalidate可一次重画整个窗口,可防止多次重画所引起的闪烁现象。
RePaint:重画。会调用Invalidate和Update来重画该组件。
Update:立即处理和绘图相关而未解决的信息。
UpdateControlState:勿用。显示此窗口控制组件,令其所有的父类作适当的调整。
PaintTo:将此窗口控制组件画到所指定的画布上。
ScaleBy:缩放该父类及其内组件的大小。
SetBounds:一次设置好此窗口控件的尺寸。
6、由TScrollingWinControl继承来的方法
当重新排列一个Form上的组件时,可先DisableAutoRange(停止该组件自动产生霍消除滚动条的能力)待完成其内组件排列的操作后,可使用EnableAutoRange再打开该组件自动处置滚动条的能力。
ScrollView:令滚动条自动卷至可见到该Form中某组件的位置。
7、由TCustomForm继承来的方法
Close:若程序的主窗体调用close,则会自动调用Application的Terminate方法终结整个程序。
Create和CreateNew:Create创建的窗体和原来的一样,而CreateNew是创建一个空白的。
IsShortCut:当form获得焦点时,若用户按下快捷键,会自动调用此方法。若设置了某个快捷键,则IsShortCut会执行适合的命令,并返回True;反之若该按键不属于快捷键,则返回False。
MouseWheelHandle:发送鼠标滚轮消息给合适的组件。
Replace和Destroy:最好用Free取代这两个方法。因无对象实体时报错。
Show和ShowModal:显示。以模态显示。
8、TForm新增的方法:都跟MDI有关
ArrangeIcons:布置MDI子窗体在最小化时的图标。
Next:让该Form的下一个MDI子Form成为作用中的(active)窗体。
Previous:前一个。
Title:令其内的MDI子窗体,以相同大小布满该Form的可用范围。仅对非最小化的子窗体有用。
三、TForm的事件
对事件要探究其触发的时机。
1、由TControl继承来的事件
Resize:
OnCanResize:复位操作时触发。
OnConstraintResize:OnCanResize发生后。
OnResize:该组件完成重新调整大小的操作后,立即触发。
Click:OnClick、OnDbClick
Mouse:OnMouseMove、OnMouseUp、OnMouseDown
OnContextPopup:按下右键,弹出菜单显示出来时,触发。
Dock:
OnDragDrop:当用户将拖拽中的某个对象放置在该对象范围内时,触发该对象的OnCanResize。
OnDragOver:当被拖拽的组件经过此组件范围时,触发。
OnStartDock:当用户开始拖拽该组件时,触发该组件的OnStartDock。
OnEndDock:拖拽结束时触发。
2、由TWinControl继承来的事件
Dock:
OnDockDrop:其他组件附着到该组件是触发。DockSite为True,被拖拽组件其DragKind为dkDock时才会触发此事件。
OnDockOver:经过时触发。限制条件同上。
OnUndock:当用户试着把dock到此父类内的某组件删除时,会触发此父类的OnUndock。
OnGetSiteInfo:此事件在OnDockDrop之前发生,即在暂时浮动状态下,被鼠标拖拽之时发生。
KeyBoard:OnKeyDown、OnKeyUp、OnKeyPress(按住时)
Mouse:OnMouseWheel、OnMouseWheelDown、OnMouseWheelUp
3、由TCustomForm继承来的事件
OnActivate:当该Form成为作用中的(active)窗体时触发。
OnDeactivate:Form失去焦点时触发。
显示隐藏:
一个窗体建立到显示发生的事件:OnCreate->OnShow->OnActivate->OnResize->OnPaint。
OnHide、OnDestroy
OnShortCut:按下键盘按键时触发。
四、TLable的类成员
仅介绍不同于TForm的属性。分为两类:由TGraphicControl和TCustomFormLabel继承。
由TCustomFormLabel继承来的属性
Alignment:Label组件内文字在水平方向的分布方式。
由TGraphicControl继承来的属性
Layout:Label组件内文字在垂直方向的分布方式。
AutoSize:该Label是否依其Caption文字长度自动改变其宽度。
WordWrap:该Label的Caption文字长度超过其Width时,是否会换行显示。换行需AutoSize为True。
FocusControl:指定和该Label关联的窗口控制组件。当用户按下该Label设置的快捷键时,FocusControl所指定的窗口组件,会于此时获得程序的焦点。
ShowAccelChar:决定该Label文字中的“&”如何显示。当该Label的ShowAccelChar为True时,其Caption中的“&”作为一个下划线显示。此时若希望Caption中有“&”,则需写成“&&”。而有下划线的字符就是该Label设置的快捷键。若为False,则显示“&”。
第10章标准组件介绍及其实例
1、Frames组件
若没有现成的Frames组件,需先File->New->Frame来建立一个Frame。点选Frames组件后,会打开一个对话框,列出包含的所有Frame。所选择的Frame会成为窗体上的组件。
2、MainMenu组件
Items:用来描述MainMenu菜单内的项目。
Images:列出可放在选项文字旁的图标。前提是该程序拥有ImageList组件,才能以某个ImageList组件为此MainMenu的Images属性。这些只是允许主菜单选择图标。设置Item项的图标还需选中该Item,然后设置其ImageIndex值。注意:设置图标后,快捷键的下划线会消失,但仍有用。
设置快捷键:Caption属性加入‘&’可设置快捷键。另一种方式:ShortCut属性中选择(此种方式适用于菜单以中文显示时)。
分割线:将某个项的Caption属性设为‘-’。
选择“222”,然后右键选择“Create SubItem”即可创建右侧下拉菜单。
3、PopupMenu组件
两步:给组件设置哪个弹出菜单(通过属性“PopupMenu”来设置),设计PopupMenu。
快捷键:只能通过ShortCut设置。Caption中‘&’只是用来显示下划线,不具有快捷键的功能。
4、Label组件
5、Edit组件
常用属性:
AutoSelect:该Edit取得focus时,其内所有文字是否会自动被选中。
CanUndo:只读。可让组件恢复到某些改动行为前的状态。
HideSelection:当focus离开此组件时,是否放弃所选择的文字。
Modified:用户是否改过其内文字。
PasswordChar:设置其内文字显示在屏幕上的外观。若为#0:直接显示;#1,#2……:以空格代替;#:以#代替;*:以*代替;若为2:则以2代替。以此类推。
SelLength:指出所选择的文字数量。
SelStart:指出选中文字的第一个字符在所有文字中的排序。
SelText:代表所选择的文字内容。
常用方法:
Undo:恢复到改动前。
ClearUndo:撤销掉Undo缓冲区的内容,则将无法恢复到改动前的状态。
CopyToClipboard:将选择的文字以CF-TEXT格式拷贝到剪贴板中。
CutToClipboard:将选择的文字以CF-TEXT格式剪贴到剪贴板中。
PasteFromClipboard:将剪贴板里的内容贴到该组件编辑区中光标处。
SelectAll:选择所有。
6、Memo组件:多行的文字编辑块。
常用属性:
CarPos:光标在该编辑区内的坐标位置。
Lines:容纳此memo拥有的每行文字。Lines本身属于一种内建类(TStrings),它拥有以下常用方法:Add、Append、Insert、Delete、Clear、Move、SaveToFile、LoadFromFile。
WantReturns:决定在Memo文本内按enter键是否会换行。
WantTabs:是否会跳格。
WordWrap:其内文字是否以多行方式显示。
常用方法:
Clear、ClearSelection、CopyToClipboard、CutToClipboard、PasteFromClipboard、SelectAll、Undo等。
7、CheckBox组件
常用属性:
Alignment:决定文字在前还是选择框在前。
AllowGrayed:为True时,此组件有三种状态:正常选中、灰色、正常未选。
Checked:是否选中。
8、RadioButton组件
同一父类内,不可能有两个同时被选中。可通过更改其父类来实现同时选中。
9、ListBox组件
能建立一个可自动产生滚动条的列表栏,里面每行文字都是一个选项。
常用属性:
Columns:直接可见的列数。
ItemIndex:所选选项在选项栏中的序号。
Items:和Memo组件的Lines同属于Tstrings类。
MultiSelect:是否可多选。
SelCount:指出所选取选项的数目。前提是MultiSelect为True。
Selected:检验某个选项是否被选中。
Sorted:指出ListBox中的选项是否按照字母属性排列。
10、ComboBox组件:下拉式的文字列表。
常用属性:
ItemIndex:被选取项目的序号。
Items:同ListBox。
SelLength、SelStart、SelText:同Edit
11、ScrollBar组件
可建立一个供用户改变某组件可见范围的滚动条。
常用属性:
Kind:水平还是垂直滚动条。
LargeChange:点击滚动条左右两边的空间,或按下Page up和Page Down时,滚动条每次移动的距离。
SmallChange:点击滚动条左右两端箭头按钮时,滚动条每次移动的距离。
Min、Max:滚动条所能滑到的最小、大位置。
PageSize:此滚动条的宽度。必须介于Min和Max之间。
Position:ScrollBar当前位置。
12、RadioGroup组件:专门用来容纳RadioButton的父类。只能通过其Items属性来为其放置RadioButton。优点:自动排列RadioButton。
常用属性:
Columns:拥有几列RadioButton。
ItemIndex:RadioGroup中被选取的RadioButton的序号。
Items:列出此组件内的RadioButton选项。
13、ActionList组件:可建立一个事件的集合,以集中管理程序对用户操作(Action)的响应。
常用属性:
ActionCount:指出此ActionList包含的操作项(Action)的数量。
Actions:包含此ActionList的操作项,且利用索引值可指定ActionList内的某个操作项。此属性值属于TCntainedAction类,此类对象拥有两个常用事件:OnExecute和OnUpdate。
举例:form上放置一个button和ActionList。设计ActionList,并实现OnExecute事件。然后将button的Action设置为实现的ActionList,然后你会发现该button的OnClick会自动关联到该ActionList的OnExecute。