後一頁 前一頁 回目錄 回首頁 |
5、改變欄位的顯示順序。按一下LastInvoiceDate 欄位並將它拖放到欄位列示方塊中的第三行,即處於Company和Phone欄位之間。此時窗體中顯示Customer.DB 表中記錄的欄位將按新的順序顯示。 6、選擇Close按鈕,關閉欄位編輯器Fields Editor。 7、按F9,執行上述程式。 14.4.2 欄位物件的屬性設定 雖然欄位物件是不可見的物件,但是它同樣具有很多的屬性。在程式設計階段,我們通過一定的方式可以設定它的有關屬性,下面是設定欄位物件的屬性的方法和步驟。 1、選擇窗體中的table1。 2、連續按兩下table1,打開欄位編輯器Fields Editor。 3、選擇要設定屬性的欄位。 4、在Object Inspector中修改欄位物件的屬性。 我們可以按上述方法設定Table1中各欄位物件的有關屬性,當我們選擇Custno欄位並修改其屬性,窗體內會出現對話 欄位物件的屬性 修改欄位CustNo的Alignment屬性為taCenter,此時網格中顯示的CustNo 欄位值由原來的右對齊變成了居中。 表14.5中列出了欄位物件在設計階段可以修改的屬性以及屬性敘述 表14.5 欄位物件的重要屬性 ───────────────────────────────── 屬 性 注 釋 ————————————————————————————————— Alignment 敘述欄位值的顯示方式:左對齊、右對齊、居中 ————————————————————————————————— Calculated 當該屬性值為True時,表明該欄位的值是根據其它字 段的值計算得來的。否則該欄位是資料庫表中的欄位 ————————————————————————————————— DisplayLabel 敘述欄位在網格部件中顯示時的標題,缺省情況下字 段的標題就是欄位名 ————————————————————————————————— DisplayWidth 敘述欄位在網格中顯示時所點的列寬度,即字元數 ————————————————————————————————— DisplayFormat 敘述欄位在顯示和編輯狀態下的顯示格式和輸入的過 and EditMask 濾條件(限定用戶輸入欄位值的範圍)。 ————————————————————————————————— FieldName 在資料庫表中對應於該欄位物件的欄位標簽 ————————————————————————————————— Index 指定該欄位物件在數據集部件中的邏輯位置,如Table1 中的第一個欄位物件的Index值為0 ————————————————————————————————— Name 欄位物件的標簽,缺省情況下,它是TTable、TQuery 部件的標簽加上欄位的標簽。如上例中的CUSTNO欄位 物件的Name屬性值為Table1CUSTNO,通過欄位物件的 Name屬性可以存取該欄位的值,如Table1CUSTNO.Value ————————————————————————————————— ReadOnly 敘述該欄位是否能被修改,當該屬性值為True時,該 欄位的不能被修改 ————————————————————————————————— Visible 當該屬性值為True時,在與之相連的網格部件中將不 顯示該欄位 ───────────────────────────────── 根據表14.5中的屬性, 我們可以修改上例中一些欄位的某些屬性, 使網路中顯示表Customer.DB中的記錄更符合我們的工作習慣。修改的屬性如表14.6所示, 經過修改後的程式執行結果如圖14.10所示。 表14.6 修改後的欄位物件的屬性 ───────────────────────────── 字 段 屬 性 屬 性 值 ————————————————————————————— CustNo DisplayLabel 用戶編號 ————————————————————————————— Company DisplayLabel 公司標簽 ————————————————————————————— Phone DisplayLabel 電話號碼 ————————————————————————————— LastInvoiceDate DisplayLabel 購買日期 ───────────────────────────── 修改欄位物件的屬性 14.4.4 欄位物件的存取 欄位物件在應用程式中有動態產生的,也有通過欄位編輯器Fields Editor 建立的永久性的,它們雖然在設計和執行階段都是不可見,但是它們跟其他的物件一樣都擁有自己的屬性、方法和事件,因此我們在應用程式中是可以對欄位物件進行控制和存取的。 因為動態欄位物件是沒有自己的名字的,永久性的欄位物件有自己的名字,所以對這兩種欄位物件的存取方法是不一樣的。 14.4.4.1 動態欄位物件的存取 動態欄位物件存在於數據集部件TTable和TQuery部件中,它們是隨著磁碟上的資料庫文件的打開而動態產生的,並且每一個欄位物件對應於資料庫表中的一個欄位(即記錄的一列),TTable或TQrery部件中所有的欄位物件存在屬性Fields清單中,Fields清單中的欄位物件就像數群群組元素一樣擁有自己的索引號,我們可以用這個索引號來存取欄位物件。索引號在程式執行時賦值,從0開始,表中最左邊的一列(第一個欄位)的索引號為0,緊接著右邊一個為1,以此類推。存取這些屬性的方法和處理其他物件一樣。 Table1.Fields[0].DisplayLabel:='標識符' 上述代碼讓我們存取與Table1相連的資料庫表中的第一個欄位,並為該欄位指定一個標題,這是通過設定它的DisplayLabel屬性值為一個特定的標識符來實現的。 通過索引號來存取Fields屬性中的欄位在使用For回圈對列號進行迭代時會非常有用。但是在大多數簡單應用程式中,通過列名(欄位名)來存取欄位會更加明白而且易讀。在TTable部件中,提供了一個名為FieldByName的方法以便讓我們通過列名存取欄位物件。 Table1.FieldByName('CustNo').DisplayLabel:='標識符' 通過這種途徑同樣可以存取CUSTOMER.DB表中的CustNo欄位, 並為該欄位指定一個標題資訊。 現在我們可以建立一個允許用戶通過欄位名和索引號來存取Customer.DB 表中的欄位物件的簡單窗體。 欄位物件的存取 在該應用窗體的執行過程中,我們通過程式來存取其中的欄位物件並設定有關的屬性,這一控制過程我們放在窗體的OnCreate事件處理過程中。 例14.1 在窗體的Oncreate事件處理過程中存取欄位物件。 procedure TForm1.FormCreate(Sender:TObject); Begin with Table1 Do begin {通過索引號存取欄位物件} Field[0].DisplayLabel:='用戶編號'; {通過欄位名存取欄位物件} FieldByName('Company').DisplayLabel:='公司標簽'; FieldByName('Phone').DisplayLabel:='電話號碼'; FieldByName('LastInvoiceDate').DisplayLabel:='購買日期'; end; end; 在程式執行過程中存取欄位物件 14.4.4.2 永久性欄位物件的存取 通過欄位編輯器Fields Editor 建立的永久性欄位物件的存取相對於動態欄位物件的存取要簡單得多,我們在程式中可以直接通過欄位物件的標簽(即Name屬性)進行存取。 例如: Table1CustNo.DisplayLabel:='用戶編號'; Table1CustNo.DisplayWidth:=12; 14.4.4.3 欄位物件的讀取和賦值 通過欄位物件的Value屬性,我們可以讀取欄位物件的值,例如在如圖14.13所示的窗體中,按一下Read按鈕便可以將Customer.DB表中目前記錄的COMPANY欄位的值讀取到編輯框Edit1中。 讀取欄位物件的欄位值 窗體中各部件的屬性如表14.7所示 表14.7 各部件的屬性 ──────────────────────── 部件的屬性 屬 性 值 ———————————————————————— Button1.Caption &Read Button1.Name Button1 Label1.Caption 欄位值 Label1.Name Label1 Edit1.Text Edit1.Name Edit1 ────────────────────────
其它部件的的屬性跟前面的例子一樣。 為Read按鈕編輯的OnClick事件處理過程如下: procedure Form1.TButton1Click(Sender:TObject); begin Edit1.Text:=Table1Company.Value; end; 在這裏要注意的是:從欄位物件中讀取欄位值時必須要將它賦給與之數據型式相匹配的變數,否則會出錯。在上面的程式代碼中,Table1Company的型式是TStringField 即是字元串型式的欄位,而編輯框Edit1的屬性Text的型式也是字元串型的, 因而它們是匹配的。如果型式不匹配,則要經過一定的轉換才能夠相互賦值。如: Edit1.Text:=Table1CustNo.Value 這條代碼在執行過程中將會出錯,因為TablelcustNo是TFloatField 型式即是數值型數據,要在編輯框Edit1中顯示數值型數據要經過下列轉換: Edit1.text:=Table1CustNo.AsString; AsString是欄位物件的屬性,通過欄位物件的AsString屬性可以讀取欄位值並且將它轉換成字元串型式。欄位物件的欄位值可以轉換成以下幾種型式的數據: AsString: 將欄位值轉換成字元串數據 AsBoolean: 將欄位值轉換成布爾型數據 AsDateTime: 將欄位值轉換成日期時間數據 AsFloat: 將欄位值轉換成數值型數據 AsInteger: 將欄位值轉換成整數型數據 下面的程式代碼是從欄位物件中讀取欄位值並將它顯示在編輯框Edit1中, 或者將欄位值賦給相匹配的變數。 CustNoDouble: Double; CustNoInt: Integer; CustNoString: String; {在Edit1中顯示欄位值} Edit1.Text:=Table1Company;{型式相匹配,不需要轉換} Edit1.Text:=Table1CustNo.AsString;{型式不匹配,需要轉換} {將欄位值賦給變數} CustNoDouble:=Table1CustNo.Value;{型式相匹配,不需要轉換} CustNoInt:=Table1CustNo.AsInteger;{型式不匹配,需要轉換} CustNoString:=Table1CustNo.AsString;{型式不匹配,需要轉換} 14.4.5 設定欄位物件的顯示格式 我們即可以在設計階段設定欄位物件的顯示格式,也可以在執行過程中通過程式代碼來設定欄位物件的顯示格式。 例14.2 在如圖14.10所示的窗體中,再增加一個TaxRate欄位, 並在程式設計過程中設定它的顯示格式為0.00%,即設定TaxRate欄位物件的DisplayFormat屬性為0.00% , 若TaxRate的值為0.085那麼在網格部件中其顯示的格式為8.50%。 在執行過程中我們通過程式代碼來設定欄位Phone的顯示格式, 美國的電話表示形式與中國的表示形式不一樣(如美國808-555-0269,中國(808) 5550269 ), 為此我們將phone 欄位的值表示成中國式的形式。 具體方法是:在 Object Inspector 中選取Table1phone物件,並為此物件的OnGetText事件編寫如下程式代碼: TForm1.Table1PhoneGetText(Sender:TField; Text:OpenString;DisplayText:Boolean); begin If DisplayText then begin Text:=Table1Phone.Value; Delete(Text,4,1); Delete(Text,7,1); Insert('(',Text,1); Insert(')',Text,1); end; end; 圖14.14 設定欄位物件的顯示格式 14.4.6 自定義欄位以及計算欄位物件的建立 有時候為了使應用程式完成所期望的工作,我們要在資料庫表現有欄位的基礎上增加一些自定義的欄位,這些欄位並不是資料庫表中實際存在的欄位,它們常常是根據資料庫表中的其它的欄位動態地計算出來的,因而它們常常被稱為計算欄位。 例如我們建立一個瀏覽ORDERS.DB表中記錄的應用如圖14.15所示。 瀏覽ORDERS.DB表中的記錄 首先,我們想在顯示OREDRES.DB表的網格中增加一個自定義的欄位物件,完成以下步驟: 1、連續按兩下窗體中的Table1,打開欄位編輯器Fields Editor。 2、在Fields Editor視窗中,按一下滑鼠右鍵,選擇New Fields選擇表項。 3、Delphi顯示New Fields對話方塊。選擇Field Type列示方塊中的Currency 項, 並在Field Name文體框中輸入Balance , 這樣我們自定義了一個 CurrencyField 型式的欄位Balance。Delphi會自動地填入相應的欄位物件名,其缺省值為Table1Balance。如圖14.16所示。 圖14.16 New Field 對話方塊 4、按一下Ok按鈕,關閉New Field對話方塊。當Fields Editor 視窗重新出現時, 注意Balance已經出現在Fields列示方塊中。 5、在Fields Editor 視窗中按一下滑鼠右鍵, 並選擇 Add Fields 選擇表項, 打開AddFields對話方塊。 6、從Available Fields 列示方塊中, 按住 Ctrl 鍵並按一下滑鼠左鍵, 選擇欄位: OrderNo、CustNo、SaleDate、ShipData、ItemsTotal、Amountpaid以及Balance. 7、按一下OK按鈕,關閉Add Fields對話方塊,得到如圖14.17所示的Fields Editor視窗。 圖14.17 欄位編輯器Fields Editor 8、連續按兩下Fields Editor的控制盒關閉欄位編輯器Fields Editor。 至此我們已經為Table1建立了一個自定義的欄位物件Balance,下面我們把Balance欄位設定成計算欄位物件,使其顯示每一個用戶的現金餘額,即此欄位的值是由ORDERS. DB表中ItemsTotal和Amountpaid欄位的值計算而來的。為使應用程式實現這種計算功能,完成以下步驟: 1、在Object Inspector中選擇自定義欄位物件Table1Balance,修改其 Calculated屬性值為True。即定義Balance欄位為計算欄位。 2、在Object Inspector視窗中,選擇Table1部件的Event頁。 3、連續按兩下OnCalcField事件,為Table1OnCalcField編寫事件處理過程如下: procedure TForm1.Table1OnCalcFields(DataSet:TDataSet); begin Table1Balance.Value:=Table1ItemsTotal.Value-Table1AmountPaid.Value; end; 瀏覽ORDERS.DB 中的記錄 14.5 查詢資料庫中的記錄 資料庫中儲存著大量的數據資訊,如何充分有效地查詢其中的數據,對用戶而言是至關重要的。如果想查詢資料庫,首先要確定要查詢的欄位要麼是資料庫表中的關鍵欄位,要麼是輔助索引。如果我們查詢的是Paradox或dBASE資料庫系統中的表,這是唯一的選擇。 一般而言,查詢資料庫中的記錄的方法有兩種:Gotokey方法和Findkey方法。兩種方法十分相似,主要區別在於我們如何指定找到值。這兩種方法的思想是在指定列(欄位)中尋找指定的找到值,如果在資料庫表中找到了這個值,表中的記錄指標便指向該記錄,這樣我們便查詢到了我們需要的記錄,進而可以存取找到的記錄中的各項數據。 14.5.1 使用GotoKey方法找到數據記錄 使用Gotokey方法查詢資料庫中的記錄的具體步驟如下: 1、確保要找到的欄位是關鍵字或已經為它定義了輔助索引,並保證TTable部件的屬性清單中有關鍵欄位名或輔助索引名。 2、通過呼叫GotoKey方法,把要找到的TTable部件置成找到模式。 3、把找到值送進被找到的Field的找到緩衝區。 4、呼叫TTable部件的GotoKey方法,並測試它的返回值判斷找到是否成功。 如果找到成功,GotoKey返回一個True值,並且表中的記錄指標指向找到的記錄。 如果找到失敗,GotoKey返回False,表中的記錄指標不發生變化。 在這裏要注意的是如何給Field的找到緩衝區賦值, 我們知道欄位物件是不可見的物件,它們沒有自己的名字,在大多數情況下,要使用TTable部件的FieldByName 方法到欄位清單中找到欄位物件以便為它賦值。但欄位緩衝區也是沒有名字的,當TTable部件處於找到模式時,我們只要把找到值賦給欄位物件的AsString屬性就可以了。AsString的作用不只是它的表面意思。它是一個轉換屬性,任何賦給欄位物件的AsString屬性的字元串都將轉換成該欄位物件應於資料庫表中的欄位的數據型式。當然AsString不能將找到值轉換成BLOB、Bytes、Memo和Graphic型式的數據,用戶一般也不會找到這種數據型式的欄位。 下面便是敘述使用Gotokey方法找到數據記錄的例子。 例14.3 當用戶在Edit1部件中輸入用戶號碼並按一下找到按鈕,程式便開始在Table1中找到這個用戶號。如果找到成功,找到資訊“找到成功”便會顯示在標籤Label1上,被查詢到的用戶的電話號碼顯示在標籤Label2上。表中的記錄指標將轉移到該用戶記錄處。並且在網格DBGrid1中以高光度顯示這一條記錄。 查詢資料庫中的記錄 下面的程式清單是查詢按鈕上的OnClick事件的處理程式,它是使用Gotokey方法找到資料庫中的記錄的。 procedure TForm1.Button1OnClick(Sender:TObject); begin with Table1 do begin Label1.Caption:=' '; Label1.Caption:=' '; IndexFieldName:='CustNo'; setkey; FieldByName('CustNo').AsString:=Edit1.Text; If GotoKey then begin Label1.Caption:='找到成功'; Label1.Caption:=FieldByName('Phone').AsString; end; else Label1.Caption:='找到失敗'; end; 查詢資料庫中的記錄 14.5.2 使用FindKey方法找到資料庫中的記錄 雖然使用上面的Gotokey方法在資料庫中找到記錄效果不錯,但是Delphi 還提供了一種更加容易的找到方法,這就是Findkey方法,兩種方法雖然很相似,但是Findkey方法更簡單明了一些。 例14.4 我們可以使Findkey方法代替上面例子中的處理程式,下面是程式代碼: procedure TForm1.Button1OnClick(Sender:TObject); var SeekValue:string; begin with Table1 do begin Label1.Caption:=' '; Label1.Caption:=' '; IndexFieldName:='CustNo'; SeekValue:=Edit1.Text; If FindKey([SeekValue]) then begin Label1.Caption:='找到成功'; Label1.Caption:=FieldByName('Phone').AsString; end; else Label1.Caption:='找到失敗'; end; Findkey方法和Gotokey方法的根本區別在於找到值要作為參數傳遞給Findkey 函數。而GOtokey是不帶參數的, 它假定用戶已經把找到值賦給了代表著被找到到的欄位的找到緩衝區。 Findkey接受的參數是放在方括號中的,是用逗號分開的找到值數群群組。 數群群組中的每一個值都對應於特定列的找到值,即參數中允許有多個找到值,Findkey 允許用戶同時找到資料庫表中的多個列。上面的程式清單中的Findkey函數只接受了變數Seekvalue這一個找到值,這個找到值對應表中的欄位CustNo,CustNo是表中的關鍵欄位。如果要同時找到表中的多個欄位,必須把要找到的多個欄位名賦給TTable部件的IndexFieldName屬性,並用逗號分開各欄位,然後把每個欄位的找到值賦給Findkey的參數數群群組中。 14.5.3 利用GotoNearest和FindNearest執行不精確找到 在我們上面討論的找到中,要麼找到成功要麼找到失敗,因為我們找到的是特定找到值的一個精確匹配值。Delphi還提供了一種找到方法,即不精確找到,這樣的找到絕對不會失敗,它總是給用戶找到出一個結果來,也許這結果並不是用戶需要的,但這個找到出來的結果是最接近用戶要求的。在Delphi中是利用GotoNearest和FineNearest兩種方法來執行不準確找到的,它們總是從資料庫中找到出與找到值最接近的匹配值。如果它們找到到與找到值精確匹配的值,那當然最好不過了,如果他們找不到精確匹配的值,它們就會把與用戶指定的找到值最接近的記錄提交給用戶。 GotoNearest的使用方法和Gotokey一樣,FindNearest的使用方法和Findkey一樣。跟Gotokey一樣,使用GotoNearest時必須要把找到值賦給欄位的找到緩衝區,兩者的不同之處在於找到值的敘述方式不一樣,使用GotoNearest時, 敘述的找到值可以是完整的也可以是不完整的,如果要對'Dunteman'進行不精確找到,在給欄位的找到緩衝區賦找到值時,可以使用'Dunteman'、'Dun'或者`Du'作為找到值, 這樣找到出來的結果會盡可能地接近這個值的。 如果沒有找到與用戶指定的找到值精確匹配的記錄,Delphi會調整記錄指標並停留在與找到值最接近的第一個記錄上。例如如果找到`Dunteman'時,沒有找到精確匹配的值,記錄指標可能會停留在`Dunwoody'上或者停留在更遠一些的'Event'上;如果找到'Du' 沒有找到精確匹配的值,記錄指標可能停留在‘Duncan’上,甚至‘Dunteman'之前, 總之Delphi會自己地調整記錄指標,使之指向最接近找到值的記錄並將該記錄作為找到的結果提交給用戶。 GotoNearest和FindNearest都返回一個Boolean值以表明找到是否成功。 它們一般都是成功的,它們總是要把記錄指標移到某處。 下面的例子是用GotoNearest方法進行不精確找到。 例14.5 建立好的窗體,在編輯框中輸入一個不完整的用戶所在的公司標簽,並且按“不精確找到”按鈕,然後觀察一下找到的結果並注意記錄指標指向那一條記錄。反復試驗幾次便會理解GotoNearest是如何工作的。
|
後一頁 前一頁 回目錄 回首頁 |