熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

分享一下ExpressQuantumGrid4的cxGrid的一些使用方法和經驗

2013-11-11 21:04:59  來源: Delphi編程 
使用cxGrid有一些時間了在這裡總結一下使用cxGrid的一些方法希望給剛開始接觸cxGrid的人一些幫助

  簡單介紹cxGrid右下方的cxGridLevel是表示Grid表的層cxGrid可以有多層這相當於集合了PageControl的功能而cxGridLevel右邊的cxGridDBTableView相當於DBGrid一樣右擊cxGrid可以添加cxGridLevel右擊cxGridLevel可以選擇Create View Add level 或者Delete LevelAdd level可以增加子LevelCreate View裡面可以選擇很多不同總類的View其中

  )DB Table可以和數據庫連接的View更一般的DBGrid類似它比DBGrid多了比如鼠標中鍵可以用可以統計查詢等等功能

  )DB Banded Table 則可以實現比如



| 說明 | 說明 |

| 字段 | 字段 | 字段 | 字段 |

等類似的功能
   )DB Card View 則提供了卡片方式的顯示數據的功能這個用在比如人事檔案管理比較不錯

   )其它不一一贅述

  一些使用方法

  )有圖片和MEMO的例子
  拖入一個cxGridTableDataSource

  Table的DatabaseName設為DBDEMOSTableName設為biolifedbActive設為True;

  DataSource的DataSet設為Table

  cxGridDBTableView的DataController中的DataSource 設為DataSource;

  右擊cxGridDBTableView選擇Create All Columns

  雙擊cxGrid在彈出的窗口中找到 cxGridDBTableViewNotes和      cxGridDBTableViewGraphic將它們的Properties屬性設為BlobEdit

  運行看看結果

  再將cxGridDBTableViewGraphic的Properties屬性設為Image再將Properties下的Stretch設為True將cxGridDBTableView>optionsview>CellAutoHeight 設為True看看結果


  )如何讓Drag a column here to group by that column不顯示
  解決點擊cxGrid上的cxGridDBTableView
      在cxGridDBTableView>optionsview>groupbybox:=false即可
  注OptionsView裡面有很多屬性可能經常要用比如ColumnAutoWithNavigator等等慢慢琢磨吧:)

  )GroupPanel上面的英文[Drag a column header to group by that column]怎麼可以改成中文?
  解決最簡單的方法是 TcxGridTableViewOnCustomDrawPartBackground 也可用OnCustomDrawGroupCell

  procedure TFormcxGridDBTableViewCustomDrawPartBackground(Sender: TcxGridTableView; ACanvas: TcxCanvas;AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean);
  begin
   AViewInfoText:=動態設置 GroupBox 的顯示內容;
   ACanvasFillRect(AViewInfoBounds);
  end;

  )如何實現如下功能
        +財務部
        +原材料倉庫
        +成品庫
        +沖壓車間
        +軟件開發部
   這個是部門的名稱點擊加號就可以將本部門的人員情況顯示出來
   解決其實這是一個主從表關系
      填好主表的keyfieldnames
      填好從表的keyfieldnames
      填好從表的 detaikeyfieldNames與masterkeyfieldnames
      : 從表的數據源一定要按與主表關聯的字段排序
   注其它地方設置了主從表結構那樣就顯示不出來比如設置了從表的Table或者Query的mastersource和asterfield就會不能顯示數據!如果是兩個cxGrid的主從關系這樣設置就很OK了

  )統計功能
  解決cxGridDBTableView>optionsview>Footer 設為True
     cxGridDBTableView>DataController>Summary設置FooterSummaryItems即可

  )類似PageControl顯示
  解決增加一個Level將cxGrid>RootLevelOptions>DetailTabsPosition設為dtpTop然後相應的設置cxGridLevel和cxGridLevel的Caption值

  )如何設定左邊幾列不能滾動?
  解決使用DB Banded Table才可以實現
     在cxGridDBBandedTableView裡建立BandBand
     Band的Fixed=tfLeft
     Band的Fixed=tfnone
     設置要鎖定的字段的BandIndex=其它為就OK了

  )怎樣實現如EXCEL一樣的當前格=G+G+G 這樣的功能
  解決舉一個簡單的例子
  labelCaption := cxGridDBTableViewDataControllerValues[]                   + cxGridDBTableViewDataControllerValues[]                    + cxGridDBTableViewDataControllerValues[ ];
  所以不同cxGridDBTableView中的數據都可以給當前格這樣就做到了EXCEL中的當前格=G+G+G 類似的功能

  )鼠標右擊cxGridDBBandedTableView菜單裡的Edit Layout什麼用怎麼使用?
  解決可以拖動字段並列的可以拖成有層次感(一層層) 拖動時會顯示箭頭的就是說可以拖一個字段放到最上面就可以使記錄按此字段進行分組點擊其中一個字段上面還會出現一個上升或者下降的小三角形這個小三角形的作用是在運行階段數據就會按照這個字段上升或者下降排序還有一個Set as Default的作用是保持當前TableView的參數下此產生新的TableView的時候就會可以和上次保持的參數一樣

  )怎樣將cxGrid裡的數據導入到EXCELHTMLXML和TEXT
  解決這個問題在用了cxGrid以後變得異常簡單
   uses
    cxExportGridLink;

   procedure TFormButtonClick(Sender: TObject);
   begin
    ExportGridToEXCEL(d:\wangxslcxGridTrueTrue);
    ExportGridToTEXT(d:\wangtxtcxGridTrueTrue);
    ExportGridToXML(d:\wangxmlcxGridTrueTrue);
    ExportGridToHTML(d:\wanghtmlcxGridTrueTrue);
   end;

  )如何使滿足條件的數據顯示不同的顏色?
  解決
   var
    AYellowStyle: TcxStyle;

   procedure TFormFormCreate(Sender: TObject);
   begin
    //行顏色
    AYellowStyle := TcxStyleCreate(Self);
    AYellowStyleColor := $FFFF;
    AYellowStyleTextColor := clMaroon;
   end;

   procedure TFormcxGridDBBandedTableViewStylesGetContentStyle(
    Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
    Item: TcxCustomGridTableItem; out AStyle: TcxStyle);
   begin
    if ARecordValues[cxGridDBBandedTableViewLengthcmIndex] < then
     AStyle := AYellowStyle;
   end;

  這裡cxGridDBBandedTableViewLengthcmIndex小於時就顯示黃色

  問題)如何從外邊的TXT文件導入到cxGrid?
  解決 procedure CustomizeColumns;
       procedure LoadData;

   procedure TFormCustomizeColumns;
   const
    cDistance = ;
    cRadius = ;
    cPeriod = ;
    cPstring = ;
   var
    I: Integer;
   begin
    DecimalSeparator := ;
    with cxGridTableView do
    for I := to ColumnCount do
     if I in [cDistance cRadius] then
      Columns[I]DataBindingValueTypeClass := TcxIntegerValueType
      //列為Integer
     else
      if I in [cPstringcPeriod] then
      Columns[I]DataBindingValueTypeClass := TcxStringValueType
      //列為String
      else
       Columns[I]DataBindingValueTypeClass := TcxFloatValueType;
       //其他為Float
   end;

   procedure TFormLoadData;
   const
    AFileName = 資產負債表txt;
    AHeaderLineCount = ;

   var
    ARecords AValues: TStringList;
    I: Integer;

    procedure InitRecord(const Str: string);
    var
     J: Integer;
     V: Variant;
    begin
     AValuesCommaText := Str;
     for J := to AValuesCount do
      if AValuesStrings[J] <> then
     begin
     V := AValuesStrings[J];
     if not VarIsNull(V) then
      cxGridTableViewDataControllerValues[I J] := V;
     end;
    end;

   begin
    if not FileExists(AFileName) then
     raise ExceptionCreate(Data file not found);

    ARecords := TStringListCreate;
    AValues := TStringListCreate;

    with ARecords do
    try
     LoadFromFile(AFileName);
     cxGridTableViewBeginUpdate;
     cxGridTableViewDataControllerRecordCount := Count AHeaderLineCount;
     for I := to Count (AHeaderLineCount + ) do
      InitRecord(Strings[I + AHeaderLineCount]);
    finally
     cxGridTableViewEndUpdate;
     ARecordsFree;
     AValuesFree;
    end;
   end;

   procedure TFormFormCreate(Sender: TObject);
   begin
    CustomizeColumns;
    LoadData_Zcfz;
   end;

  其中資產負債表txt中的數據如下

  資  產  行次  年初數  期末數  負債及所有者權益  行次  年初數  期末數
             
  流動資產           流動負債          


  )如何改變列的顏色?
   var
    AFirstColumnStyle: TcxStyle;

    procedure TFormFormCreate(Sender: TObject);
    begin
     //列顏色
     AFirstColumnStyle := TcxStyleCreate(Self);
     AFirstColumnStyleColor := clAqua;
     AFirstColumnStyleTextColor := clBlue;
     cxGridTableViewColumns[]StylesContent := AFirstColumnStyle;
    end;

  )Set as default的用法?
  解決Set as default的用法是為了解決設置參數的方便而做的比如
