DBGridEh的使用

轉自:http://dongtaolan.blog.163.com/blog/static/28834824200991010429711/

DBGRIDEH 是Enlib 3.0組件包中的組件之一。Enlib 3.0組件包是一位俄國人爲增強Borland系列開發工具功能而開發的第三方組件,它具有界面友好、功能強大、開發效率高、、快速製作預覽/打印簡單中國式報表等特點。因此,一推出即受到廣大Borland程序員的青睞。目前這個版本支持Borland Delphi versions 4,5,6&7 和 Borland C++ Builder versions 4 & 5 ,可極大地提高數據庫應用系統客戶端的性能。許多商品軟件如《速達2000》等都使用了該組件。下面本人將使用該組件在實際系統開發過程中的經驗總結如下。

   Enlib3.0組件包中最重要而且功能最強大的莫過於dbgrideh組件,本文介紹的所有實例均在Delphi 7開發環境下調試通過。

一、DBGridEh(增強型表格組件)功能詳解
   DBGridEh組件無論在外觀上還是功能上都非常類似Borland開發工具中現有的dbgrid組件,它除了提供dbgrid組件的全部功能外,還增加了下列新功能:

● 任意選擇多行、列或矩形區域的數據.
● 爲多列標題設定共同的父標題行.
● 表格底部(Footer) 區顯示求和、計數和其它統計信息.
● 自動調整組件寬度與客戶區域等寬.
● 設置標題行、數據行的高度.
● 超長的標題行、數據行文本自動折行處理.
● 標題行可作爲按鈕使用,並可選擇是否顯示排序標誌符(▽降序△升序).
● 點擊列標題可對當前列自動排序而無需編寫代碼.
● 能夠自動設置刪除超長文本顯示不下的多餘部分,並以省略號(…)代替.
● 自動搜索字段(Lookup)數據單元格以單、多列字段下拉列表形式顯示.
● 自動搜索字段(Lookup)數據單元格可進行增量搜索.
● 可鎖定任意列數在屏幕水平方向不滾動.
● 日期時間控件DateTime picker 可支持TDateField and TDateTimeField兩種日期格式.
● 根據字段不同值顯示關聯的ImageList 對象圖片組中的圖片.
● 隱藏任意列.
● 顯示3D風格的數據區、表尾區和鎖定滾動列,製作3D外觀表格.
● 顯示Memo類型字段值.
● 除BOOLEAN型數據外,其它數據類型也可以檢查框( checkbox )形式顯示數據.
● 使用專門的函數和過程來存取以reg或ini文件格式保存的表格佈局(包含各數據列表、數據列訪問順序、列寬、索引標識、行高等信息)文件。
● 通過設置數據單元格的hint和ToolTips屬性,當移動鼠標到該單元格時,可以顯示單元格容納不下的文本內容.
● 將組件中數據導入/導出到Text, Csv, HTML, RTF, XLS 和內部數據等多種格式的文件中.

   DBGridEh組件主要屬性見下表(其它屬性參見dbgrid):

   DBGridEh組件事件基本與DBGrid相同,在此不再贅述。

二、應用實例
   Enlib3.0組件包安裝成功後,在系統的組件面板中會顯示“enlib”組件包標籤(如圖1),添加DBGridEh到窗體的方法與其它組件一樣。在窗體中添加該組件後,請跟我一起來實現圖2的一些特殊效果,具體屬性設置請參考屬性表的說明。

A、定製標題行
1、製作複雜標題行
   標題行可設爲2行以上高度,並可以爲多列創建一個共同的父標題行。爲實現這個效果,需在各個列標題屬性中以“|”分隔父標題和子標題,如辦公用品包括代碼和名稱兩部分,具體屬性設置如下:

usemultititile=true;
titlelines=2
DBGridEh.Columns[0].Title.Caption := '辦公用品|代碼';
DBGridEh.Columns[1].Title.Caption := '辦公用品|名稱';

2、標題行顯示圖片
   實現圖2中的購買人標題行顯示效果。首先添加一個imagelist組件img1並在其中添加一組bmp,ico格式的圖片。然後將DBGridEh的TitleImages設置爲img1.最後在需要顯示圖片的列標題的imageindex中設置需要顯示的img1中圖片的序號。按F9執行一下程序,是不是很酷!

