1. 程式人生 > >【轉載】[轉]DBGridEh 的使用

【轉載】[轉]DBGridEh 的使用

1 序言
2 DBGridEh(增強型表格元件)功能詳解
3 應用例項
3.1 定製標題行
3.1.1 製作複雜標題行
3.1.2 標題行顯示圖片
3.1.3 自動顯示標題行的升降排序標誌符(▽降序△升序)並做相應排序
3.2 定製表格底部(footer)區域的彙總統計行
3.3 定製表格資料單元外觀
3.3.1 根據不同欄位值顯示相應的小圖片
3.3.2 顯示檢查框(checkbox)外觀
3.3.3 顯示單、多列下拉列表
3.3.4 顯示日曆下拉列表
3.3.5 3D或平面外觀效果
3.3.6 鎖定多列不滾動
3.4 匯入/匯出資料
3.5 將存在的DBGrid元件轉換為DBGridEh元件
4 後記

返回目錄

1 序言
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開發環境下除錯通過。

返回目錄

2 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 和內部資料等多種格式的檔案中.
返回目錄

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

返回目錄

3.1 定製標題行
返回目錄

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

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

返回目錄

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

返回目錄

3.1.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型欄位不可做上述設定,否則系統會提示錯誤。

另外,元件說明書中提到不需要編寫程式碼即可自動排序,但是不編寫程式碼自動排序方法我還沒找到,有知道的朋友煩請告訴我一聲啊!讓我也對程式程式碼進行“減肥”。

返回目錄

3.2 定製表格底部(footer)區域的彙總統計行
DBGridEh 元件可以在表格底部顯示彙總行,如記錄數合計、列欄位累加和等資訊。在FooterRowCount中設定底部顯示的行數;然後在Footers 編輯器中新增一個或多個顯示列,顯示列可以是欄位值累加和、記錄數合計、欄位值或靜態檔案等集合型別,可以在設計時在ValueType屬性中設定,也可在執行時通過設定Footers[i].ValueType指定其型別。其含義見下表:

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

返回目錄

3.3 定製表格資料單元外觀
返回目錄

3.3.1 根據不同欄位值顯示相應的小圖片
如根據庫存材料的不同狀態在資料單元格中顯示相應圖片,具體設定如下:

新增一個imagelist元件img1並在其中新增一組bmp,ico格式的圖片。然後將需要顯示圖片的列的imagelist屬性設定為img1;在keylist屬性中新增實際資料儲存值,一行為一個值,切記一定要與imagelist中圖片順序一一對應,否則會張冠李戴,面目全非。還可在picklist中新增提示資訊,也要求是一行為一個值,並設tooltip為true,那麼,執行時當滑鼠移動到該資料單元格時在顯示圖片的同時還顯示提示資訊,怎麼樣,功能夠強大吧!可使用空格鍵或滑鼠切換下一張圖片,圖片切換的同時也改變了實際儲存資料值。也可通過shift+空格或滑鼠切換為上一張圖片。這樣就實現了上下兩個方向圖片切換。

返回目錄

3.3.2 顯示檢查框(checkbox)外觀
對於Boolean型欄位值在dbgrideh元件中自動顯示為檢查框。通常情況下我們需將非Boolean型欄位值也此外觀顯示,如性別欄位為字元型,欄位值為“男性”時為選中,“女性”時為未選中。需要在keylist編輯器中設定實際儲存資料值,第一行為選中時的值“1”,第二行為未選中的值“0”,第三行為其它值“2”,支援三態顯示。

返回目錄

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

dropdownshowtitles=true
dropdownsizing=true
dropdownwidth=-1

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

返回目錄

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

返回目錄

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

返回目錄

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

例:姓名欄位為表格第二列,則設定FrozenCols=2.這樣當一螢幕顯示不下,通過移動水平滾動條顯示下一屏資訊時,表格前兩列不滾動,作為參照列。

返回目錄

3.4 匯入/匯出資料
匯入/匯出資料在實際處理過程中是比較煩瑣的。但是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;


