EhLib使用說明

KeyLife富翁筆記
作者: On2008
標題: EhLib使用說明
關鍵字:
分類: 個人專區
密級: 公開
(評分: , 回覆: 0, 閱讀: 308) »»

一、如何在程序中確定Ehlib定義的報表表頭顏色?

在執行打印之前,加上下面的語句:
DBGridEh1.FixedColor:=clLime;//clLime可以換成你想要的顏色比如clRed是紅色等等
PrintDBgridEh1.Options:=[pghColored,pghFitingByColWidths];//方括號裏的"pghColored"是必需的,其它的根據你的需要決定取捨
================================================================

二、Ehlib中的PrintDBGridEh如何印頁碼,即第幾頁共幾頁

PrintDBGridEh.PageFooter.CenterText:='第&[Page]頁 共&[Pages]頁'
在對象管理器中的相關位置有設
================================================================

三、本人剛學習使用ehlib包,現在要實現類似ehlib所帶demo1中一個功能:點擊dbgrid某列值
的下拉按紐(可以設置),彈出一個下拉列表(其內容是另一個dataset的)。我看demo1中
好象是使用了DBLookupComboboxEh,可我參看demo1怎麼設置也不行,請指教。謝謝。

呵呵,這個效果沒有用DBLoookupComboBoxEh,它是利用查找字段實現的。
它在Query1中,對應VName字段,增加了一個叫VName1的查找字段,這個
字段從qrVendors查找相關的數據,再在DBGridEh1顯示VName1,這樣顯示
就是那種效果了。
===============================================================

四、Ehlib 怎樣固定某幾列?

只要設置dbGridEh的FrozenCols屬性爲幾列即可.


EhLib 用戶指南
內容


--------------------------------------------------------------------------------



3 使用 TDBGridEh 組件
理解 TDBGridEh, TDataLink 以及 TDataSet.
All below text in equal degrees pertains as to TDBGridEh component as to TDBGrid component.
A TDBGridEh control lets you view and edit records in a dataset in a tabular grid format.
TDBGridEh does not story data in in itself, it only show data from dataset via TDataLink object. Every database control have internal TDataLink object to interaction with dataset. You can connect TDBGridEh to dataset using DataSource property. If you already use TStringGrid component you can see that data shows in TStringGrid and in TDBGridEh very similarly, but mechanism that use to show data in TStringGrid and in TDBGridEh very different. In TStringGrid count of rows is equal of rows in array of strings while in TDBGridEh (and TDBGrid) count of rows always not more then count of visible rows and although vertical scrollbar can display thumb position regarding the count of record in dataset it take info not from grid but directly from dataset. TDataSet don't allows us to work with data as with array of data i.e. we can not quickly get value of the field from certain record, some types of dataset have not even such notion as record number (in such datasets we can only know that we inhere in the begin of dataset or in the end of its or somewhere between, in that case DBGrid shows vertical vertical scrollbar only in three positions). But to have possibility to draw several record simultaneously TDataLink object allows to have buffer of records (record buffer window) with quick readonly access. DBGrid use this possibility of datalink and set size of record buffer window equal of count of visible rows in grid. We can not control what record must be first in this buffer, DataLink itself scroll record buffer window then we navigate through the dataset and it control the scrolling of record buffer window as that the active record as always in record buffer window. It is a reason why the active record change position when users change thumb position of vertical scrollbar using mouse.

TDBGridEh和縱向滾動條
If you works with different type of dataset you can notice that for some type of dataset DBGrid show vertical scrollbar validly but for over vertical scrollbar have only three position independently of record count in dataset. To set vertical scrollbar accomodation DBGrid use RecordCount and RecNo property of DataSet component. But some dataset and even same dataset under some condition holds -1 in RecordCount and RecNo. DataSet function IsSequenced indicates whether the underlying database table uses record numbers to indicate the order of records. When IsSequenced returns True, applications can safely use the RecNo property to navigate to records in the dataset and DBGrid use RecNo property to show thumb position in vertical scrollbar. But when IsSequenced returns False DBGrid can not define current record position and show vertical scrollbar in three positions. DBGridEh component have possibility to show proportional scrollbar for no sequenced dataset. To do it need to activate SumList and create list of record bookmars. Set SumList.Active to True and SumList.VirtualRecords to True. SumList will run through dataset and create list of record bookmarks, if you use client/sever technology to access database SumList will force dataset to fetch all records, so it operation can take much time. Keep in mind that VirtualRecords will work only for full relationship bookmarks dataset, it means that DataSet.ComapreBookmark function has to return > 0 if bookmark1 > bookmark1 (i.e. record to which indicates bookmark1 have to be after record to which indicates bookmark1), = 0 if bookmark1 = bookmark1, < 0 if bookmark1 = bookmark1. TBDEDataSet in most cases support full relationship bookmarks.


定製網格標題
複雜標題
TDBGridEh 允許在多列上創建標題,例如:

設置 DBGridEh.UseMultiTitle 屬性爲 True 並且填充字段的標籤或列標題的標題,可以使用下面的規則:字段標籤中的文本部分或列標題必須由幾部分組成,並且用 "|" 分割,幾個列的每一個通用部分都設置爲相同。其它字段或標題必須在相應的部分包含同樣的文本。

例如:

Field1.DisplayLabel := 'Title1|SubTitle1';
Field2.DisplayLabel := 'Title1|SubTitle2';

DBGridEh.Columns[0].Title.Caption := 'Title1|SubTitle1';
DBGridEh.Columns[1].Title.Caption := 'Title1|SubTitle2';
按鈕式標題
設置Column.Title.TitleButton 爲 True可以強制標題單元爲按鈕式。寫 OnTitleBtnClick事件來控制用戶單擊標題單元時的操作。

在標題中顯示位圖
To show bitmap in titles instead of caption use TitleImages property of TDBGridEh and ImageIndex property of TColumnTitleEh.

自動用位置標識排序標題.
TDBGridEh allows to show special sortmarking bitmaps (small triangles) in the right part of title cell. In order to automatically marking title by sortmarking bitmaps add dghAutoSortMarking to OptionsEh property. Add dghMultiSortMarking too in order to allow sortmarking several columns simultaneously. Set Column.Title.TitleButton to true for titles which will have possibility to change sortmarkers at run time. At runtime clicking on title will change sortmarking. Holding Ctrl key allows to mark several columns simultaneously. After user change sormarking grid call OnSortMarkingChanged event. You can write this event to change sorting and reopen in dataset. Use SortMarkedColumns property to access to sortmarked columns.

標題屬性的默認值
使用TDBGridEh.ColumnDefValues.Title來設置標題屬性的默認值。

定製網格頁腳
頁腳以及統計值
TDBGridEh allows to show special row (footer) or rows at bottom part. Use FooterRowCount property to specify the number of footer rows in the grid. Use Footer or Footers property of TColumnEh object to specify information which need to show in footer cells. Footers property useful then you have more then one footer rows. Footers is a collection of TColumnFooterEh objects where information from i-th aliment of collection will be show in i-th cell of footer column. In footer cell, it is possible to show: Sum value for specified field, record count, value of a specified field or static text. Use property Footer.ValueType or Footers[i].ValueType to specify which type of value will be show in footer cell. If ValueType = fvtStaticText, then set the property Value to specify text which need to show. If ValueType = fvtFieldValue, then you need to set property FieldName to specify field, value of which need to show. To force grid to calculate total values need to activate SumList (DBGridEh.SumList.Active := True). Set ValueType to fvtSum and grid must to show sum value of the column field in the footer cell, you can also specify Column.Footer.FieldName to calculate total value of the other field. Set ValueType to fvtCount to force grid to show count of records in the footer cell.


