後一頁
前一頁
回目錄
回首頁
第三章 字元串清單及應用(一)

       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.


後一頁
前一頁
回目錄
回首頁