全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1366
推到 Plurk!
推到 Facebook!

Delphi中開發資料庫控制項的方法

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-25 12:12:38 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 Delphi中開發資料庫控制項的方法 Delphi作?一種目前十分流行的資料庫開發語言,在資料庫開發領域有著十分重要的地位,它不僅提供了視覺化的開發環境,使得開發變得相對容易;而且還是一種面向物件的語言, 使得程式師能夠充分利用面向物件編程的種種優勢——如封裝、繼承等等,從而大大減輕了開發的難度和工作量。下面,我們就談一談利用面向物件的特性來開發資料庫控制項方法。 Delphi本身提供了一些資料庫控制項,如DBGrid、Table等,它們給開發帶來了很多方便。下面我們來以一個能夠顯示資料表中的所有欄位的控制項?例來說明如何用Delphi來進行控制項的編程。 首先要?控制項選擇一個合適的父類。Windows的一個好處就在於它將許多操作標準化了,通過這些標準的操作,使得學習和使用都有章可循,用戶就很容易地能夠融會貫通地掌握整個系統。在Delphi中提供了許多控制項,這些控制項來生成應用程式足以滿足Windows編程的要求。而一些新的控制項也可以在此基礎上?生。它一方面繼承了一部分控制項的標準的操作,另一方面也在程式中加入一些代碼來實現特定的功能,這樣用戶使用起來不會覺得突兀,也簡化了程式的開發。根據我們的目標可以看出,利用“下拉清單”控制項作?新控制項的父類比較合適。因?它提供了下拉中的所有標準操作,這就可以大大減少我們的編程量。 然後就是?特定的功能編寫代碼。我們應該想到,如果一個下拉清單能夠顯示一個資料庫中的所有欄位,那?它一定有一個屬性能夠與資料庫相連。我們將這個屬性定名?DataSource,並將這一屬性添加到控制項中。添加的方法是,首先在Private段中加入如下代碼: FDataLink:TFieldDataLink; function GetDataSource:TDataSource; Procedure SetDataSource( Value:TDataSource); 其中TfieldDataLink是一個十分重要的類,我們之所以能夠很容易地進行資料庫的控制項的開發全是拜它之賜。它有一些十分有用的屬性,如:DataSource,利用這個屬性,我們就能很容易地指定新控制項的DataSource屬性。 第三步就是?控制項的功能編寫代碼。可以想到,如果我們想要在拉下下拉清單時顯示資料庫中的所有欄位,就要在它的DropDown事件中加入代碼來將所有的欄位加入到下拉清單的下拉區域中。這應該分兩步走,第一就是要取得指定資料庫的所有欄位,第二就是將這些欄位以字串的格式加入到下拉清單中。(而拉下時顯示所有欄位的功能則由下拉清單控制項自己完成)在取得資料庫的欄位時,用到了我們上面提到的TfieldDataLink類,下面的代碼就可以獲得指定資料庫的欄位數目: j:=0; j:=FDataLink.DataSource.DataSet .FieldCount ;//取得資料庫中的所有欄位的名字 i:=0; 然後再用下面的代碼將這些欄位的名字加入到下拉清單的items屬性中,值得注意的是在每次拉下這個下拉清單時都要將items屬性清空,否則這個下拉清單將每次都會因加入重復的內容而變得越來越長,並且一次選擇可以選定許多項。使得控制項看起來有點怪。 items.Clear ; //清空items屬性 repeat //迴圈操作將欄位加入下拉清單中。 items.Add (FDataLink.DataSet.Fields[i].FieldName ); //將欄位名加入到下拉清單中。 i:=I 1; until i〉j-1; //直到所有的欄位加入完?止 第四步,就是將以上代碼加入到Delphi的控制項編輯視窗中去,點擊Delphi的“Component/New Component”功能表,系統出現一個對話方塊,將對話方塊如圖 1 所示填寫: 圖 1 創建新控制項時的對話方塊 填寫完畢點擊“OK”按鈕,就可以創建一個文件,將上面提供的代碼加入到文件的適當位置,就可以完成這個控制項的編寫。圖2 是帶有這個控制項的程式的例子: 圖 2 能夠顯示資料庫欄位的程式 可以想見,這個控制項有著十分廣泛的功能,例如,我們能夠利用它設置指定欄位的值來運行查詢,也可以返回資料庫中指定欄位的資料類型、長度等資訊,給我們的編程提供了極大的方便。 但是也應該看到,這個控制項也有一些缺點,那就是它只能顯示欄位的名稱,一般的資料庫中欄位的名稱都是英文的,這給中文版的應用軟體帶來不便,下面我們就用FdataLink的另一個屬性來顯示中文化的欄位。這個屬性就是DisplayName,它所指定的是資料庫欄位的顯示名稱,而這個名稱我們可以在設計時將其漢化,這樣在應用程式中顯示出來的就是有意義的中文了。 下面我們將上面提供的一段代碼作如下修改: j:=0; j:=FDataLink.DataSource.DataSet .FieldCount ; i:=0; repeat items.Add (FDataLink.DataSet.Fields[I].DisplayName ); //在items屬性中加入DisplayName的值 i:=I 1; until i〉j-1; 另外,還要加入下面一段代碼,來判斷顯示的DisplayName和哪個FieldName相對應。 function TListBox1.GetField:string; var i,j:integer; begin j:=FDataLink.DataSource.DataSet .FieldCount ; for i :=0 to j-1 do begin if FDataLink.DataSource.DataSet.Fields[i].Displayname=text then begin Result:=FDataLink.DataSource.DataSet.Fields[i].FieldName; exit; end; end; end; 這樣,當選擇了一個中文化的欄位顯示名稱時,就將返回它的真正的欄位名。這下就更用起來就更方便了 圖3就是我們將中文欄位顯示在下拉清單中的例子。 圖3 一個能夠以中文顯示資料庫欄位的例子 程式中的欄位以中文顯示能夠給用戶帶來很大的方便。最後,下面附上這段程式的完整代碼,謹供參考,要說明的一點是,程式的每一行都不要隨意刪除,以防止影響正常使用。 unit DBFieldComboBox; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,db,dbctrls; type TDBFieldComboBox = class(TComboBox) private FDataLink:TFieldDataLink; function GetDataSource:TDataSource; function TListBox1.GetField:string; Procedure SetDataSource( Value:TDataSource); procedure StartDrag(Sender: TObject; var DragObject: TDragObject); procedure DropDown(Sender : TObject); { Private declarations } protected { Protected declarations } public constructor create(AOwner:TComponent);override; destructor Destroy;override; { Public declarations } published property DataSource :TDataSource read GetDataSource write SetDataSource; property text; { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TDBFieldComboBox]); end; constructor TDBFieldComboBox.create(AOwner:TComponent); var i,j:integer; begin inherited Create(AOwner); FDataLink:=TFieldDataLink.Create ; ondropdown:=dropdown; text:=''; end; destructor TDBFieldComboBox.Destroy; begin FDataLink.Free ; inherited Destroy; end; function TListBox1.GetField:string; var i,j:integer; begin j:=FDataLink.DataSource.DataSet .FieldCount ; for i :=0 to j-1 do begin if FDataLink.DataSource.DataSet.Fields[i].Displayname=text then begin Result:=FDataLink.DataSource.DataSet.Fields[i].FieldName; exit; end; end; end; procedure TDBFieldComboBox.SetDataSource ( Value:TDataSource); begin FDataLink.DataSource :=value; end; function TDBFieldComboBox.GetDataSource :TDataSource; begin Result:=FDataLink.DataSource ; end; procedure TDBFieldComboBox.StartDrag(Sender: TObject; var DragObject: TDragObject); begin end; procedure TDBFieldComboBox.DropDown(Sender: TObject); var i,j:integer; begin j:=0; j:=FDataLink.DataSource.DataSet .FieldCount ; i:=0; repeat items.Add (FDataLink.DataSet.Fields[i].DisplayName );//.FieldName); i:=I 1; until i〉j-1; end; end.
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-11-22 15:40:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!