定製網格數據單元
在數據單元中顯示字段值爲圖形。
TDBGridEh allows to show bitmaps from TImageList component depending on field values. To show bitmaps depending on field values need: Fill list of field values to Column.KeyList property (every value in separate line) and set Column.ImageList property to ImageList control that has the bitmap in according index. Set Column.NotInKeyListIndex to index of bitmap that will be shown if field's value does not correspond to any value in KeyList (for instance you can set index of image for Null field value). At run time you are not allowed to edit bitmap in column cell. Use blank key and mouse click to set next value from Column.KeyList to the field; Shift-blank key and Shift-Mouse click to set previous value from Column.KeyList. Set Column.DblClickNextval to True have allows to change value on mouse double click.

檢查框式的邏輯及非邏輯值
Grid automatically shows checkboxes for boolean field. To show checkboxes for non boolean fields fill first line of Column.KeyList property that corresponds to the checked state of the checkbox, second line - non checked state, and set Column.Checkboxes ptoperty to True. Line of KeyList can represent more than one value in a semicolon-delimited list of items.

數據行高度
使用 RowHeight 和 RowLines 屬性來指定數據行高。完整的數據行高 = 行線高度+行高。設置 RowSizingAllowed 爲 True 以允許可以在運行是使用鼠標來改變行高。

設置Column.WordWrap爲True可以使數據行中文本多行顯示。如果行高>文本行,它就換行。

顯示備註字段
設置 DrawMemoText to True來顯示文本式的備註字段。.

定製單元格字體及顏色
TDBGridEh 中的 Font 和 Color 屬性描述了數據網格中繪製單元格的字體和顏色。
TColumnEh 中的 Font 和 Color 屬性描述了指定列中繪製單元格的字體和顏色。

事件定製單元格字體及顏色
有幾個事件可以讓你能夠在繪製單元格前定製單元格字體和顏色。你可以寫TDBGridEh的OnDrawColumnCellEvent事件句柄來在控制在網格單元中繪製數據。你可以使用Canvas屬性的方法來繪製單元格。但是如果你只想改變字體或顏色的屬性,我建議你使用下面的事件。你可以寫TDBGridEh的OnGetCellParams事件來控制在繪製數據單元以前所指定的操作。你可以改變繪製字體及背景色。這個事件適合你在想改變整行的字體或顏色時使用。如果你想改變指定列中單元格的屬性,你可以使用TColumnEh.OnGetCellParams。寫這個事件用來控制在一列數據單元被重繪或編輯時的操作。在一列數據單元被重繪以前,你可以改變繪製字體,背景色,對齊方式,圖像索引,文本或檢查框。在編輯一列數據單元以前,你可以改變編輯字體,背景色,文本或只讀狀態。

列屬性的默認值

使用ColumnDefValues屬性來設置列屬性的默認值。新創建的列將從ColumnDefValues屬性中獲得屬性值,並且直到第一次爲其指定值爲止。


在網格的適當位置放置編輯器.
在下拉列表中顯示幾個字段。
在下拉列表中顯示幾個下拉字段,需要設置列的LookupDisplayFields屬性到字段的Semicolons屬性來分割多個字段名。命名爲Column.Field.LookupResultField的屬性必須位於LookupDisplayFields列表中。多字段的下拉列表只能應用於下拉字段。

顯示下拉方式的列

你可以通過KeyList 和 PickList 屬性在相關的的字段中顯示其它文本。KeyList顯示包含在字段的值而非PickList索引所包含的值。 Column.NotInKeyListIndex to index of text from PickList that will be shown if field value do not contain in KeyList (for instance you can set index of text for Null field value). Set Column.DblClickNextval to True to change value on mouse double click.

下拉式計算器
對於 TDateField 和 TDateTimeField 字段,inplace 編輯器將顯示下拉按鈕以顯示顯示下拉計算器。設置 Column.ButtonStyle 爲 cbsNone 以禁止顯示下拉按鈕。

設置編輯器顏色和字體
Inplace編輯器可以設置數據單元的顏色和字體。數據單元使用OnGetCellParams 事件來控制列的顏色和字體。 Inplace 編輯器在行高>一行的高度時自動設置爲多行模式並且將列的屬性 WordWrap 設置爲True.


自動填充網格列寬到網格客戶區
設置AutoFitColWidths爲True以自動重置列寬來設置網格的寬度等於客戶區寬度。 MinAutoFitWidth 屬性決定網格的最小寬度,列寬將會被重新計算。
3D或平面外觀
使用 OptionsEh 屬性來顯示/隱藏固定的3D框架,冷區,頁腳以及數據行。

使用 Flat 屬性來設置用平面方式顯示數據網格。

從多種格式導入/導出數據到TDBGridEh。
EhLib 的函數集可以從DBGridEh導出數據到Text, Csv, HTML, RTF, XLS以及其內部格式。它可以保存數據到流(TStream對象)或文件。

例子
Pascal: SaveDBGridEhToExportFile(TDBGridEhExportAsText,DBGridEh1,'c:/temp/file1.txt',False);
C++: SaveDBGridEhToExportFile(__classid(TDBGridEhExportAsText),DBGridEh1,"c://temp//file1.txt",false);

EhLib 的函數集可以從 Text以及其內部格式的數據導入到DBGridEh的數據集中。它可以從文件中讀取數據或讀取數據到流(TStream對象)。

其它特性
用lookup 編輯器,你可以在運行時清空(設置爲Null) LookupKeyField 值。比如選擇整個文本然後按Delete鍵。

冷區
冷區是數據網格列集左邊顯示的不可滾動的區域。與固定列不同的是,冷區的列可以獲得編輯焦點。可以通過設置FrozenCols屬性來設置右邊不可滾動的列集。

增量搜索

TDBGridEh 允許用戶在網格列中實現特定的“增量”搜索。當用戶進入增量搜索時他可以顯示字符以及網格,並且在當前的列中查找文本。使用 dghIncSearch 和 dghPreferIncSearch的值(在OptionsEh 選項中) 在數據網格中操作增量搜索。 dghIncSearch 值允許在數據網格中進行增量搜索。運行時你能夠使用下面的鍵進行增量搜索:

Ctrl+F - 開始增量搜索。
Ctrl+Enter - 查找下一個匹配記錄。
Ctrl+Shift+Enter - 查找前一個匹配記錄。

如果OptionsEh選項中的 dghIncSearch 是隻讀的,那麼網絡將自動設置增量模式在第一次按鍵以及1.5秒後返回普通模式。 dghPreferIncSearch 值決定網格設置自動增量搜索模式在第一次按鍵時替代單元編輯。

水平或垂直滾動條
使用 VertSctollbar, HorzSctollbar 屬性來顯示/隱藏以及跟蹤水平或垂直滾動條。

多選
TDBGridEh 允許在選定的區域上進行選擇記錄,列以及矩形區域等操作:

允許多選會影響下面這些屬性:

Options選項中的dgMultiSelect屬性 - 設置是否允許多選。

Options選項中的dghClearSelection 屬性- 設置在用戶移到下一個單元時是否清除已選記錄。

Options選項中的EditActions屬性 -設置用戶可以在已選記錄上執行哪些操作(比如,拷貝,剪切,刪除,粘貼,全選等)。

