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格式文件內容如下:
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;
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中的每一行內容,比如:
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”。
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在線幫助。