連好數據庫以後更改cxGridDBBandedTableView>OptionsCustomize>ColumnFiltering 設為False(這個設置可以將字段名的下拉單給去掉)更改cxGridDBBandedTableView>OptionsView>Navigator 設置為True然後右擊cxGridDBBandedTableView在彈出的菜單欄裡面點擊Set as default
OK下次你再產生一個新的cxGridDBBandedTableView時這些設置和剛才的一樣了如果需要設置的參數很多的時候這個Set as default很有用!

  )怎樣使鼠標移動時相應的單元格裡的文字變色?
  解決
   var
    FTrackItem: TcxCustomGridTableItem;
    FTrackRec: TcxCustomGridRecord;

    procedure TFormcxGridDBTableViewCustomDrawCell(
    Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
   AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
  begin
   if (AViewInfoGridRecord = FTrackRec) and (AViewInfoItem = FTrackItem) then
   begin
    ACanvasFontColor := clred; //紅色字體
    ACanvasFontStyle := [fsUnderline];//帶下劃線
   end;
  end;

  procedure TFormcxGridDBTableViewMouseMove(Sender: TObject;
   Shift: TShiftState; X Y: Integer);
  var
   AHitTest: TcxCustomGridHitTest;
   ATrackItem: TcxCustomGridTableItem;
   ATrackRec: TcxCustomGridRecord;
  begin
   ATrackItem := FTrackItem;
   ATrackRec := FTrackRec;

   AHitTest := (Sender as TcxGridSite)GridViewViewInfoGetHitTest(X Y);
   if AHitTest is TcxGridRecordCellHitTest then
   begin
    FTrackItem := TcxGridRecordCellHitTest(AHitTest)Item;
    FTrackRec := TcxGridRecordCellHitTest(AHitTest)GridRecord;
   end
   else
   begin
    FTrackItem := nil;
    FTrackRec := nil;
   end;

   if (ATrackItem <> FTrackItem) or (ATrackRec <> FTrackRec) then
   begin
    // Invalidate old cell
    if ATrackRec <> nil then
     ATrackRecInvalidate(ATrackItem);
    // Invalidate new cell
    if FTrackRec <> nil then
     FTrackRecInvalidate(FTrackItem);
   end;
  end;


  )怎樣設計多表頭的cxGrid?
  解決cxGrid可以解決如下的表頭



