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组件之编辑控件相关推荐

  1. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面...

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  2. (转)基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder...

    http://www.cnblogs.com/wuhuacong/p/3780356.html Web开发上有很多HTML的编辑控件,如CKEditor.kindeditor等等,很多都做的很好,本文 ...

  3. MFC界面控件BCGControlBar v33.3 - 编辑控件功能升级

    BCGControlBar库拥有500多个经过全面设计.测试和充分记录的MFC扩展类. 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间. BCGControlBar专业版和B ...

  4. CRichEditCtrl 多格式编辑控件的使用

    下面链接可以下载全文: https://download.csdn.net/download/h3974/42496015 一.多格式编辑控件 Rich Edit编辑控件可以为文本设置字符和段落格式, ...

  5. silverlight之How To:设置ComboBox控件的数据源当ComboBox用来作为DataGrid的某列的编辑控件时...

    DataGrid是个可编辑的列表控件,而且可以用已有的输入控件来作为某一列的编辑控件,比如用ComboBox控件来作为某列的编辑控件供用户选择数据,这个时候就要先设置好ComboBox控件的下拉列表项 ...

  6. WinForm界面开发之“HTML内容编辑控件”

    做过了很多Winform的共享软件,对界面的设计有了一定的经验和积累,准备开一个"WinForm界面开发"系列文章,介绍下相关的Winform界面设计和相关控件的使用,促进相互交流 ...

  7. ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件...

    本篇要登场的有三个控件,分别是滚轴控件.进度条控件和编辑控件. 一.滚轴控件 Ext.slider 1.滚轴控件的定义 下面我们定义三个具有代表意义滚轴控件,分别展示滚轴横向.纵向,以及单值.多值选择 ...

  8. mfc c语言 编辑器,语法高亮编辑控件Scintilla在MFC中的简单使用

    项目中要使用代码编辑器,搜索之后,发现了强大的编辑器控件Scintilla. 1.简介 Scintilla是一款开源的语法高亮编辑器控件,官方网站:http://www.scintilla.org/. ...

  9. Silverlight 信息显示与编辑控件 示例

    Silverlight 真是一个不错的开发平台,想到即将发布的Silverlight 4 更是增加了像去学习他的兴趣. 信息显示控件 TextBlock 信息显示第一个要说的一定是TextBlock, ...

最新文章

  1. 全球及中国有机肥料行业投资价值与营销品牌战略报告2022版
  2. 条款七 为多态基类声明virtual析构函数
  3. win7系统桌面计算机怎么打的开,windows7系统双击计算机打不开怎么解决|win7双击计算机打不开的解决方法...
  4. vue 新建的页面如何访问_Vue.js—实现前后端分离架构中前端页面搭建(四)(完)...
  5. python使用t-sne算法降维,方便可视化
  6. java位运算和字节编码(一)
  7. docker 容器安装conposer_docker和composer安装
  8. linux 下tomcat catalina.out日志操作
  9. 10.企业安全建设指南(金融行业安全架构与技术实践) --- 安全预算、总结与汇报
  10. ubuntu下安装matlab及配置vot-toolkit
  11. 免费直播编码软件应用技巧
  12. android 应用程序结构是哪些
  13. 华南农业大学C语言程序设计(实验六)
  14. KITTI下使用SGBM立体匹配算法获得深度图
  15. python迭代器的用法_python的装饰器,迭代器用法
  16. 聊天机器人ChatGPT横空出世,今天来看看ChatGPT是如何回答面试官的问题的?
  17. 安卓系统怎么查找手机定位服务器,安卓手机丢了怎么查定位找手机
  18. 正交匹配追踪算法OMP(Orthogonal Matching Pursuit)
  19. 【MDX】一文带你搞懂SQL Server Analysis Services 的安装和使用
  20. Python获取QQ音乐某个歌手的歌单。

热门文章

  1. 安卓依然是华为手机首选,鸿蒙系统或许不用于手机
  2. 为提升管理效率 蔚来汽车美国办公室裁员70名
  3. 特斯拉明年会有100万辆自动驾驶出租车 你敢坐吗?
  4. 男子支付宝每天莫名进钱 吓得赶紧报警 最后真相哭笑不得...
  5. OPPO首部5G手机亮相 10倍混合光学变焦技术惊艳MWC
  6. Python实现从url中提取域名的几种方法
  7. 积分图像追踪目标 (一)
  8. ssdp安全-攻击和防御
  9. Golang实践录:生成版本号和编译时间
  10. Eclisp配置Maven(基础简易版)