VCL组件之编辑控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VCL组件之编辑控件相关的知识,希望对你有一定的参考价值。

Note

以后将用两种方式提及组件,以组件的名称或定义组件的VCL类的名称。可以说“Label组件用于……”或说“TLabel用于……”,这两种方式谈到的是同一组件。

编辑控件(Edit Control)

Delphi共有5个编辑控件组件,Edit、Memo、MaskEdit、RichEdit(该控件不是标准Windows控件)和SpinEdit(数字编辑框),在此讨论因为它与其他编辑控件有许多相同的特点。

技术分享

1、Edit组件

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编辑控件的高度(对用户来说看起来像多行编辑控件),会使用户糊涂。

2、MaskEdit组件

MaskEdit是一个“智能”的Edit框,我们可以使用MaskEdit组件来创建有效的格式化的数据录入域,它限制用户在所定义的位置输入要求输入的符号。例如,一个电话号码输入框,它要求操作人员按已定义的格式输入若干位数字的号码。

TMaskEdit是从TCustomMaskEdit继承下来的,继承关系如下:

技术分享

在Object Inspector中双击EditMask属性,将会弹出“Input Mask Editor”对话框,此对话框能从预定义过滤器中选择一个或者自己建立一个,如下:

技术分享

左上方的“Input Mask”编辑框用于输入掩码规则,我们从该编辑框中输入的规则“!\\(999\\)0000-00000000;1;_”可以看出,规则分为三个部分,用“;”分隔,不同部分用不同颜色区分:

  • 第一部分“!\\(999\\)0000-00000000”定义了数据的输入格式。我们用一些特殊的字符来表示应输入的字符类型及格式。
  • 第二部分只能是“1”或“0”,当为“1”时,掩码中的分割符等非用户输入的数据也作为数据的一部分保存。
  • 第三部分的“_”符号表示将数据中的空格用“_”来表示。

例如采用这样的掩码“!\\(999\\)0000-00000000;1;_”,就可以控制用户在掩码编辑框中输入形同“(086)0311-83034220”这样的电话号码格式。具体怎么实现,只要利用个格式符含义表加以对照,相信很快就能掌握了。

用来定义掩码格式的特殊字符

! 清除数据末尾的空格,无“!”符号表示数据后的空格将被保留,该字符只能作为掩码格式的第一位

> 出现在“>”字符之后的字符都会变成大写,直到出现“<”格式符

< 出现在“<”字符之后的字符都会变成小写,直到出现“>”格式符

<> 不进行大小写检查,数据直接以用户输入的大小写形式出现

\\ 在该格式符之后出现的任何格式符都将被作为普通字符对待

L 该位置必须输入字母

l(小写字母L) 该位置可以用一个字母填充,但不是必须的,可以移动光标跳过

A 该位置必须输入字母或数字

a 该位置可以用一个字母或数字填充,但不是必须的,可以移动光标跳过

C 该位置可以输入任意字符

c 该位置可以输入任意字符,不是必须的

0(数字0) 该位置必须有一个数字

9 只能输入数字,但不是必须的

# 该位置可以输入一个数字或正负号,不是必须的

: 该字符用来表示时间时分分割小时、分钟和秒,如果在控制面板中设置的时间分割符与该格式不同,将会采用该格式。

/ 该字符用来表示日期时分分割月、日和年,如果在控制面板中设置的日期分割符与该格式不同,将会采用该格式。

_ 该字符自动在输入字串中产生一位空格,当用户输入字符时,光标会跳过该位置

; 该字符用来分割掩码规则的三个部分

在“Input Mask Editor”对话框中,还有其他的几个选项:

  • Character for Blanks编辑框 ——和掩码的第三部分含义相同
  • Save Literal Characters复选框 ——和掩码规则的第二部分含义相同
  • Test Input编辑框——可以在其中输入数据来测试你的掩码规则正确与否
  • Sample Masks ——提供了一些常用掩码规则的例子,你可以选择使用
  • Masks按钮——单击打开“”对话框,你可以加载一个掩码规则(*.dem)文件。

Delphi中DEM格式文件内容如下:

1
2
3
4
5
6
7
8
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函数,用于返回用户输入的未经格式化之前的字符数:

1
function GetTextLen: Integer;

3、Memo组件

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中的每一行内容,比如:

1
Memo1.Lines.Add(‘这就是利用Strings对象的Add方法添加一行的例子‘);

或者,我们可以读取一个文本文件的内容,并将其添加到Memo编辑器中。

1
2
3
4
5
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”。

 

4、RichEdit组件

RichEdit对象位于Win32组件面板上。它与Memo对象非常类似,都可以编辑多行文本,但Memo编辑器中的文本只能有一种格式,而RichEdit对象中的文本却可以包含多种字体和颜色。

技术分享

RichEdit对象的常用属性和Memo对象差不多,下面列出了它从TCustomRichEdit对象继承下来的一些独特属性。

RichEdit对象的常用属性

  • DefAttributes——文本的缺省属性(运行期可见)
  • DefaultConverter——指定当从未知扩展名的文件中读入文本,进行格式转换时所调用的Conversion类
  • HideScrollBars——当文本长度很短,不需要滚动时,是否隐藏滚动条
  • PageRect——指定在打印RichEdit控件内容时,以像素为单位计算的纸张面积
  • Paragraph——指定当前段的格式
  • PlainText——指定是否以纯文本或复文本格式将文字读写或写入文件
  • SelAttributes——选定文本的属性(运行期可见)

关于DefAttributes属性和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控件中的文本内容。

 

5、TSpinEdit组件

技术分享

位于Samples组件面板上的SpinEdit(数字编辑框)组件,专门用来输入数字。也可以单击上下箭头按钮来增减数字。数字编辑框的常用方法、事件和编辑框组件基本相同。常用属性如下:

SpinEdit组件的常用属性

  • Increment——指定了每次单击按钮时数字的增幅(减幅)
  • MaxLength——指定了数字的最大位数,为0时表示无限制
  • MaxValue——指定了数字的最大值
  • MinValue——指定了数字的最小值

对于每个编辑组件的全部方法请参见Delphi在线帮助。

以上是关于VCL组件之编辑控件的主要内容,如果未能解决你的问题,请参考以下文章

VCL组件之TPanel

在 Delphi VCL 中通过组合两个控件(TEdit 和 TTrackBar)创建一个新组件

阻止 VCL 子控件继承父弹出菜单

Delphi如何安装VCL控件和修改快捷键

Javascript - ExtJs - GridPanel组件 - 编辑

Delphi 之 编辑框控件(TEdit)