| 說明 | 說明 |

| 字段 | 字段 | 字段 | 字段 |
|  字段   |  字段    |
|  字段   | 字段 | 字段 |

  實現這個很簡單你可以直接在上面拖動字段名拖動時會顯示箭頭的放入你想顯示的位置就OK了或者在鼠標右擊cxGridDBBandedTableView菜單裡的Edit Layout裡也可以拖放

  但是cxGrid不能實現如下的多表頭形式



| 說明 | 說明 |

| 說明 | 說明 | 說明 | 說明 |
| 字段 | 字段 |
| 字段 | 字段 | 字段 |

  不知道有誰能實現這樣的多表頭?


  )在主從表結構時當點開+時怎樣將焦點聚在相應主表的記錄上?
  解決
   var
    HitTest: TcxCustomGridHitTest;

   procedure TColumnsShareDemoMainFormtvProjectsMouseDown(Sender: TObject;
    Button: TMouseButton; Shift: TShiftState; X Y: Integer);
   begin
    // Note that the Sender parameter is a Site
    HitTest := (Sender as TcxGridSite)GridViewViewInfoGetHitTest(X Y);
    // The point belongs to the [+]/[] button area
    if HitTest is TcxGridExpandButtonHitTest then
     // Move focus to the record
     TcxGridExpandButtonHitTest(HitTest)GridRecordFocused := True;
    end;

  以上是在用cxGrid時候碰到的一些問題我總結了一部分還有很多問題等待解決在這裡我希望用過cxGrid的人幫著一起總結一下讓後學者可以少走點彎路!


From:http://tw.wingwit.com/Article/program/Delphi/201311/8449.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.