Options選項中的AllowedSelections屬性-設置允許選定記錄的類型(比如,行,列,矩形區域等)。

Options選項中的Selection屬性-設置一個當前的多選狀態,已選記錄,列或矩形區域以及存取它們的屬性和函數。

從註冊表或ini文件中保存或恢復網格和列的層次。
TDBGridEh 有一個常規設置來從註冊表或ini文件中保存和恢復網絡以及列的層次:

RestoreColumnsLayout - 從註冊表中恢復列的次序,寬度,排序標誌。

RestoreColumnsLayoutIni - 從ini文件中恢復列的次序,寬度,排序標誌。

RestoreGridLayout - 從註冊表中恢復列的次序,寬度,可視,排序標誌,排序索引或行高。

RestoreGridLayoutIni - 從ini文件中恢復列的次序,寬度,可視,排序標誌,排序索引或行高。

SaveColumnsLayout - 保存列的次序,寬度,排序標誌到註冊表中。

SaveColumnsLayoutIni - 保存列的次序,寬度,排序標誌到ini文件中。

SaveGridLayout - 保存列的次序,寬度,可視,排序標誌,排序索引或行高到註冊表中。

SaveGridLayoutIni - 保存列的次序,寬度,可視,排序標誌,排序索引或行高到ini文件中。

當前版本的TDBGridEh不支持的特性:
這個版本的TDBGridEh不支持下面的特性:

TDBGridEh 不能設置每一個數據窗口中單獨行的行高。

TDBGridEh 不能象TreeView那樣工作。它不能擁有節點和枝葉。

TDBGridEh 不能橫向或縱向合併數據單元。

將已存在的TDBGrid組件轉換爲TDBGridEh組件:

儘管TDBGridEh並不是從TCustomDBGrid組件繼承而來的,但是在TDBGridEh和TDBGrid中還是有一些相似的屬性。

它允許僅用一點點代價來轉換已存在的TDBGrid組件到TDBGridEh。

可以按照下面的提示來轉轉換已存在的TDBGrid組件到TDBGridEh:

在Delphi的IDE中打開包含有TDBGrid組件的應用程序。

設置視圖方式爲文本方式(Alt-F12)。

將所有的TDBGrid對象改名爲TDBGridEh('比如,將object DBGrid1: TDBGrid'改爲 'object DBGrid1: TDBGridEh')

重新編譯你的應用程序。


--------------------------------------------------------------------------------

向前
向後
文檔翻譯:唐偉忠

內容

EhLib 用戶指南
Contents


--------------------------------------------------------------------------------



5 使用 TDBSumList 組件
TDBSumList說明
你可以使用TDBSumList在可視動態變化數據集中進行記錄統計。在你想查看的數據集中設置相關的數據字段,然後寫 SumListChanged 事件來指定在TDBSumList發生改變後所要做的操作。TDBSumList 的 SumCollection 屬性上一個 TDBSum 對象容器。每個 TDBSum 對象是一個可以指定集合值的元件。 FieldName 和 GroupOperation 決定了集合值的類型,SumValue 控制當前的集合值。

TDBSumList 被埋藏於 DBGridEh 組件中,因此所的下面有關TDBGridEh.SumList 的說明與TDBGirdEh的TDBGridEh.SumList 屬性的說明是一樣的。

如何工作以及爲什麼有時SumList的集合值計算不正確?
你知道 data-aware 控件與數據集是通過 TDataLink 對象相連接的。 TDataLink 不允許快速重新計算集合值。例如,當從數據集中刪除記錄時,數據集發送deDataSetChange事件給所有的TDataLink對象,在當前局部過濾發生改變時,同樣的事件也被髮送了。因此當 TDataLink 接收到該事件時,它不得不在所有的數據集中重新計算集合值,甚至於僅從數據集中刪除一條記錄。在激活後, TDBSumList 重載了數據集的下列事件: OnAfterEdit, OnAfterInsert, OnAfterOpen, OnAfterPost, OnAfterScroll, OnBeforeDelete, OnAfterClose。這種方法避免了在所有的數據集中它。在不需要它時,又會出現其它的問題,比如: T
運行時指定這些事件。在指定上述事件之一以前,關閉 SumList。
在下面的情形下,SumList 發出存取錯誤信息。 SumList 試着向數據集返回事件,但數據集數據並未被刪除。在SumList(或網格)以及數據集放置在不同的窗體(數據模塊)這種情況下,可以顯示數據。在這種情況下,試着在從數據集或數據模塊中數據集數據被刪除時關閉SumList。
如果你使用SetRange或ApplyRange事件,SumList 將不能跟蹤數據集中發生的變化。但可以調用 SumList.RecalAll 方法。
在非BDE數據集的主/明細表中,SumList 不能跟蹤數據變化。在主數據集激活狀態數據集發生變化後,調用 SumList.RecalAll 方法。
在任何其它情況下,如果你發現了其它SumList的計算值不正確,你都可以調用 RecalAll方法。


--------------------------------------------------------------------------------

向前
向後
翻譯:唐偉忠

Contents

EhLib 用戶指南
Contents


--------------------------------------------------------------------------------



5 使用 TDBSumList 組件
TDBSumList說明
你可以使用TDBSumList在可視動態變化數據集中進行記錄統計。在你想查看的數據集中設置相關的數據字段,然後寫 SumListChanged 事件來指定在TDBSumList發生改變後所要做的操作。TDBSumList 的 SumCollection 屬性上一個 TDBSum 對象容器。每個 TDBSum 對象是一個可以指定集合值的元件。 FieldName 和 GroupOperation 決定了集合值的類型,SumValue 控制當前的集合值。

TDBSumList 被埋藏於 DBGridEh 組件中,因此所的下面有關TDBGridEh.SumList 的說明與TDBGirdEh的TDBGridEh.SumList 屬性的說明是一樣的。

如何工作以及爲什麼有時SumList的集合值計算不正確?
你知道 data-aware 控件與數據集是通過 TDataLink 對象相連接的。 TDataLink 不允許快速重新計算集合值。例如,當從數據集中刪除記錄時,數據集發送deDataSetChange事件給所有的TDataLink對象,在當前局部過濾發生改變時,同樣的事件也被髮送了。因此當 TDataLink 接收到該事件時,它不得不在所有的數據集中重新計算集合值,甚至於僅從數據集中刪除一條記錄。在激活後, TDBSumList 重載了數據集的下列事件: OnAfterEdit, OnAfterInsert, OnAfterOpen, OnAfterPost, OnAfterScroll, OnBeforeDelete, OnAfterClose。這種方法避免了在所有的數據集中它。在不需要它時,又會出現其它的問題,比如: T
運行時指定這些事件。在指定上述事件之一以前,關閉 SumList。
在下面的情形下,SumList 發出存取錯誤信息。 SumList 試着向數據集返回事件,但數據集數據並未被刪除。在SumList(或網格)以及數據集放置在不同的窗體(數據模塊)這種情況下,可以顯示數據。在這種情況下,試着在從數據集或數據模塊中數據集數據被刪除時關閉SumList。
如果你使用SetRange或ApplyRange事件,SumList 將不能跟蹤數據集中發生的變化。但可以調用 SumList.RecalAll 方法。
在非BDE數據集的主/明細表中,SumList 不能跟蹤數據變化。在主數據集激活狀態數據集發生變化後,調用 SumList.RecalAll 方法。
在任何其它情況下,如果你發現了其它SumList的計算值不正確,你都可以調用 RecalAll方法。


