轉貼:EhLib使用全攻略

 

KeyLife富翁筆記 
作者: archonwang
標題: Ehlib 的使用
關鍵字: 前 言
分類: 個人專區
密級: 公開
(評分:★★★ , 回覆: 10, 閱讀: 4649) »»
   最近閒來無事,就裝了一個 Ehlib 來玩。呵呵,沒想到,這麼個小東西一下子就把我迷住了,細細品來,的確是一個非常好的控件作品。作者厲害厲害啊~~


 
2003-12-5 15:17:00   
 發表評語»»»    

 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   
  查看評語»»»    

 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]
 

 
 2007-1-15 23:27:40   

KeyLife富翁筆記 
作者: Delphizhou
標題: DBGrid的實用技巧
關鍵字: Delphi DBGrid
分類: 開發技巧
密級: 公開
(評分: , 回覆: 0, 閱讀: 137) &raquo;&raquo;
DBGrid的實用技巧

1.隔行不同顏色顯示
with TDBGrid(Sender) do
begin
if (gdSelected in State) or (gdFocused in State) then
Canvas.Brush.Color := clAqua
else if DataSource.DataSet.RecNo mod 2 = 0 then
Canvas.Brush.Color := $00F0F0F5
else
Canvas.Brush.Color := clWindow;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

2.Flat風格
屬性設置:
Ctrl3D = False
Options.dgColLines = False
Options.dgRowLines = False

type
TGridAccess = class(TCustomGrid);

Form.OnCreate:
with TGridAccess(DBGrid1) do
Options := Options + [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine];

3.去掉滾動條
private
{ Private declarations }
FGridWndProc: TWndMethod;
procedure GridWndProc(var Message: TMessage);

Form.OnCreate:
TGridAccess(DBGrid1).ScrollBars := ssNone;
FGridWndProc := DBGrid1.WindowProc;
DBGrid1.WindowProc := GridWndProc;

Form.OnDestroy:
DBGrid1.WindowProc := FGridWndProc;

procedure TForm1.GridWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_PAINT, WM_NCPAINT:
begin
SetScrollRange(DBGrid1.Handle, SB_HORZ, 0, 0, False);
SetScrollRange(DBGrid1.Handle, SB_VERT, 0, 0, False);
end;
end;
FGridWndProc(Message);
end;

4.鼠標移到某個單元格,指針形狀改變
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
Coord: TGridCoord;
begin
Coord := TDBGrid(Sender).MouseCoord(X, Y);
if (Coord.Y > 0) and (Coord.X = 1) and not TDBGrid(Sender).DataSource.DataSet.IsEmpty then
begin // Coord.X=1,dgIndicator=True時說明在第一列,False時說明在第二列
TDBGrid(Sender).Cursor := crHandPoint;
StatusBar1.SimpleText := 'Click to open curve form';
end
else
begin
TDBGrid(Sender).Cursor := crDefault;
StatusBar1.SimpleText := '';
end;
end;

5.Options.dgRowSelect=True時,點擊不同單元格列,執行不同的動作
DBGrid的OnMouseDown/OnMouseUp事件在點擊記錄單元格時不會觸發(點擊固定行列區會觸發),而Options.dgRowSelect=True時,OnCellClick事件的Column總是傳遞第一個列對象,即Column.Index=0,即使你點擊的是其他列,因此需要在OnCellClick中再判斷點擊的是哪個列,再根據不同列執行不同的動作。
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
Coord: TGridCoord;
P: TPoint;
begin
GetCursorPos(P);
Windows.ScreenToClient(TDBGrid(Sender).Handle, P);
Coord := TDBGrid(Sender).MouseCoord(P.X, P.Y);
if (Coord.Y > 0) and (Coord.X = 1) and not TDBGrid(Sender).DataSource.DataSet.IsEmpty then
// Coord.X=1,dgIndicator=True時說明在第一列,False時說明在第二列
ShowMessage(GridRate.Columns[0].Field.AsString);
end;

 

2006-1-5 15:50:45
查看評語&raquo;&raquo;&raquo;

2006-1-5 16:57:15 6.支持鼠標滾輪方法一:
private
{ Private declarations }
procedure GridMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);

Form.OnCreate:
TControlAccess(DBGrid1).OnMouseWheel := GridMouseWheel;

procedure TForm1.GridMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
TDBGrid(Sender).DataSource.DataSet.MoveBy(-WheelDelta div WHEEL_DELTA);
Handled := True;
end;

方法二:
private
{ Private declarations }
FGridWndProc: TWndMethod;
procedure GridWndProc(var Message: TMessage);

Form.OnCreate:
FGridWndProc := DBGrid1.WindowProc;
DBGrid1.WindowProc := GridWndProc;

Form.OnDestroy:
DBGrid1.WindowProc := FGridWndProc;

procedure TForm1.GridWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_MOUSEWHEEL:
begin
DBGrid1.DataSource.DataSet.MoveBy(-Smallint(Message.WParamHi) div WHEEL_DELTA);
end;
else FGridWndProc(Message);
end;
end;