返回目錄

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

具體步驟如下:

在Delphi IDE下開啟TDBGrid元件;
通過組合鍵Alt-F12將form 以文字方式顯示;
將所有TDBGrid 物件名改變為 TDBGridEh物件名,如:DBGrid1: TDBGrid改為 DBGrid1: TDBGridEh;
再次通過組合鍵Alt-F12將文字方式恢復為form 顯示;
將form各相關事件中定義的所有TDBGrid改為TDBGrideh,如DBGrid1: TDBGrid改為DBGrid1: TDBGridEh;
重新編譯應用程式。


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相同,在此不再贅述。




2004-1-2 11:32:00
發表評語»»»

2004-1-2 11:33:10


2004-1-2 11:33:33


2004-1-2 11:37:47 二、應用例項
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類是不行的,會報錯。)


2004-1-2 11:38:16


2004-1-2 11:39:41 B、定製表格底部(footer)區域的彙總統計行
DBGridEh 元件可以在表格底部顯示彙總行,如記錄數合計、列欄位累加和等資訊。在FooterRowCount中設定底部顯示的行數;然後在Footers 編輯器中新增一個或多個顯示列,顯示列可以是欄位值累加和、記錄數合計、欄位值或靜態檔案等集合型別,可以在設計時在ValueType屬性中設定,也可在執行時通過設定Footers[i].ValueType指定其型別。其含義見下表:

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


2004-1-2 11:43:13


2004-1-2 11:47:50 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、重新編譯應用程式。

以上只是本人在實際程式開發過程中使用dbgrideh元件的一些體會,當然其功能還遠不止這些。歡迎朋友與我做進一步交流。


點dbgrideh標題排序
在網上看了許多這方面的技術資料,囉索而麻煩,其實就這麼幾行搞定:

procedure Sort(grid: TDBGridEh);
begin
Grid.OptionsEh := Grid.OptionsEh + [dghAutoSortMarking];
Grid.ColumnDefValues.Title.TitleButton := True;
Grid.OptionsEh := Grid.OptionsEh + [dghMultiSortMarking];
Grid.SortLocal:=True;
end;

//--------------------------------------------------------------------------------
// 功能:設定 DbGridEh 合計行資訊
// 引數: pDbGrid:TDBGridEh;
// pcFields : string ; 欄位列表,欄位用逗號分隔
// pvtType : TFooterValueType ; 統計型別 TFooterValueType = (fvtNon, fvtSum, fvtAvg, fvtCount, fvtFieldValue, fvtStaticText);
// 引用:StrToStringList
// 例如:DbGridEhFoot( DbGridEh1, 'Number,Sum', fvtSum ); 設定數量和金額欄位為合計統計
//--------------------------------------------------------------------------------
Procedure DbGridEhFoot( pDbGrid:TDBGridEh; pcFields: string; pvtType : TFooterValueType );
var nFldLoop : integer ;
cFieldName : string ;
tmpFldList : TStrings ;
begin
pDbGrid.FooterRowCount := 1; // 指定網格尾部統計行行數
pDbGrid.SumList.Active := true; // 啟用統計
pDbGrid.FooterColor := clBtnFace ; // 指定統計行顏色

tmpFldList := TStringList.Create ;
StrToStringList( Uppercase(pcFields),',',tmpFldList ); // 將字串轉換為串列表

For nFldLoop := 0 to pDbGrid.Columns.Count -1 do
begin
cFieldName := pDbGrid.Columns[nFldLoop].FieldName ; // 網格列欄位名
if tmpFldList.IndexOf( uppercase( cFieldName ) ) >= 0 then
begin
pDbGrid.Columns[nFldLoop].Footer.ValueType := pvtType ; // 統計型別
end;
end ;
tmpFldList.Free ;
end;