--------------------------------------------------------------------------------

向前
向後
翻譯:唐偉忠

Contents

EhLib 用戶指南

內容

4 使用 TPrintDBGridEh 組件
在 Delphi 的 IDE 組件面板中選擇 TPrintDBGridEh 並拖放其到 form 上。在 其 DBGridEh 屬性中設置爲相應的 TDBGridEh 組件。使用 Print 以及 Preview 方法在打印機上打印網格或者在預覽窗體中預覽網格。
網格前以網格後的 RTF 文本
TPrintDBGridEh 允許在打印 / 打印預覽網格前或網格後的 RTF 文本。使用 AfterGridText 以及 BeforeGridText 屬性來指定文本。 你可以在打印 / 打印預覽時通過 BeforeGridText 和 AfterGridText 屬性來替換文本內容。
當前版本的 TPrintDBGridEh 不支持的特性。
這個版本不支持下面的特性:
TPrintDBGridEh 不能在一頁中打印 / 打印預覽多個網格。
問答列表 :
問 : 怎樣進行橫向打印 / 打印預覽?
答 : TPrintDBGridEh 並沒有專六的屬性來設置頁面特性。在調用打印或打印預覽方法前,你必須設置你將要執行打印的打印源( Orientation )。
uses ......, PrViewEh, Printers.
..............
procedure TForm1.bPreviewClick(Sender: TObject);
begin
PrinterPreview.Orientation := poLandscape;
PrintDBGridEh1.Preview;
end ;  



2005-7-4 11:02:45    
 發表評語&raquo;&raquo;&raquo;    

 2005-7-4 11:04:27    EhLib使用全攻略 最近閒來無事,就裝了一個 Ehlib 來玩。呵呵,沒想到,這麼個小東西一下子就把我迷住了,細細品來,的確是一個非常好的控件作品。作者厲害厲害啊~~


 
2003-12-5 15:17:00    
 發表評語&raquo;&raquo;&raquo;    

 2003-12-5 15:22:29    使用 TDBSumList 組件   還記得以前有朋友問過這樣一個問題:在 DBGrid 下如何像 Excel 一樣能夠做統計計算,實話說,使用 DBGrid 來做的話着實不易,不過現在有了這個咚咚,相信會簡單些。以下是摘錄的一些使用上的說明:

【TDBSumList說明】
    你可以使用TDBSumList在可視動態變化數據集中進行記錄統計。在你想查看的數據集中設置相關的數據字段,然後寫 SumListChanged 事件來指定在TDBSumList發生改變後所要做的操作。TDBSumList 的 SumCollection 屬性上一個 TDBSum 對象容器。每個 TDBSum 對象是一個可以指定集合值的元件。 FieldName 和 GroupOperation 決定了集合值的類型,SumValue 控制當前的集合值。

    TDBSumList 被埋藏於 DBGridEh 組件中,因此所的下面有關TDBGridEh.SumList 的說明與TDBGirdEh的TDBGridEh.SumList 屬性的說明是一樣的。

【如何工作以及爲什麼有時SumList的集合值計算不正確?】
    你知道 data-aware 控件與數據集是通過 TDataLink 對象相連接的。 TDataLink 不允許快速重新計算集合值。例如,當從數據集中刪除記錄時,數據集發送deDataSetChange事件給所有的TDataLink對象,在當前局部過濾發生改變時,同樣的事件也被髮送了。因此當 TDataLink 接收到該事件時,它不得不在所有的數據集中重新計算集合值,甚至於僅從數據集中刪除一條記錄。在激活後, TDBSumList 重載了數據集的下列事件: OnAfterEdit, OnAfterInsert, OnAfterOpen, OnAfterPost, OnAfterScroll, OnBeforeDelete, OnAfterClose。這種方法避免了在所有的數據集中它。在不需要它時,又會出現其它的問題,比如: T 運行時指定這些事件。在指定上述事件之一以前,關閉 SumList。
    在下面的情形下,SumList 發出存取錯誤信息。 SumList 試着向數據集返回事件,但數據集數據並未被刪除。在SumList(或網格)以及數據集放置在不同的窗體(數據模塊)這種情況下,可以顯示數據。在這種情況下,試着在從數據集或數據模塊中數據集數據被刪除時關閉SumList。
    如果你使用SetRange或ApplyRange事件,SumList 將不能跟蹤數據集中發生的變化。但可以調用 SumList.RecalAll 方法。
    在非BDE數據集的主/明細表中,SumList 不能跟蹤數據變化。在主數據集激活狀態數據集發生變化後,調用 SumList.RecalAll 方法。
    在任何其它情況下,如果你發現了其它SumList的計算值不正確,你都可以調用 RecalAll 方法。  

 
 2003-12-5 15:24:54    如何使用 Ehlib 實現自動排序   在 Ehlib 的 DataService 文件夾下提供了一些可以使數據集實現自動排序的文件。TDBGridEh 使用這些文件中的相關對象可以實現當排序標記發生變化時實現自動排序。

    如果你改變了數據網格及標題的排序標記而沒有書寫 OnSortMarkingChanged 事件,數據網格將嘗試自動進行數據排序。DBGridEhDataService 嘗試通過 GetDatasetFeaturesForDataSet 查找 TDataSet 中可以排序的特定的對象。正如你所知道的,TDataSet 不支持數據排序,但它的派生對象 TQuery 或 TClientDataSet 卻允許實現數據排序。使用過程 RegisterDatasetFeaturesEh ,你可以註冊 TDatasetFeaturesEhClass 類,該類可以實現對 TQuery, TADOQuery 以及 TClientDataSet 對象進行排序。簡單地通過 uses 子句添加 Ehlib...(EhlibBDE,EhlibADO,EhlibCDS)的單元之一到你的工程的任意單元中,與它們相連的數據網格將自動對該數據集進行排序。 EhLibBDE, EhLibADO, EhLibCDS 通過在單元數據集中調用 RegisterDatasetFeaturesEh 過程來實現初始化。對於其它數據集類型,你必須編寫、並註冊可以實現該數據集排序的新對象。書寫過程 T[你的數據集]DatasetFeaturesEh.ApplySorting ,你可以存取那些使用了 SortMarkedColumns 屬性的列以實現直接排序。你可以查看 DbUtilsEh 單元中的示例以明白如何編寫T[你的數據集]DatasetFeaturesEh 類及查看 EhLibBDE 單元以明白如何註冊 T[你的數據集]DatasetFeaturesEh 類。

引擎           數據集           單元文件

BDE            TQuery           EhLibBDE
ADO            TADOQuery        EhLibADO
ClientDataSet  TClientDataSet   EhLibCDS
DBExpress      TSQLQuery        EhLibDBX
InterBase      Express TIBQuery EhLibIBX

【譯【者注】:
    實際上,實現該功能非常簡單(以下我以BDE爲例說明如何實現自動排序):
    1.在窗體上放置一個 DBGridEh 組件,並將其連接到相應的 BDE 數據集;
    2.將該組件的[OptionsEn]中的 dgAutoSortMarking 屬性設置爲 True;
    3.雙擊該組件,在其彈出的屬性編輯器中添加相關字段;
    4.將要排序的字段的屬性列表的 [Title]的 TitleButton 屬性設置爲 True;
    5.最後,千萬不要忘了在 uses 子句中加上 EhlibBDE單元。