3、自動顯示標題行的升降排序標誌符(▽降序△升序)並做相應排序
   DBGridEh組件可以在標題行單元格中顯示小三角形升、降排序標誌符圖片,在運行時可點擊標題行,圖片自動切換並做相應排序。具體屬性設置如下:

OptionsEh=dghAutoSortMarking
Column.Title.TitleButton=true

SortMarkedColumns 爲當前排序列可在運行時使用.
然後在該列的ontitleclick事件中添加代碼:
procedure TForm_Query.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh);
var
 sortstring:string; //排序列
begin
 //進行排序
 with Column do
 begin
   if FieldName = '' then
     Exit;
   case Title.SortMarker of
     smNoneEh:
     begin
       Title.SortMarker := smDownEh;
       sortstring := Column.FieldName + ' ASC';
     end;
     smDownEh: sortstring := Column.FieldName + ' ASC';
     smUpEh: sortstring := Column.FieldName + ' DESC';
   end;
 //進行排序
   try
     dataset.Sort := sortstring //dataset爲實際數據集變量名
   except
   end;
 end;
end;

切記lookup型字段不可做上述設置,否則系統會提示錯誤。

   另外,組件說明書中提到不需要編寫代碼即可自動排序,但是不編寫代碼自動排序方法我還沒找到,有知道的朋友煩請告訴我一聲啊!讓我也對程序代碼進行“減肥”。
(不編程自動排序是有的,將自動排序的屬性設置完以後,記得要USE中加入EhlibAdo或者EhlibBDE、EhlibCDS這些單元的使用,具體哪個根據使用的數據庫類型決定,但只能對查詢類進行排序,table類是不行的,會報錯。)  

 B、定製表格底部(footer)區域的彙總統計行
   DBGridEh 組件可以在表格底部顯示彙總行,如記錄數合計、列字段累加和等信息。在FooterRowCount中設置底部顯示的行數;然後在Footers 編輯器中添加一個或多個顯示列,顯示列可以是字段值累加和、記錄數合計、字段值或靜態文件等集合類型,可以在設計時在ValueType屬性中設置,也可在運行時通過設置Footers[i].ValueType指定其類型。其含義見下表:

   切記設置DBGridEh.SumList.Active 爲 True,纔會進行彙總統計運算。需注意的是,如顯示類型爲不是當前列的累加和,則需在fieldname屬性中指定彙總列,其它類型則無此要求。    


 C、定製表格數據單元外觀
1、根據不同字段值顯示相應的小圖片
   如根據庫存材料的不同狀態在數據單元格中顯示相應圖片,具體設置如下:
   添加一個imagelist組件img1並在其中添加一組bmp,ico格式的圖片。然後將需要顯示圖片的列的imagelist屬性設置爲img1;在keylist屬性中添加實際數據存儲值,一行爲一個值,切記一定要與imagelist中圖片順序一一對應,否則會張冠李戴,面目全非。還可在picklist中添加提示信息,也要求是一行爲一個值,並設tooltip爲true,那麼,運行時當鼠標移動到該數據單元格時在顯示圖片的同時還顯示提示信息,怎麼樣,功能夠強大吧!可使用空格鍵或鼠標切換下一張圖片,圖片切換的同時也改變了實際存儲數據值。也可通過shift+空格或鼠標切換爲上一張圖片。這樣就實現了上下兩個方向圖片切換。

2、顯示檢查框(checkbox)外觀
   對於Boolean型字段值在dbgrideh組件中自動顯示爲檢查框。通常情況下我們需將非Boolean型字段值也此外觀顯示,如性別字段爲字符型,字段值爲“男性”時爲選中,“女性”時爲未選中。需要在keylist編輯器中設置實際存儲數據值,第一行爲選中時的值“1”,第二行爲未選中的值“0”,第三行爲其它值“2”,支持三態顯示。

3、顯示單、多列下拉列表
   根據單元格字段值顯示與其相關的其它表字段內容,如部門代碼字段顯示爲部門名稱。首先需在當前表中新建立一個lookup型字段,設置好關聯表的字段和返回字段。多列下拉列表需在單列基礎上做進一步設置,在LookupDisplayFields中以“;”號將關聯表中多個字段分隔開,而且返回字段必須作爲其中的第一項。具體設置如下:

dropdownshowtitles=true
dropdownsizing=true
dropdownwidth=-1

   例:當前表中只有部門代碼無部門名稱列,需與部門表建立關聯,當點擊單元格時以部門代碼、部門名稱兩列下拉列表形式顯示。

4、顯示日曆下拉列表
   Date 和 DateTime類型字段值均可以此形式顯示。外觀與編輯框無異,當點擊該單元格時,右側會出現“▽”符號,點擊之即可出現日曆下拉列表。有時不希望出現日曆下拉列表,只需設置Column.ButtonStyle屬性爲 cbsNone即可,此方法同樣適用於其它組件不以特殊外觀顯示的情況。

5、3D或平面外觀效果
   設置OptionsEh屬性 中fixed, frozen, footer 和 data rows等屬性表格外觀爲3D效果,設置flat爲true則爲平面外觀效果.

6、鎖定多列不滾動
   當表格水平方向信息在一屏幕顯示不下時,此項功能非常有用。例如,工資表格中包含姓名、基本工資、績效工資等信息一屏幕顯示不下,需要通過移動水平滾動條顯示下一屏信息。如果不鎖定關鍵字段列如姓名,則移動到下一屏時就不知道此條記錄對應的姓名。因此,在實際應用中經常需鎖定多列不滾動。

   例:姓名字段爲表格第二列,則設置FrozenCols=2.這樣當一屏幕顯示不下,通過移動水平滾動條顯示下一屏信息時,表格前兩列不滾動,作爲參照列。

D、導入/導出數據
   導入/導出數據在實際處理過程中是比較煩瑣的。但是Enlib3.0提供了一系列函數讓你輕鬆實現此功能,而且支持的文件格式很多:Text, Csv, HTML, RTF, XLS 和內部數據格式。除此之外,還可對任意選擇的數據區域進行操作。函數如下:

Pascal: SaveDBGridEhToExportFile(TDBGridEhExportAsText,DBGridEh1,'c:\temp\file1.txt',False);

C++: SaveDBGridEhToExportFile(__classid(TDBGridEhExportAsText),DBGridEh1,"c:\\temp\\file1.txt",false);

說明:其中false參數表示導出的是選中的局部數據區域數據,true則爲整個表格數據。

  例:將當前表格中數據導出爲EXCEL等格式文件。
   在窗體中添加一個SaveDialog組件和“導出”按鈕B_exp,在“導出”按鈕的click事件中添加如下代碼:

procedure TForm1.B_expClick(Sender: TObject);
var
 ExpClass:TDBGridEhExportClass;
 Ext:String;
begin
 SaveDialog1.FileName := 'file1';
 if (ActiveControl is TDBGridEh) then
   if SaveDialog1.Execute then
   begin
     case SaveDialog1.FilterIndex of
       1: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
       2: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
       3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
       4: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
       5: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
     else
       ExpClass := nil; Ext := '';
   end;
   if ExpClass <> nil then
   begin
     if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <> UpperCase(Ext) then
       SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
     SaveDBGridEhToExportFile(ExpClass,DBGridEh1,SaveDialog1.FileName,False);
     //其中false爲局部數據
   end;
 end;
end;

E、將存在的DBGrid組件轉換爲DBGridEh組件.
   通過筆者上述介紹,想必你已經對Enlib組件包產生好感而且越越欲試了,那就趕快下載使用吧。但是,使用一段時間並且喜歡上它後,你又有新的問題產生了,那就是爲了保持界面風格一致,能否將已經開發完成的應用程序中的DBGrid組件能否轉換爲DBGridEh組件,進行一次徹底革命?答案是肯定的。儘管DBGridEh並不是繼承於CustomDBGrid組件, 但是DBGridEh和DBGrid它們之間有許多相同之處.因此可以相互轉換。

具體步驟如下:
1、在Delphi IDE下打開TDBGrid組件.
2、通過組合鍵Alt-F12將form 以文本方式顯示;
3、將所有TDBGrid 對象名改變爲 TDBGridEh對象名,如:DBGrid1: TDBGrid改爲 DBGrid1: TDBGridEh;
4、再次通過組合鍵Alt-F12將文本方式恢復爲form 顯示;
5、將form各相關事件中定義的所有TDBGrid改爲TDBGrideh,如DBGrid1: TDBGrid改爲DBGrid1: TDBGridEh;
6、重新編譯應用程序。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章