2006-1-5 16:59:05 6.支持鼠標滾輪(補充)type
TControlAccess = class(TControl);


2006-1-17 10:39:50 隔行不同顏色顯示(2)鑑於DataSource.DataSet.RecNo可能無效,改用DataLink.ActiveRecord。

type
TDBGridAccess = class(TCustomDBGrid);

procedure TForm1.GridListDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with TDBGrid(Sender) do
begin
Canvas.Font.Color := clBlack;
if (gdSelected in State) or (gdFocused in State) then
Canvas.Brush.Color := clAqua
else if Odd(TDBGridAccess(Sender).DataLink.ActiveRecord) then
Canvas.Brush.Color := $00F0F0F5
else
Canvas.Brush.Color := clWindow;

DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;


2006-1-17 14:48:45 7.顯示行號unit HackGrid;

interface

uses Windows, SysUtils, Grids, DBGrids;

type
THackGrid = class
protected
class procedure NewSetColumnAttributes;
public
class procedure Hook(AIndicatorWidth: Integer);
class procedure Unhook;
class procedure DrawOrds(Sender: TObject; AState: TGridDrawState);
end;

implementation

var
GOldSetColumnAttributes: Pointer;
GIndicatorWidth: Integer;

type
TDBGridAccess = class(TCustomDBGrid);

{ THackGrid }

class procedure THackGrid.Hook(AIndicatorWidth: Integer);
var
obj: TObject;
vmt, vmtIndex: Integer;
method, newMethod: Pointer;
dwOldProtect: DWORD;
begin
GIndicatorWidth := AIndicatorWidth;
if GOldSetColumnAttributes <> nil then Exit;

obj := TDBGrid.Create(nil);
try
vmt := PInteger(obj)^;
asm
MOV vmtIndex,VMTOFFSET TDBGridAccess.SetColumnAttributes;
end;
method := Pointer(vmt + vmtIndex);
GOldSetColumnAttributes := PPointer(method)^;

VirtualProtect(method, 4, PAGE_READWRITE, dwOldProtect);
newMethod := @THackGrid.NewSetColumnAttributes;
PPointer(method)^ := newMethod;
VirtualProtect(method, 4, dwOldProtect, dwOldProtect);
finally
obj.Free;
end;
end;

class procedure THackGrid.Unhook;
var
obj: TObject;
vmt, vmtIndex: Integer;
method: Pointer;
dwOldProtect: DWORD;
begin
if GOldSetColumnAttributes = nil then Exit;

obj := TDBGrid.Create(nil);
try
vmt := PInteger(obj)^;
asm
MOV vmtIndex,VMTOFFSET TDBGridAccess.SetColumnAttributes;
end;
method := Pointer(vmt + vmtIndex);

VirtualProtect(method, 4, PAGE_READWRITE, dwOldProtect);
PPointer(method)^ := GOldSetColumnAttributes;
VirtualProtect(method, 4, dwOldProtect, dwOldProtect);
finally
obj.Free;
GOldSetColumnAttributes := nil;
end;
end;

class procedure THackGrid.NewSetColumnAttributes;
var
Grid: Pointer;
begin
asm
MOV Grid,EAX
CALL GOldSetColumnAttributes
end;
with TDBGridAccess(Grid) do
if (dgIndicator in Options) and (GIndicatorWidth > DBGrids.IndicatorWidth) then
ColWidths[0] := GIndicatorWidth;
end;

class procedure THackGrid.DrawOrds(Sender: TObject; AState: TGridDrawState);
var
FrameOffs: Integer;
R: TRect;
begin
with TDBGridAccess(Sender) do
begin
R := CellRect(0, DataLink.ActiveRecord+1);
if (gdFixed in AState) and ([dgRowLines, dgColLines] * Options =
[dgRowLines, dgColLines]) then
FrameOffs := 1 else
FrameOffs := 2;
R.Right := R.Right - 6{FIndicator.Width} - FrameOffs - 2;
DrawText(Canvas.Handle, PChar(IntToStr(DataLink.ActiveRecord+1)), -1, R,
DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
end;
end;

end.

使用:
procedure TForm1.FormCreate(Sender: TObject);
begin
THackGrid.Hook(28);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
THackGrid.Unhook;
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with TDBGrid(Sender) do
begin
Canvas.Font.Color := clBlack;
if DataCol = 0 then // 一行只畫一次
begin
Canvas.Brush.Color := clBtnFace;
THackGrid.DrawOrds(Sender, State);
end;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;


2006-1-23 16:24:07 7.顯示行號(2)上面的代碼在數據記錄數<DBGrid顯示行數的時候纔有效,汗!
下面的代碼經測試基本可行,不過在數據集執行Last,當前記錄已經在最後一條並且Eof=True時,再Insert插入,顯示的行號比實際的大1,主要在判斷是Insert插入還是Append添加的操作是通過判斷Eof進行的,這就會導致誤判,其他情況目前還沒有發現顯示不正確的。

unit MyGrid;

interface

uses Windows, Messages, Classes, SysUtils, DB, Grids, DBGrids;

type
TMyDBGrid = class(TDBGrid)
private
FIndicatorWidth: Integer;
FFirstRecNo: Integer;
FOldBeforeInsert: TDataSetNotifyEvent;
procedure DataSetBeforeInsert(DataSet: TDataSet);
function GetDataSource: TDataSource;
procedure SetDataSource(const Value: TDataSource);
procedure SetIndicatorWidth(const Value: Integer);
protected
procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
procedure SetColumnAttributes; override;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
public
constructor Create(AOwner: TComponent); override;
published
property IndicatorWidth: Integer read FIndicatorWidth write SetIndicatorWidth default 28;
property DataSource: TDataSource read GetDataSource write SetDataSource;
end;

implementation


{ TMyDBGrid }

constructor TMyDBGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FIndicatorWidth := 28;
end;

procedure TMyDBGrid.DataSetBeforeInsert(DataSet: TDataSet);
var
iRow: Integer;
begin
iRow := Row;
if dgTitles in Options then Dec(iRow);
FFirstRecNo := DataSet.RecNo - iRow;
if Assigned(FOldBeforeInsert) then FOldBeforeInsert(DataSet);
end;

procedure TMyDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
AState: TGridDrawState);
var
OldActive, iRow, RowNo: Integer;
begin
inherited DrawCell(ACol, ARow, ARect, AState);