好了,使用上面的方法,你會發現原來通過 Ehlib 實現數據的自動排序居然如些簡單!

 
 2003-12-5 15:39:37    以下這段文字摘自《Delphi 園地》【定製網格標題 】--
-【複雜標題】
    TDBGridEh 允許在多列上創建標題,設置 DBGridEh.UseMultiTitle 屬性爲 True 並且填充字段的標籤或列標題的標題,可以使用下面的規則:字段標籤中的文本部分或列標題必須由幾部分組成,並且用 "|" 分割,幾個列的每一個通用部分都設置爲相同。其它字段或標題必須在相應的部分包含同樣的文本。

例如:
Field1.DisplayLabel := 'Title1|SubTitle1';
Field2.DisplayLabel := 'Title1|SubTitle2';

DBGridEh.Columns[0].Title.Caption := 'Title1|SubTitle1';
DBGridEh.Columns[1].Title.Caption := 'Title1|SubTitle2';

-【按鈕式標題】
    設置Column.Title.TitleButton 爲 True可以強制標題單元爲按鈕式。寫 OnTitleBtnClick事件來控制用戶單擊標題單元時的操作。

-【在標題中顯示位圖】
    To show bitmap in titles instead of caption use TitleImages property of TDBGridEh and ImageIndex property of TColumnTitleEh.

-【自動用位置標識排序標題】.
    TDBGridEh allows to show special sortmarking bitmaps (small triangles) in the right part of title cell. In order to automatically marking title by sortmarking bitmaps add dghAutoSortMarking to OptionsEh property. Add dghMultiSortMarking too in order to allow sortmarking several columns simultaneously. Set Column.Title.TitleButton to true for titles which will have possibility to change sortmarkers at run time. At runtime clicking on title will change sortmarking. Holding Ctrl key allows to mark several columns simultaneously. After user change sormarking grid call OnSortMarkingChanged event. You can write this event to change sorting and reopen in dataset. Use SortMarkedColumns property to access to sortmarked columns.

-【標題屬性的默認值】
    使用TDBGridEh.ColumnDefValues.Title來設置標題屬性的默認值。

【定製網格頁腳】--
-【頁腳以及統計值】
    TDBGridEh allows to show special row (footer) or rows at bottom part. Use FooterRowCount property to specify the number of footer rows in the grid. Use Footer or Footers property of TColumnEh object to specify information which need to show in footer cells. Footers property useful then you have more then one footer rows. Footers is a collection of TColumnFooterEh objects where information from i-th aliment of collection will be show in i-th cell of footer column. In footer cell, it is possible to show: Sum value for specified field, record count, value of a specified field or static text. Use property Footer.ValueType or Footers[i].ValueType to specify which type of value will be show in footer cell. If ValueType = fvtStaticText, then set the property Value to specify text which need to show. If ValueType = fvtFieldValue, then you need to set property FieldName to specify field, value of which need to show. To force grid to calculate total values need to activate SumList (DBGridEh.SumList.Active := True). Set ValueType to fvtSum and grid must to show sum value of the column field in the footer cell, you can also specify Column.Footer.FieldName to calculate total value of the other field. Set ValueType to fvtCount to force grid to show count of records in the footer cell.

-【定製網格數據單元】
    在數據單元中顯示字段值爲圖形。
    TDBGridEh allows to show bitmaps from TImageList component depending on field values. To show bitmaps depending on field values need: Fill list of field values to Column.KeyList property (every value in separate line) and set Column.ImageList property to ImageList control that has the bitmap in according index. Set Column.NotInKeyListIndex to index of bitmap that will be shown if field's value does not correspond to any value in KeyList (for instance you can set index of image for Null field value). At run time you are not allowed to edit bitmap in column cell. Use blank key and mouse click to set next value from Column.KeyList to the field; Shift-blank key and Shift-Mouse click to set previous value from Column.KeyList. Set Column.DblClickNextval to True have allows to change value on mouse double click.

【檢查框式的邏輯及非邏輯值】
    Grid automatically shows checkboxes for boolean field. To show checkboxes for non boolean fields fill first line of Column.KeyList property that corresponds to the checked state of the checkbox, second line - non checked state, and set Column.Checkboxes ptoperty to True. Line of KeyList can represent more than one value in a semicolon-delimited list of items.

【數據行高度】
    使用 RowHeight 和 RowLines 屬性來指定數據行高。完整的數據行高 = 行線高度+行高。設置 RowSizingAllowed 爲 True 以允許可以在運行是使用鼠標來改變行高。
    設置Column.WordWrap爲True可以使數據行中文本多行顯示。如果行高>文本行,它就換行。

【顯示備註字段】
    設置 DrawMemoText to True來顯示文本式的備註字段。.

【定製單元格字體及顏色】
    TDBGridEh 中的 Font 和 Color 屬性描述了數據網格中繪製單元格的字體和顏色。
    TColumnEh 中的 Font 和 Color 屬性描述了指定列中繪製單元格的字體和顏色。

【事件定製單元格字體及顏色】
    有幾個事件可以讓你能夠在繪製單元格前定製單元格字體和顏色。你可以寫TDBGridEh的OnDrawColumnCellEvent事件句柄來在控制在網格單元中繪製數據。你可以使用Canvas屬性的方法來繪製單元格。但是如果你只想改變字體或顏色的屬性,我建議你使用下面的事件。你可以寫TDBGridEh的OnGetCellParams事件來控制在繪製數據單元以前所指定的操作。你可以改變繪製字體及背景色。這個事件適合你在想改變整行的字體或顏色時使用。如果你想改變指定列中單元格的屬性,你可以使用TColumnEh.OnGetCellParams。寫這個事件用來控制在一列數據單元被重繪或編輯時的操作。在一列數據單元被重繪以前,你可以改變繪製字體,背景色,對齊方式,圖像索引,文本或檢查框。在編輯一列數據單元以前,你可以改變編輯字體,背景色,文本或只讀狀態。

【列屬性的默認值】
    使用ColumnDefValues屬性來設置列屬性的默認值。新創建的列將從ColumnDefValues屬性中獲得屬性值,並且直到第一次爲其指定值爲止。

【在網格的適當位置放置編輯器】--
-【在下拉列表中顯示幾個字段】
    在下拉列表中顯示幾個下拉字段,需要設置列的LookupDisplayFields屬性到字段的Semicolons屬性來分割多個字段名。命名爲Column.Field.LookupResultField的屬性必須位於LookupDisplayFields列表中。多字段的下拉列表只能應用於下拉字段。

-【顯示下拉方式的列】
    你可以通過KeyList 和 PickList 屬性在相關的的字段中顯示其它文本。KeyList顯示包含在字段的值而非PickList索引所包含的值。 Column.NotInKeyListIndex to index of text from PickList that will be shown if field value do not contain in KeyList (for instance you can set index of text for Null field value). Set Column.DblClickNextval to True to change value on mouse double click.

-【下拉式計算器】
    對於 TDateField 和 TDateTimeField 字段,inplace 編輯器將顯示下拉按鈕以顯示顯示下拉計算器。設置 Column.ButtonStyle 爲 cbsNone 以禁止顯示下拉按鈕。

【設置編輯器顏色和字體】
    Inplace編輯器可以設置數據單元的顏色和字體。數據單元使用OnGetCellParams 事件來控制列的顏色和字體。 Inplace 編輯器在行高>一行的高度時自動設置爲多行模式並且將列的屬性 WordWrap 設置爲True.

