国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在DBGrid中可選中行而又可進入編輯狀態

2019-11-17 05:30:25
字體:
來源:轉載
供稿:網友

  如何在DBGrid中選中行,而又讓它可以進入編輯狀態?
  也許你會問我這有什么用?呵呵,做數據庫應用的兄弟們會深有感慨,當用DBGrid顯示的字段過多時,用戶不得不拉動最下面的滾動條,去看最右邊的東西,假如沒有設置DBGrid->Options[dgRowSelect],那么,拉到最右邊之后,很有可能看串行的;假如設置了DBGrid->Options[dgRowSelect],則在拉到最右邊之后,不會看串行,但是鼠標點擊其它行(不是當前選中行)時,DBGrid的視圖一下子就會回到顯示最左邊的那一列,確實很麻煩,用戶不得不一次又一次的拖運下面的滾動條。
  一同事因這個問題而苦惱,而我又在CSDN的文檔庫中看到了這篇文章:
  《DBGrid使用全書(五)》,鏈接:http://dev.csdn.net/article/51/51845.shtm,是Delphi版本的,核心代碼如下:
  type
   TMyDBGrid=class(TDBGrid);
  //////////////////////////////////
  //DBGrid1.Options->dgEditing=True
  //DBGrid1.Options->dgRowSelect=False
  PRocedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
   DataCol: Integer; Column: TColumn; State: TGridDrawState);
  begin
   with TMyDBGrid(Sender) do
   begin
     if DataLink.ActiveRecord=Row-1 then
     begin
       Canvas.Font.Color:=clWhite;
       Canvas.Brush.Color:=$00800040;
     end
     else
     begin
       Canvas.Brush.Color:=Color;
       Canvas.Font.Color:=Font.Color;
     end;
     DefaultDrawColumnCell(Rect,DataCol,Column,State);
   end;
  end;
  他的解決辦法是:曲線救國,取消DBGrid->Options[dgRowSelect],把當前選中行的背景繪制成藍色,就象是被選中一樣,想法確實很妙。我們公司使用C++Builder,我只好把這段代碼改為C++Builder版本的,這時,我才發現這段代碼的精妙之處。
  我發現DataLink屬性是TCustomDBGrid中聲明為protected的,而在DBGrid中并未聲明它的可見性,因此,不能直接使用它;而Row屬性則是在TCustomGrid中聲明為protected的,在TCustomGrid的子類中也未聲明它的可見性,那么,這段代碼為何在Delphi中運行的很好?
  原因就在于:ObjectPascal的單元封裝,在同一個單元中定義的類,互相之間是友員的關系,我們再來看這段代碼的開頭:
  type
   TMyDBGrid = class(TDBGrid);
  聲明了一個TMyDBGrid類,那么,當前這個窗體類就和TMyDBGird類互為友元了,那么當然當前窗體類可以直接訪問TMyDBGrid的私有屬性Row和DataLink了,一切都明了了,那么用C++就好實現了,核心代碼如下:
  void __fastcall TMainForm::LineSelEdit(TObject *Sender,const TRect &Rect, int DataCol, TColumn *Column,TGridDrawState State)
  {
      class TMyGridBase : public TCustomGrid
      {
      public:
          __property Row;
      };
      class TMyGrid : public TCustomDBGrid
      {
      public:
          __property DataLink;
      };
      TMyGrid *MyGrid = (TMyGrid*)Sender;
      TMyGridBase *MyGridBase = (TMyGridBase*)Sender;
      TDBGrid *Grid = (TDBGrid*)Sender;
  
      if(MyGrid->DataLink->ActiveRecord == MyGridBase->Row-1) {
          Grid->Canvas->Font->Color = clWhite;
          Grid->Canvas->Brush->Color = TColor(0x00800040);
      } else {
          Grid->Canvas->Brush->Color = Grid->Color;
          Grid->Canvas->Font->Color = Grid->Font->Color;
      }
  
      Grid->DefaultDrawColumnCell(Rect,DataCol,Column,State);
  }
  我把它封裝成一個函數,函數的參數與DBGrid的OnDrawDataCell的參數一樣,使用它的方法就是取消設置DBGrid->Options[dgRowSelect],然后設置DBGrid->DefaultDrawing = false,然后在這個DBGrid的OnDrawDataCell事件中調用這個函數,如下:
  void __fastcall TMainForm::DBGridDrawColumnCell(TObject *Sender,
        const TRect &Rect, int DataCol, TColumn *Column,
        TGridDrawState State)
  {
      this->LineSelEdit(Sender,Rect,DataCol,Column,State);
  }

示例代碼下載


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云南省| 陵川县| 清水河县| 南阳市| 西宁市| 浦北县| 嵊州市| 平乡县| 蒲城县| 松阳县| 丽水市| 大英县| 岫岩| 巴楚县| 秦皇岛市| 铜山县| 巩留县| 吉木萨尔县| 慈利县| 诏安县| 庐江县| 乾安县| 巴中市| 乐安县| 化隆| 双江| 瑞昌市| 卫辉市| 乌拉特前旗| 鄂托克旗| 靖安县| 琼中| 手机| 康保县| 阿瓦提县| 宝坻区| 沅江市| 金平| 宝山区| 双峰县| 阿拉尔市|