Ehgrid使用方法

使用 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 sho

 

 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的自動寬度,卻沒有找到相就的方法(真的有可能是我沒有找到,如果本身就有的話請一定要用郵件通知我喔),所以就自已寫了一個,用起來還可以,數據量大的時候就會有些慢呢!

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