【自動填充網格列寬到網格客戶區】
    設置AutoFitColWidths爲True以自動重置列寬來設置網格的寬度等於客戶區寬度。 MinAutoFitWidth 屬性決定網格的最小寬度,列寬將會被重新計算。

【3D或平面外觀】
    使用 OptionsEh 屬性來顯示/隱藏固定的3D框架,冷區,頁腳以及數據行。
    使用 Flat 屬性來設置用平面方式顯示數據網格。

【從多種格式導入/導出數據到TDBGridEh】
    EhLib 的函數集可以從DBGridEh導出數據到Text, Csv, HTML, RTF, XLS以及其內部格式。它可以保存數據到流(TStream對象)或文件。

例子
Pascal: SaveDBGridEhToExportFile(TDBGridEhExportAsText,DBGridEh1,'c:/temp/file1.txt',False);
C++: SaveDBGridEhToExportFile(__classid(TDBGridEhExportAsText),DBGridEh1,"c://temp//file1.txt",false);

    EhLib 的函數集可以從 Text以及其內部格式的數據導入到DBGridEh的數據集中。它可以從文件中讀取數據或讀取數據到流(TStream對象)。

【其它特性】--
    用lookup 編輯器,你可以在運行時清空(設置爲Null) LookupKeyField 值。比如選擇整個文本然後按Delete鍵。

-【冷區】
    冷區是數據網格列集左邊顯示的不可滾動的區域。與固定列不同的是,冷區的列可以獲得編輯焦點。可以通過設置FrozenCols屬性來設置右邊不可滾動的列集。

-【增量搜索】
    TDBGridEh 允許用戶在網格列中實現特定的“增量”搜索。當用戶進入增量搜索時他可以顯示字符以及網格,並且在當前的列中查找文本。使用 dghIncSearch 和 dghPreferIncSearch的值(在OptionsEh 選項中) 在數據網格中操作增量搜索。 dghIncSearch 值允許在數據網格中進行增量搜索。運行時你能夠使用下面的鍵進行增量搜索:

         Ctrl+F - 開始增量搜索。
         Ctrl+Enter - 查找下一個匹配記錄。
         Ctrl+Shift+Enter - 查找前一個匹配記錄。

    如果OptionsEh選項中的 dghIncSearch 是隻讀的,那麼網絡將自動設置增量模式在第一次按鍵以及1.5秒後返回普通模式。 dghPreferIncSearch 值決定網格設置自動增量搜索模式在第一次按鍵時替代單元編輯。

【水平或垂直滾動條】
    使用 VertSctollbar, HorzSctollbar 屬性來顯示/隱藏以及跟蹤水平或垂直滾動條。

【多選】
    TDBGridEh 允許在選定的區域上進行選擇記錄,列以及矩形區域等操作:

×允許多選會影響下面這些屬性:
  Options 選項中的 dgMultiSelect 屬性 - 設置是否允許多選。
  Options 選項中的 dghClearSelection 屬性- 設置在用戶移到下一個單元時是否清除已選記錄。
  Options 選項中的 EditActions 屬性 -設置用戶可以在已選記錄上執行哪些操作(比如,拷貝,剪切,刪除,粘貼,全選等)。
  Options 選項中的 AllowedSelections 屬性-設置允許選定記錄的類型(比如,行,列,矩形區域等)。
  Options 選項中的 Selection 屬性-設置一個當前的多選狀態,已選記錄,列或矩形區域以及存取它們的屬性和函數。

【從註冊表或ini文件中保存或恢復網格和列的層次】
    TDBGridEh 有一個常規設置來從註冊表或ini文件中保存和恢復網絡以及列的層次:
      RestoreColumnsLayout - 從註冊表中恢復列的次序,寬度,排序標誌。
      RestoreColumnsLayoutIni - 從ini文件中恢復列的次序,寬度,排序標誌。
      RestoreGridLayout - 從註冊表中恢復列的次序,寬度,可視,排序標誌,排序索引或行高。
      RestoreGridLayoutIni - 從ini文件中恢復列的次序,寬度,可視,排序標誌,排序索引或行高。
      SaveColumnsLayout - 保存列的次序,寬度,排序標誌到註冊表中。
      SaveColumnsLayoutIni - 保存列的次序,寬度,排序標誌到ini文件中。
      SaveGridLayout - 保存列的次序,寬度,可視,排序標誌,排序索引或行高到註冊表中。
      SaveGridLayoutIni - 保存列的次序,寬度,可視,排序標誌,排序索引或行高到ini文件中。

『以下內容僅供參考了,因爲不知道它那個版本是多少,目前最新的版本是3.2吧,俺正在用,感覺很不錯啊~~』
  當前版本的TDBGridEh不支持的特性:
  TDBGridEh 不能設置每一個數據窗口中單獨行的行高。
  TDBGridEh 不能象TreeView那樣工作。它不能擁有節點和枝葉。
  TDBGridEh 不能橫向或縱向合併數據單元。

【將已存在的TDBGrid組件轉換爲TDBGridEh組件】:
    儘管TDBGridEh並不是從TCustomDBGrid組件繼承而來的,但是在TDBGridEh和TDBGrid中還是有一些相似的屬性。
    它允許僅用一點點代價來轉換已存在的TDBGrid組件到TDBGridEh。

【注意】:可以按照下面的提示來轉轉換已存在的TDBGrid組件到TDBGridEh:
    在Delphi的IDE中打開包含有TDBGrid組件的應用程序。
    設置視圖方式爲文本方式(Alt-F12)。
    if key=VK_RETURN then //Key:回車
    begin
      if (grdDetailData.SelectedIndex=grdDetailData.Columns.Count-1) and not (dgRowSelect in grdDetailData.Options) then
      BEGIN
        if (dgEditing in grdDetailData.Options) and (grdDetailData.Row=grdDetailData.RowCount-1) then //從表GRID能進行編輯和當前光標焦點在最後一行時
          acAddDetailExecute(self)
        else
        begin
          grdDetailData.Row:=grdDetailData.Row+1; //改變光標焦點行到下一行(當爲新增加時,這句不用運行
          grdDetailData.SelectedIndex:=0 //改變光標焦點列到第一列
        end;
      END ELSE
      BEGIN
        grdDetailData.SelectedIndex:=grdDetailData.SelectedIndex+1;
        while grdDetailData.Columns[grdDetailData.SelectedIndex].ReadOnly do
          grdDetailData.SelectedIndex:=grdDetailData.SelectedIndex+1;
      END;
      key:=0;
    end;
    if key=VK_INSERT then //Insert鍵:新增一條記錄
    begin
      acAddDetailExecute(self);
      key:=0;
    end;
    if key=VK_DELETE then //Delte: 刪除一條記錄
    begin
      acDeleteDetailExecute(self);
      key:=0;
    end;

【頁腳合計】
   1、設置DBGRIDEH屬性的FooterRowCount值爲1;
   2、設置DBGRIDEH屬性的SumList的Active值爲true;
   3、設置你要求和的該列的Footer的ValueType類型爲fvtSum;
   4、運行OK!
    在DataSet打開時寫:
      DBGridEh1.Columns[0].Footer.Value := IntToStr DBGridEh1.DataSource.DataSet.RecordCount);

 
 2003-12-5 16:56:13    Ehlib 的 DBGridEh 控件怎樣才能像 dxDBGrid 控件那樣輸出文件到 EXCEL以下是EHLIB的導出代碼:(其實EHLIB的DEMO1中已有)

