Note
以后将用两种方式提及组件,以组件的名称或定义组件的VCL类的名称。可以说“Label组件用于……”或说“TLabel用于……”,这两种方式谈到的是同一组件。
Delphi共有5个编辑控件组件,Edit、Memo、MaskEdit、RichEdit(该控件不是标准Windows控件)和SpinEdit(数字编辑框),在此讨论因为它与其他编辑控件有许多相同的特点。
Edit组件封装基本的单行编辑控件,这个组件没有Align和Alignment属性,它没有Alignment属性是因为单行编辑控件中的文本只能左对齐;Edit组件没有Align属性是因为它不能也不应该扩充到充满窗口的用户区域。
TEdit对象从TCustomEdit对象继承而来,继承关系如下:
CustomEdit对象的主要属性
- AutoSelect —— 当输入焦点移近编辑框时,框内的文字自动全选
- AutoSize —— 为True时,编辑框的高度会自动适应输入文本字体的高度(必须要BorderStyle属性为bsSingle时才有效)
- CanUndo —— 编辑框内的文字修改能否通过undo方法来撤销
- CharCase —— 设置编辑框内字母的大小写,取值为ecNormal为不理会大小写,ecUpperCase为全部大写,ecLowerCase为全部小写
- HideSelection —— 当该属性为False时,即使输入焦点离开了该编辑框,框内的文字还是处于一种看上去像被选择的状态(默认值为True)
- MaxLength —— 指定该编辑框可以容纳的最大字符数,设为0时表示无限制
- Modified —— 表明自从上次Modified属性被改为False以来,编辑框的内容有没有做过修改
- OEMConvert —— 指定是否将输入的ANSI字符转换为OEM字符,通常只有在输入文件名时我们才将该属性设为True
- PasswordChar —— 默认值为#0(空字符),表示显示用户输入的字符,如果设为其他字符,用户输入的字符将自动显示为该字符,通常用于密码框,将该属性设为“*”
- ReadOnly —— 指定显示的输入内容能否被改变
- SelLength —— 表明了选取的字符串长度
- SelStart —— 表明了选取开始的字符位置,通常和SelLength属性配合使用来选定任意位置开始的若干个字符
- SelText —— 表明了选取的字符串,在程序中设置该属性的值可以取代选定的字符
重要的方法:
- Clear过程—— 清除编辑框中的所有内容
- ClearSelection过程—— 清除选定区域内容
- ClearUndo过程—— 清除缓冲区内保存的撤销信息,这样就不能用Undo方法来撤销操作
- CopyToClipboard过程—— 将选择的内容拷贝到剪贴板
- CutToClipboard过程—— 将选择的内容剪切到剪贴板
- GetSelTextBuf函数—— 将编辑框中选定的内容粘贴到buffer参数指定的缓冲区里,并返回复制的字符数
- PasteFromClipboard过程—— 将剪贴板中的内容粘贴到编辑框中
Tip
如果需要编辑组件中的文本右对齐或居中,使用Memo组件,但把它的高度做成标准Edit组件的高度,然后需要时设置Alignment属性。
Note
只要可能就保持窗体时标准的,尽管可以把Edit组件做成喜欢的那么高,如果高度超出标准Windows编辑控件的高度(对用户来说看起来像多行编辑控件),会使用户糊涂。
MaskEdit是一个“智能”的Edit框,我们可以使用MaskEdit组件来创建有效的格式化的数据录入域,它限制用户在所定义的位置输入要求输入的符号。例如,一个电话号码输入框,它要求操作人员按已定义的格式输入若干位数字的号码。
TMaskEdit是从TCustomMaskEdit继承下来的,继承关系如下:
在Object Inspector中双击EditMask属性,将会弹出“Input Mask Editor”对话框,此对话框能从预定义过滤器中选择一个或者自己建立一个,如下:
左上方的“Input Mask”编辑框用于输入掩码规则,我们从该编辑框中输入的规则“!\(999\)0000-00000000;1;_”可以看出,规则分为三个部分,用“;”分隔,不同部分用不同颜色区分:
例如采用这样的掩码“!\(999\)0000-00000000;1;_”,就可以控制用户在掩码编辑框中输入形同“(086)0311-83034220”这样的电话号码格式。具体怎么实现,只要利用个格式符含义表加以对照,相信很快就能掌握了。
用来定义掩码格式的特殊字符
! 清除数据末尾的空格,无“!”符号表示数据后的空格将被保留,该字符只能作为掩码格式的第一位
> 出现在“>”字符之后的字符都会变成大写,直到出现“<”格式符
< 出现在“<”字符之后的字符都会变成小写,直到出现“>”格式符
<> 不进行大小写检查,数据直接以用户输入的大小写形式出现
\ 在该格式符之后出现的任何格式符都将被作为普通字符对待
L 该位置必须输入字母
l(小写字母L) 该位置可以用一个字母填充,但不是必须的,可以移动光标跳过
A 该位置必须输入字母或数字
a 该位置可以用一个字母或数字填充,但不是必须的,可以移动光标跳过
C 该位置可以输入任意字符
c 该位置可以输入任意字符,不是必须的
0(数字0) 该位置必须有一个数字
9 只能输入数字,但不是必须的
# 该位置可以输入一个数字或正负号,不是必须的
: 该字符用来表示时间时分分割小时、分钟和秒,如果在控制面板中设置的时间分割符与该格式不同,将会采用该格式。
/ 该字符用来表示日期时分分割月、日和年,如果在控制面板中设置的日期分割符与该格式不同,将会采用该格式。
_ 该字符自动在输入字串中产生一位空格,当用户输入字符时,光标会跳过该位置
; 该字符用来分割掩码规则的三个部分
在“Input Mask Editor”对话框中,还有其他的几个选项:
Delphi中DEM格式文件内容如下:
Phone | 4155551212 | !\(999\)000-0000;1;_ Extension | 15450 | !99999;1;_ Social Security | 555555555 | 000\-00\-0000;1;_ Short Zip Code | 90504 | 00000;1;_ Long Zip Code | 905040000 | 00000\-9999;1;_ Date | 062794 | !99/99/00;1;_ Long Time | 090515PM | !90:00:00>LL;1;_ Short Time | 1345 | !90:00;1;_
GetTextLen函数,用于返回用户输入的未经格式化之前的字符数:
function GetTextLen: Integer;
Memo是一个能显示和编辑多行文本编辑器,TMemo由TCustomMemo继承而来,而TCustomMemo又从TCustomEdit继承而来,因此Memo控件的属性、方法和事件与Edit控件大体相同。
CustomMemo对象的主要属性
- Alignment——文本的对齐方式,前面介绍过了taLeftJustify居左、taCenter居中、taRightJustify居右三种选项
- CaretPos——此只读属性返回编辑器中“^”号的位置,即坐标
- Lines——我们仍然可以使用Text属性来访问编辑框中的字符,但要访问某一行的文本时,就要用到Line属性
- ScrollBars——指定了编辑框的滚动条位置,有ssNone、ssHorizontal、ssVertical、ssBoth四种
- WantReturns——在编辑框中是否能回车换行
- WantTabs——在编辑框中是否能用Tab键使光标移动一个制表位
其中,Lines属性是一个典型的TStrings对象。我们可以利用该对象的各种属性方法来随心所欲地定制Memo中的每一行内容,比如:
Memo1.Lines.Add('这就是利用Strings对象的Add方法添加一行的例子');
或者,我们可以读取一个文本文件的内容,并将其添加到Memo编辑器中。
procedure TForm1.Button1Click(Sender: TObject); begin memo1.Lines.Clear; memo1.Lines.LoadFromFile('C:\Boot.ini'); end;
假设窗体上有一个按钮,并且按钮的Default的属性为True,那么当用户在Memo对象中输入时,当按下回车键后,究竟是换行还是相当于单击了默认按钮呢?这就需要使用WantReturns属性。如果该属性为True,那么回车相当于换行;如果为False,那么回车相当于单击了默认按钮。要换行的话,就必须使用组合键“Ctrl + Enter”。
类似的,如果WantTabs属性为True,用户按下Tab键将使光标在编辑器中移动一个制表位,而不是使输入焦点在窗体的窗口控件上切换。而当该属性为False时,要使光标移动一个制表位,必须使用组合键“Ctrl + Tab”。
RichEdit对象位于Win32组件面板上。它与Memo对象非常类似,都可以编辑多行文本,但Memo编辑器中的文本只能有一种格式,而RichEdit对象中的文本却可以包含多种字体和颜色。
RichEdit对象的常用属性和Memo对象差不多,下面列出了它从TCustomRichEdit对象继承下来的一些独特属性。
RichEdit对象的常用属性
- DefAttributes——文本的缺省属性(运行期可见)
- DefaultConverter——指定当从未知扩展名的文件中读入文本,进行格式转换时所调用的Conversion类
- HideScrollBars——当文本长度很短,不需要滚动时,是否隐藏滚动条
- PageRect——指定在打印RichEdit控件内容时,以像素为单位计算的纸张面积
- Paragraph——指定当前段的格式
- PlainText——指定是否以纯文本或复文本格式将文字读写或写入文件
- SelAttributes——选定文本的属性(运行期可见)
RichEdit对象的SelAttributes属性可以用来指定选定文本的颜色、字体等格式。在用SelStart和SelLength属性选定区域后,就可以用SelAttributes属性来设置选定文字的格式了。SelAttributes属于TTextAttributes类,该类的对象可以指定文字的字体、颜色、字号、字形等等。SelAttributes属性可以通过Assign方法来获取TFont和TColor对象中的字体和颜色,TFont和TColor对象也能通过Assign方法来取得SelAttributes中的字体和颜色。
DefAttributes属性指的是RichEdit组件的默认属性,其用法和SelAttributes属性完全相同。
使用Paragraph属性来获得RichEdit控件用来指定段落格式信息的TParaAttributes对象。段落格式包含了对齐方式、缩进、编号方式、制表符等信息。
Paragraph属性是只读属性,因为一个CustomRichEdit对象只能包含一个不变的ParaAttributes对象。但是,通过设置ParaAttributes对象的属性,我们可以改变当前段落的格式。我们可以一个属性一个属性地设置,也可以通过Paragraph属性的Assign方法从给一个已存在的ParaAttributes对象中读取。所谓当前段落指的是包含选定文本的段落,如果不存在选定文本,当前段落指的是光标所在段落。
主要事件:
- OnProtectChange——当用户试图修改属性为Protected的文字时出发。StartPos和EndPos参数表明了修改设计的文字范围。如果允许修改,可以将AllowChange属性设为True(通过SelAttributes属性来设置或取消文字的Protected属性)
- OnResizeRequest——当文字发生变化导致RichEdit需要调整大小时,触发该事件。Rect参数指定了同时显示所有文字需要的边框范围
- OnSaveClipboard——当RichEdit对象将要被释放时,触发该事件。NumObjects参数和NumChars分别指定了剪贴板中对象和字符的数目。将SaveClipBoard参数设为False可以同时清除剪贴板中与该RichEdit对象相关的信息
- OnSelectionChange——当用户用鼠标或键盘改变选区或通过设置SelText属性导致选区发生变化时,触发该事件。
主要方法有:
- Clear过程——清除所有文字内容
- FindText函数——使用FindText方法来在RichEdit控件中查找从StartPos参数位置开始,Length参数范围内的SearchStr参数指定的文字。Options参数则指定了查找的方式:是否全字匹配?是否区分大小写?返回值FindText返回了查找到的字符位置。如果没有找到匹配的文字,函数返回-1。使用FindText函数,我们可以避免编程查找需要处理复文本特性编码的麻烦。
- GetSelTextBuf——将选定文本复制到buffer参数指定的缓冲区位置,并返回实际拷贝字节数。
- Print——格式化并打印出RichEdit控件中的文本内容。
位于Samples组件面板上的SpinEdit(数字编辑框)组件,专门用来输入数字。也可以单击上下箭头按钮来增减数字。数字编辑框的常用方法、事件和编辑框组件基本相同。常用属性如下:
SpinEdit组件的常用属性
- Increment——指定了每次单击按钮时数字的增幅(减幅)
- MaxLength——指定了数字的最大位数,为0时表示无限制
- MaxValue——指定了数字的最大值
- MinValue——指定了数字的最小值
对于每个编辑组件的全部方法请参见Delphi在线帮助。