if (dgIndicator in Options) then
begin
Dec(ACol);
if dgTitles in Options then Dec(ARow);

if Assigned(DataLink) and DataLink.Active and (ACol < 0) and (ARow >= 0) then
begin
if DataLink.DataSet.State = dsInsert then
begin
if DataLink.DataSet.Eof then // Append
begin
iRow := Row;
if dgTitles in Options then Dec(iRow);
RowNo := DataLink.DataSet.RecordCount - iRow + ARow + 1
end else // Insert
RowNo := FFirstRecNo + ARow;
end
else
begin
OldActive := DataLink.ActiveRecord;
try
DataLink.ActiveRecord := ARow;
RowNo := DataSource.DataSet.RecNo;
finally
DataLink.ActiveRecord := OldActive;
end;
end;

ARect.Right := ARect.Right - 6{FIndicator.Width} - 2{FrameOffs} - 2{Space};
DrawText(Canvas.Handle, PChar(IntToStr(RowNo)), -1, ARect,
DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
end;
end;
end;

function TMyDBGrid.GetDataSource: TDataSource;
begin
Result := inherited DataSource;
end;

procedure TMyDBGrid.SetColumnAttributes;
begin
inherited;
if (dgIndicator in Options) then
ColWidths[0] := FIndicatorWidth;
end;

procedure TMyDBGrid.SetDataSource(const Value: TDataSource);
begin
if Assigned(DataSource) and Assigned(DataSource.DataSet) then
DataSource.DataSet.BeforeInsert := FOldBeforeInsert;

if Assigned(Value) and Assigned(Value.DataSet) then
begin
FOldBeforeInsert := Value.DataSet.BeforeInsert;
Value.DataSet.BeforeInsert := DataSetBeforeInsert;
end else
FOldBeforeInsert := nil;

inherited DataSource := Value;
end;

procedure TMyDBGrid.SetIndicatorWidth(const Value: Integer);
begin
if FIndicatorWidth <> Value then
begin
FIndicatorWidth := Value;
if (dgIndicator in Options) then
ColWidths[0] := FIndicatorWidth;
end;
end;

procedure TMyDBGrid.WMSize(var Message: TWMSize);
var
OldRow: Integer;
begin
OldRow := Row;
inherited;
FFirstRecNo := FFirstRecNo - (Row - OldRow);
end;

end.

測試代碼:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls;

type
TForm1 = class(TForm)
DBNavigator1: TDBNavigator;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
DataSource1: TDataSource;
Button1: TButton;
Label1: TLabel;
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses MyGrid;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
with TMyDBGrid.Create(Self) do
begin
Parent := Panel1;
Align := alClient;
IndicatorWidth := 40;
Options := Options - [dgTitles];
DataSource := DataSource1;
end;
ADOTable1.Open;
Label1.Caption := IntToStr(ADOTable1.RecordCount);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOTable1.Append;
end;

end. 
 

 
 2007-3-23 0:04:30   

KeyLife富翁筆記 
作者: archonwang
標題: DBGRIDEH 組件在Borland開發工具中應用全攻略 【陳文彬】
關鍵字:
分類: 個人專區
密級: 公開
(評分:★★★★★ , 回覆: 16, 閱讀: 14877) &raquo;&raquo;

    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   
 發表評語&raquo;&raquo;&raquo;    

 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型字段不可做上述設置,否則系統會提示錯誤。

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

 
 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組件的一些體會,當然其功能還遠不止這些。歡迎朋友與我做進一步交流。

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

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yxj911/archive/2007/04/24/1583377.aspx

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