procedure TInvoiceManager.ppmSaveSelectionClick(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,TDBGridEh(ActiveControl),
             SaveDialog1.FileName,False);
      end;
    end;
end;

 
 2003-12-5 17:05:48    Ehlib 在 Delphi 7 中的安裝(我可是花了半天的力氣才搞定的哦)Delphi 7中的安裝方法

   1. 把 EhLib 中的 common 和 DataService 文件拷貝到 Delphi7 目錄中.
   2.在 TOOLS->Environment Options->Library->Library Path 中添入EHLIB路徑。
   3.打開新建文件夾中的 EHLIB70.DPK ,編譯一下,但不要安裝。
   4.打開Ehlib中的DclEhLib70.DPK,編譯,安裝
   5. 在Delphi 7中打開DclEhLib70.dpk,編譯並安裝。
   6. 組件面板中出現一個EhLib的組件頁。
   7. 打開附帶的DEMOS,編譯並運行,測試安裝成功。
 

 
 2003-12-8 16:41:54    DBGridEh控件的頁腳屬性怎麼設?0、將dBGridEh.FooterRowCount := 1
1、將DBGridEh.SumList.Active := True;
2、將Columns[要求和的字段].Footer.ValueType := vtSum;
就行了

最後要注意,在FormCloseQuery事件中,一定要將SumList.Active := False,因爲在數據集中的數據多了以後,FormClose會讓DBGridEh釋放所有EhLib資源,會使得退出很慢,所以將SumList.Active := False不會引起退出很慢

 
 2003-12-10 11:22:37    如何實現在DbgridEh中不同的行顯示不同的顏色?或某一些條件的行顯示特定的顏色?【實現 DBGridEh 隔行分色顯示】
procedure TForm1.DBGridEh1GetCellParams(Sender: TObject; Column: TColumnEh;
 AFont: TFont; var Background: TColor; State: TGridDrawState);
begin
   if DBGridEh1.SumList.RecNo mod 2 = 1 then
     Background := $00FFC4C4
   else
     Background := $00FFDDDD;
end;


【DBGridEh 在某些條件下某行顯示特定顏色】
procedure TForm1.DBGridEh1GetCellParams(Sender: TObject; Column: TColumnEh; AFont: TFont; var Background: TColor; State: TGridDrawState);
begin

  //在 name 字段值爲 aaa 的行設置行背景色(ado 設置情況下)
  if ADOQuery1.FieldByName('name').AsString = 'aaa' then
      Background := $00FFC4C4

  //在 xm 字段值爲 Li ming 的行設置行背景色(bde 設置情況下)
  else if DBGridEh1.DataSource.DataSet.FieldByName('xm').AsString = 'Li ming'  then
     Background := $00FFC4C4
  else
     Background := $00FFDDDD;

end;  

 
 2003-12-10 14:19:28    DBGridEh 控件導出文件到 EXCEL 的補充說明(關於多表頭導出的設計思路)   如果表頭是着樣的:
      |Mergetitle|
      ------------
      Col1|Col2
    分析表頭幾層,然後根據其表頭的'|' 將,其還原成
      |Mergetitle|Mergetitle
      ----------------------
      Col1       |Col2
    再導入到Excel裏合併單元格即可!

 
 2003-12-10 14:55:16    在dbgrideh中允許選擇多行,如何知道哪些行被選中?是個BOOKMARK類型的屬性。
SelectedRows: TBookmarkList
procedure TForm1.Button1Click(Sender: TObject);
var
 i, j: Integer;
 s: string;
begin
 if DBGrid1.SelectedRows.Count>0 then
   with DBGrid1.DataSource.DataSet do
     for i:=0 to DBGrid1.SelectedRows.Count-1 do
     begin
       GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
       for j := 0 to FieldCount-1 do
       begin
         if (j>0) then s:=s+', ';
         s:=s+Fields[j].AsString;
       end;
       Listbox1.Items.Add(s);
       s:= '';
     end;
end;  

 
 2003-12-10 15:06:19    dbgrideh 上選擇多行之後,要求把所選擇的記錄全部添加入SQL數據庫的一個固定表中。dbgrideh.selectedrows記載了所有被選擇行的bookmark;利用SelectedRows和GotoBookmark完成。代碼如下:

procedure TForm1.Button1Click(Sender: TObject);
var
 i, j: Integer;
 s: string;
begin
 if DBGrid1.SelectedRows.Count>0 then
   with DBGrid1.DataSource.DataSet do
     for i:=0 to DBGrid1.SelectedRows.Count-1 do
     begin
       GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
       for j := 0 to FieldCount-1 do
       begin

         if (j>0) then s:=s+', ';
         s:=s+Fields[j].AsString;
       end;
       Listbox1.Items.Add(s);
       s:= '';
     end;
end;

 
 2004-2-11 12:45:10    在dbgrideh中直接點擊title就可按點擊的那個字段排序的方法第一種方法(未測試)
procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
begin
 //點擊GridEh標題排序
 if (Column.Title.SortMarker = smNoneEh) or (Column.Title.SortMarker = smDownEh) then
   begin
     ADOQuery1.SORT := COLUMN.FIELDNAME;
     Column.Title.SortMarker := smUpEh
   end
 else
   begin
     ADOQuery1.SORT := COLUMN.FIELDNAME + ' DESC';
     Column.Title.SortMarker := smDownEh
   end;
end;