//--------------------------------------------------------------------------------
// 功能:將指定分隔符分隔的字串轉換為字串列表。
// 此函式在需要將
// 引數:
// pcString : string; 字串
// pcChar : string; 分隔符
// pDesList : TStringList 字串列表
// 例如:
// var tmpFldList : TStrings ;
// begin
// tmpFldList := TStringList.Create ;
// StrToStringList( Uppercase(pcFields), ',' , tmpFldList );
// ......
// tmpFldList.Free ;
// end;
//--------------------------------------------------------------------------------
Procedure StrToStringList( pcString,pcChar:string; pDesList : TStringList ) ; overload ;
var cAddStr,cSrcStr : string ;
nPos : integer ;
begin
pDesList.Clear ;

cSrcStr := pcString ;
while True do
begin
nPos := pos( pcChar, cSrcStr );
if nPos = 0 then begin
pDesList.Add( cSrcStr ) ;
Exit ;
end
else begin
cAddStr := copy( cSrcStr,1, nPos - 1 );
pDesList.Add( cAddStr ) ;
Delete( cSrcStr,1, nPos + length( pcChar )-1 );
end;
end;
end;
//Splits a delimited text line into TStrings (does not account for stuff in quotes but it should)

procedure Split(aValue: string; aDelimiter: Char; var Result: TStrings);
var
X: Integer;
S: string;
begin
if Result = nil then
Result := TStringList.Create;
//Result.Clear;
S := '';
for X := 1 to Length(aValue) do
begin
if aValue[X] <> aDelimiter then
S := S + aValue[X]
else
begin
Result.Add(S);
S := '';
end;
end;
if S <> '' then
Result.Add(S);
end;

procedure TfrmBdDetail.DBGridEh1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin
if adoquery1.fieldbyname('合計數量').AsInteger> adoquery1.fieldbyname('KC').AsInteger then
begin
(Sender as TDBGridEH).Canvas.Brush.Color := $008080FF;
end;
DBGridEh1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;


2007-11-16 17:18:59 {*******************************************************}
{ }
{ 格式顯示 }
{ }
{ 版權所有 (C) 2007 詠南工作室(陳新光) }
{ }
{*******************************************************}

unit uDataProcess;

interface

uses
DB;

procedure SetDisplayFormat(ADataset:TDataSet);

implementation

procedure SetDisplayFormat(ADataset:TDataSet);
var
i:Integer;
begin
for i:=0 to ADataset.FieldCount-1 do begin
with ADataset do begin
if (Fields[i] is TNumericField) and (not (Fields[i] is TIntegerField)) then
(Fields[i] as TNumericField).DisplayFormat := '###,##0.00';
if (Fields[i] is TFloatField) then
(Fields[i] as TFloatField).DisplayFormat := '###,##0.00';
if (Fields[i] is TCurrencyField) then
(Fields[i] as TCurrencyField).DisplayFormat := '¥###,##0.00';
end;
end;
end;

end.

在 DBGridEH 中怎樣實現多重排序(標題出現0123等排列序號)?
Ctrl + 用滑鼠點要排序的標頭!

讓dbgrid顯示序號
修改GRID.pas
在TCustomGrid.SetColWidths事件改為:
procedure TCustomGrid.SetColWidths(Index: Longint; Value: Integer);
begin
if FColWidths = nil then
UpdateExtents(FColWidths, ColCount, DefaultColWidth);
if Index >= ColCount then InvalidOp(SIndexOutOfRange);
if Value <> PIntArray(FColWidths)^[Index + 1] then
begin
if Value < 12 then Value := 30; //新增
ResizeCol(Index, PIntArray(FColWidths)^[Index + 1], Value);
PIntArray(FColWidths)^[Index + 1] := Value;
ColWidthsChanged;
end;
end;

修改DBGRID.pas
在procedure TCustomDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);事件加
找到下面這一行
FIndicators.Draw(Canvas, ALeft,
(ARect.Top + ARect.Bottom - FIndicators.Height) shr 1, Indicator, True);
if ACol <0 then
begin
Canvas.TextRect(ARect,0,(ARect.Top + ARect.Bottom - FIndicators.Height) shr 1
,inttostr(self.DataSource.DataSet.RecNo));
end; //新增