後一頁 前一頁 回目錄 回首頁 |
Delphi應用程式經常要處理字元串清單,如群群組合框和列示方塊中的字元串,TMemo部件的文本行,螢幕支援的字形清單,TNotebook部件的tabs屬性,字元串網格的行、列等等。 雖然應用程式以不同的方法使用這些清單,但Delphi通過一個叫字元串清單(Tstrings)的物件提供統一的介面,並且在不同場合可相互轉化。例如,可以在TMemo部件中編輯某一字元串,並把它當成列示方塊中清單項使用。 在Delphi整合開發環境中也經常要使用字元串清單。如在Object Inspector窗體的取值欄中常列有Tstrings字元,連續按兩下該字元,將彈出字元清單編輯器,如圖3.1,在編輯器中可進行編輯、加入、解除等操作 。 在執行狀態時也可以操作字元串清單,常見的字元串清單操作如下: ● 清單中操作字元串 ● 裝載、存檔字元串清單 ● 建立字元串清單 ● 在字元串清單中加入物件 本章將介紹字元串清單的常用操作及簡單應用。 3.1 字元串清單的常用操作 3.1.1 清單中操作字元串 在Delphi應用程式中,經常要對清單中的字元串進行操作。例如,設計時修改字元串清單屬性。 常見的字元串操作如下: ● 計算清單中字元串數目 ● 存取指定字元串 ● 找到字元串的位置 ● 往清單中加入字元串 ● 解除清單中的字元串 ● 在清單中移動字元串 ● 復制一個完整的字元串清單 ● 復制清單中的字元串 3.1.1.1 計算清單中的字元串數目 使用Count屬性可計算清單中的字元串數目。Count是唯讀屬性,用以指示清單中字元串清單數目。因為字元串清單是以零開始索引,因而Count比清單的最大索引數大一。 例如,應用程式想計算目前螢幕支援的字形數目,可找到螢幕物件的字形清單,該清單包含了螢幕支援的所有字形的名字。 FontCount:=Screen.Fonts.Count; 3.1.1.2 存取指定字元串 字元串清單有一個可索引的Strings屬性,可象使用字元串數群群組一樣使用Strings。例如,清單中第一個字元串為Strings[0]。因為Strings屬性為字元串清單中最常用的屬性,Strings屬性可做為字元串清單的缺省屬性,即使用時可省略Strings標識符。 要存取字元串中的指定字元,可找到該字元的起始位置或索引。字元串數目是以零開始記數的。如果清單中有三個字元串,其索引範圍為0..2。 以下代碼是等價的: Memol.Lines.Strings[0]:='This is the first line.'; Memol.Lines[0]:='This is the first line.'; 3.1.1.3 找到字元串的位置 Indexof方法可找到指定字元串的位置。Indexof有一個字元串型式的參數,方法返回清單中匹配字元串的位置。如果清單中無匹配字元串,將返回- 1。 Indexof方法只能找到完整字元串,即必須完全匹配整個字元串。如果只匹配部分字元串,必須編寫相應代碼。 以下代碼判定清單中是否有指定字元串: if FileListBox1.Items.IndexOf('AUTOEXEC.BAT') > -1 then begin Color := clYellow; Label1.Caption := 'You are in the root directory!'; end; 3.1.1.4 在清單中加入字元串 有兩種方式往清單中加入字元串:可把字元串加到清單的最後,也可插入清單之中。 要把字元串加至清單尾部,使用Add方法,把字元串作為參數傳遞。 要把字元串插入清單中,使用Insert方法,傳遞兩個參數:插入的位置和字元串。 例如,要把“Three”插入至清單中的第三個位置,使用代碼Insert(2,'Three')。如果清單中的字元不到2個,Delphi將產生超出索引範圍的異常(關於異常詳見十二章)。 3.1.1.5 在清單中移動字元串 應用程式可以在清單中把指定字元串移至另一個位置,如果字元串與某個物件相連,則該物件與字元串同步移動。 Move方法可實現字元串的移動,它有兩個參數:現行位置和要移動的位置。以下代碼把第三個字元串移至第五的位置: Move(2,4); 3.1.1.6 解除清單中的字元串 使用Delete方法可以解除指定的字元串。Delete的參數是指定字元串的位置,如果不知道字元串的位置,可使用Indexof方法。 要解除字元串清單中所有的字元串,可使用Clear方法。 以下代碼解除列示方塊中的指定字元串: With ListBox1.Items do begin if Indexof('bureaucracy')>-1 then Delete (Indexof('bureaucracy')); end; 3.1.1.7 復制完整的字元串清單 把一個清單復制到另一個清單相當於把源清單賦值給目標清單,即使清單從屬於不同的部件,Delphi也可以進行這種復制。 復制清單將覆蓋掉目標清單,如果要把源清單加到目標清單的尾部,使用Addstrings方法。 以下代碼分別為復制清單和連接清單: Outline1.Lines:=ComboBox1.Items; Outline1.Addstrings(ComboBox1.Items); 3.1.1.8 重複操作清單中的字元串 很多情況需要對表中的每一個字元串進行操作,如改變字元串的大小寫。象這種重複操作可以用 for 回圈來實現,同時使用清單的整數型式的索引。 以下代碼對列示方塊的字元串進行重複操作。當用戶按下按鈕時,對列示方塊中的字元串進行大小寫轉換。 procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 0 to ListBox1.Items.Count -1 do ListBox1.Items[I] := UpperCase(ListBox1.Items[I]); end; 3.1.2 裝載、存檔字元串清單 應用程式可以非常方便的把Delphi字元串清單存入文本文件,或者從文本文件中重新裝載(或載入另一個不同的清單),字元串清單有專門的方法處理這類操作。 使用LoadFromFile方法從文件中裝載字元串清單,LoadFromFile從文本文件中把每一行字元串載入清單中。 把清單存檔在文件中使用SaveToFile方法,使用時傳遞檔案標簽的參數。如果文件不存在,SaveToFile將建立它,否則將用清單覆蓋現有文件內容。 以下代碼載入AUTOEXEC.BAT的文件,並以AUTOEXEC.BAK為檔案標簽進行備份。 procedure TForm1.FormCreat(sender:TObject); var FileName:String; begin FileName:='C:\AUTOEXEC.BAT'; With Memo1 do begin LoadFromFile(FileName) SaveToFile(ChangeFileExt(FileName,'BAK')); end; end; 3.1.3 建立新的字元串清單 大多數情況下,應用程式使用的字元串清單是做為部件的某一部分,因此不必建立清單,但Delphi允許建立不依賴部件的字元串清單。 值得注意的是程式建立的字元串清單必須在使用完之後,釋放清單所佔用的記憶體空間。有兩種不同的情況需要處理:一是程式以簡單的方式建立、使用、釋放字元串清單;二是由程式建立,在執行期間均可能使用,在程式終止前釋放。這兩種情況主要取決於是建立短期字元串清單還是長期字元串清單。 3.1.3.1短期字元串清單 短期字元串清單用於處理簡單事物。程式在同一處建立、使用、釋放清單。這是最安全的使用字元串清單的方法。 因為字元串清單要為自己和它的字元串分配記憶體,所以要用try..finally對清單進行保護,以確保發生異常後釋放清單所佔用的記憶體空間。 建立短期字元串清單的基本步驟為: 1. 構造字元串清單物件; 2. 在try..finally塊中使用清單; 3. 在finally後釋放清單空間。 以下代碼建立清單、使用清單、最後釋放清單空間: procedure TForm1.Button1Click(Sender:Tobject); var TemList:TStrings; begin Templist:=TStringList.Create; try { use the string list } finally Templist.Free; end; end; 3.1.3.2 長期字元串清單 如果要在程式執行的任何時候使用字元串清單,則需在程式開始執行時就建立清單,並在程式終止前釋放。 執行時建立字元串清單的步驟為: 1. 在程式主窗體物件的欄位中加入TStringsList型式的欄位; 2. 在主窗體的OnCreate事件中建立句柄,該事件句柄在主窗體顯示前執行; 3. 在建立事件句柄後,建立字元串清單物件; 4. 在主窗體的OnDestroy事件建立句柄,該事件句柄在主窗體消失之前執行。 這樣,在程式執行過程中,任何過程、事件均能存取該字元串清單。 以下代碼在程式中加入了一個Clicklist的字元串清單,用戶每按一次滑鼠鍵,程式往Clicklist中加入一字元串,程式結束前把該清單存入文件。 unit Unit1; interface uses WinTYpes, WinProcs, Classes, Graphics, Forms, Controls, Apps; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } ClickList: TStrings; {declare the field} end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin ClickList := TStringList.Create; {construct the list} end; procedure TForm1.FormDestroy(Sender: TObject); begin ClickList.SaveToFile(ChangeFileExt(Application.ExeName, '.LOG')); {save the list} ClickList.Free; {destroy the list object} end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ClickList.Add(Format('Click at (%d, %d)', [X, Y])); {add a string to the list} end; end. |
後一頁 前一頁 回目錄 回首頁 |