第二種方法(未測試)
procedure TPrintMai_frm.DBGridEh1TitleClick(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
     DM.DataModule1.qry2.Sort := sortstring //dataset爲實際數據集變量名
   except
   end;
 end;
end;  

 
 2004-3-24 17:34:05    ehlib的顏色控制及打印From:
    http://www.delphibbs.com/keylife/iblog_show.asp?xid=191

      很多說根據條件在數據網格中顯示不同顏色的說法都是在DrawColumnCell事件裏,這樣顯示沒有問題,但在ehlib中如果想打印出來可就不行了。
ehlib提供了GetCellParams事件,可以顯示和打印
//只能顯示,不能打印
procedure TfrmQueryContractInfo.DBGrid1DrawColumnCell(Sender: TObject;
 const Rect: TRect; DataCol: Integer; Column: TColumnEh;
 State: TGridDrawState);
var
 OldColor,OldColumnColor:TColor;
 v:TColCellParamsEh;
begin
{  OldColor:=DBGrid1.Canvas.Font.Color ;
 if (Column.Field.FieldName = '填制調單時間') then
 if (DBGrid1.DataSource.DataSet.FieldByName('填制調單時間').AsDateTime >DBGrid1.DataSource.DataSet.FieldByName('應發貨時間').AsDateTime) then
 begin
   //v:=TColCellParamsEh.Create ;
   //Column.GetColCellParams(true,v);
   //v.Font.Color :=clRed;
   //Column.FillColCellParams(v);
   //v.Free;
   DBGrid1.Canvas.font.Color := clRed;
 end;

 //Column.GetColCellParams  .FillColCellParams()

 if (Column.Field.FieldName = '移交時間') then
 if (DBGrid1.DataSource.DataSet.FieldByName('移交時間').AsDateTime >DBGrid1.DataSource.DataSet.FieldByName('應移交時間').AsDateTime) then
   DBGrid1.Canvas.Font.Color := clRed;

 if (Column.Field.FieldName = '填制運輸單時間') then
 if (DBGrid1.DataSource.DataSet.FieldByName('填制運輸單時間').AsDateTime >DBGrid1.DataSource.DataSet.FieldByName('填制調單時間').AsDateTime) then
   DBGrid1.Canvas.Font.Color := clRed;

 DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
 DBGrid1.Canvas.Font.Color:=OldColor;
}
end;
//可以顯示,可以打印
procedure TfrmQueryContractInfo.DBGrid1GetCellParams(Sender: TObject;
 Column: TColumnEh; AFont: TFont; var Background: TColor;
 State: TGridDrawState);
var
 OldColor,OldColumnColor:TColor;
 v:TColCellParamsEh;
begin
 //OldColor:=DBGrid1.Canvas.Font.Color ;
 if (Column.Field.FieldName = '填制調單時間') then
 if (DBGrid1.DataSource.DataSet.FieldByName('填制調單時間').AsDateTime >DBGrid1.DataSource.DataSet.FieldByName('應發貨時間').AsDateTime) then
   AFont.Color := clRed;

 if (Column.Field.FieldName = '移交時間') then
 if (DBGrid1.DataSource.DataSet.FieldByName('移交時間').AsDateTime >DBGrid1.DataSource.DataSet.FieldByName('應移交時間').AsDateTime) then
   AFont.Color := clRed;

 if (Column.Field.FieldName = '填制運輸單時間') then
 if (DBGrid1.DataSource.DataSet.FieldByName('填制運輸單時間').AsDateTime >DBGrid1.DataSource.DataSet.FieldByName('填制調單時間').AsDateTime) then
   AFont.Color := clRed;

 if (Column.Field.FieldName = '實際到貨時間') then
 if (DBGrid1.DataSource.DataSet.FieldByName('實際到貨時間').AsDateTime >DBGrid1.DataSource.DataSet.FieldByName('要求到貨時間').AsDateTime) then
   AFont.Color := clRed;
 //DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
 //DBGrid1.Canvas.Font.Color:=OldColor;
end;  

 
 2004-3-29 20:12:46    DBGridEH 所有欄位自動寬度的實現interface
THackDBGridEH = class(TCustomdbgrideh)
end;

procedure OptimizeGrid(AGrid: TCustomDbGridEh);

implementation
procedure OptimizeGrid(AGrid: TCustomDbGridEh);
var
i: integer;
begin
// 優化GRID的寬度
for i := 0 to TDBGridEh(AGrid).Columns.count - 1 do
THackDBGridEH(AGrid).OptimizeSelectedColsWidth(TDBGridEh(AGrid).Columns[i]);
end;


從ehlib 3.0開始,DBGridEH的OptionEh中就多了一個dbgDblClickOptimizeColWidth選項,設為true,就可以雙擊一個標題的右邊線,自動此列的寬度.
但是我想一次性實現整個grid的自動寬度,卻沒有找到相就的方法(真的有可能是我沒有找到,如果本身就有的話請一定要用郵件通知我喔),所以就自已寫了一個,用起來還可以,數據量大的時候就會有些慢呢!

作者email :[email protected]
 



2005-5-23 10:17:38    
 發表評語&raquo;&raquo;&raquo;    

 2005-5-26 18:02:12    點擊DBGridEh標題實現排序KeyLife富翁筆記  
作者: tempmen
標題: 點擊GridEh標題排序
關鍵字:
分類: 個人專區
密級: 公開
(評分: , 回覆: 0, 閱讀: 145) &raquo;&raquo;
1。
if (Column.Title.SortMarker = smNoneEh) or (Column.Title.SortMarker = smDownEh) then
    begin
      ADOQuery1.SORT := COLUMN.FIELDNAME;
      Column.Title.SortMarker := smUpEh
    end
  else
    begin
      ADOQuery1.SORT := COLUMN.FIELDNAME + ' DESC';
      Column.Title.SortMarker := smDownEh
    end;  
2。
以下方法用來實現 點擊DBGrid列 按該列正序排序,再次點擊 逆序
procedure TFormMain.MyDBGridTitleClick(Column: TColumn);
var i:integer;
begin
  if AdoQCX.Sort = Column.FieldName then    //AdoQCX爲MyDBGrid綁定的Tadoquery
    begin
      For i:=0 to MyDBGrid.Columns.Count-1 do
        MyDBGrid.Columns[i].Title.RestoreDefaults;

      AdoQCX.Sort := Column.FieldName + ' DESC';
      Column.Title.Font.Color:=clPurple;    //用紫色表示 逆序 字段
    end
  else begin
    For i:=0 to MyDBGrid.Columns.Count-1 do
      MyDBGrid.Columns[i].Title.RestoreDefaults;

    AdoQCX.Sort := Column.FieldName;
    Column.Title.Font.Color:=clBlue;    //用藍色表示正序字段
    end;
end;

順便求教,有沒有好方法實現 用上下箭頭 代替顏色表示正序、逆序
前提是使用DBGrid控件,不是其他第三方控件  

3。
procedure TForm_main.DBGrid_topTitleClick(Column: TColumn);
var
 lInteger_count,lInteger_Length:integer;
 lString_All,lString_Last:string;
begin
 for lInteger_count := 0 to dbgrid_top.FieldCount - 1 do
  begin
   lInteger_Length := length(dbgrid_top.columns[lInteger_count].Title.Caption);
   lString_Last := copy(dbgrid_top.columns[lInteger_count].Title.Caption,lInteger_Length-2,3);
   lString_All := copy(dbgrid_top.columns[lInteger_count].Title.Caption,1,lInteger_Length-3);
   if dbgrid_top.columns[lInteger_count].FieldName = column.FieldName then
    begin
     if (lString_Last = ' ▼') then
      begin
       adoquery_main.Sort := column.FieldName + ' ASC';
       dbgrid_top.columns[lInteger_count].Title.Caption := lString_All + ' ▲';
      end
     else if (lString_Last = ' ▲') then
      begin
       adoquery_main.Sort := column.FieldName + ' DESC';
       dbgrid_top.columns[lInteger_count].Title.Caption := lString_All + ' ▼';
      end
     else
      begin
       adoquery_main.Sort := column.FieldName + ' ASC';
       dbgrid_top.columns[lInteger_count].Title.Caption := lString_All + lString_Last + ' ▲';
      end;
    end
   else
    begin
     if ((lString_Last = ' ▼') or (lString_Last = ' ▲')) then
      dbgrid_top.columns[lInteger_count].Title.Caption := lString_All;
    end;
  end;
end;
 

 
 2005-6-10 11:33:26    DBGRIDEH 組件在Borland開發工具中應用全攻略 【陳文彬】http://www.delphibbs.com/keylife/iblog_show.asp?xid=5161

 
 2005-6-18 11:43:26    DevExpress cxGrid 使用方法彙總http://www.delphibbs.com/keylife/iblog_show.asp?xid=3893

 
 2005-7-1 20:33:17    DBGridEh 應用實例 KeyLife富翁筆記  
作者: delsoft
標題: DBGridEH應用實例
關鍵字:
分類: 個人專區
密級: 公開
(評分: , 回覆: 0, 閱讀: 44) &raquo;&raquo;
DBGridEH應用實例
--------------------------------------------------------------------------------
作者:金軟在線   來源:softsky.com.cn   發佈日期:2005-4-1   點擊次數: 94
應用實例
    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型字段不可做上述設置,否則系統會提示錯誤。

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

 

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、重新編譯應用程序。

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

【原作者聯繫方式】
     Email:[email protected]  


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