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

Delphi中DBGrid中行的定位及著色實現

2013-11-11 21:04:47  來源: Delphi編程 
問題的提出
  在對一個數據庫系統進行操作的時候發現不能對DBGrid控件中的數據行定位及在定位到某行後無法對當前行進行明顯的標志(例如改變顏色)在往上查找了很多資料發現基本沒有對這個內容的介紹包括一些動態設頂行的顏色等文章講的都是在數據初始化時做的操作而沒有在數據源刷新後的重新定位功能所以下決心解決這個問題通過一上午對DELPHI幫助的研究和查看相關的資料稍有小成現寫出來和各位同行共同學習不當之處請多指教
  
   解決的辦法
  首先查找Ttable和Tquery控件沒有發現能夠直接定位數據行的方法同樣查找DBGrid也沒有找到相應的能夠直接定位到某行數據的函數然後我就從數據集的類上查找經過不斷努力終於在TdataSet中發現了一個方法GoToBookmark這個方法能夠使當前的DBGrid中的記錄指針指向你需要指定的行
  
  在找到這個方法後問題還只解決了一半還必須把當前指針指向的數據行改變顏色就是說必須用一個明顯的方式去標志當前選中的行(出了在DBGrid上的那個小的不明顯的書簽外)這個很顯然就是在DBGrid控件中實現了在DBGrid控件中有一個事件OnDrawDataCell重載這個方法就可以實現指定的數據行的顏色的改變了
  
  具體的使用過程如下
  
  ()  動態定位數據行
  
  //
  
  //過程名 DyDbgDataLine
  
  //作者  haitian
  
  //日期  
  
  //功能  根據用戶指定的條件自動移動到DBGrid控件中符合此條件的某行數據上
  
  //輸入參數
  
  //     sValue當前需要移動到的行的值
  
  //     tab當前DBGrid中對應的表的數據
  
  //     dsr當前需要操作的數據源
  
  //返回值 無
  
  //修改記錄
  
  //
  
  Procedure DyDbgDataLine(sValue:string;tab:Ttable;dsr:TDatasource)
  
  var
  
    bookmark:TBookMark;
  
  begin
  
    //記錄當前標記的行
  
   bookmark:=self tabGetBookmark;
  
   self tabfirst;
  
   while not self tabEof do
  
   begin
  
   if self tabFieldByName(cpbh)AsString= sValue then
  
   begin
  
   bookmark:=self tabGetBookmark;
  
   break;
  
   end;
  
   self tabNext;
  
   end;
  
   self dsrDataSetGotoBookmark(pointer(bookmark));
  
  End;
  
  說明使用的表已經和當前顯示界面上的DBGrid綁定
  
  ()  改變顏色標記當前數據行
  
  首先把DBGrid的DefaultDrawing屬性設為false;然後在OnDrawDataCell事件函數中調用下面的函數
  
  //
  
  //過程名 DrawLine
  
  //作者  haitian
  
  //日期  
  
  //功能  把Dbgrid中的指定的行改變顏色作為標記
  
  //輸入參數
  
  //     zdm字段名
  
  //     Rect需要出入的行的某個單元
  
  //     Field當前顯示的域
  
  //     state當前行的顯示狀態
  
  //     zdz當前需要移動到的行的值
  
  //     tab當前DBGrid中對應的表的數據
  
  //     dbg當前需要操作的DBGrid
  
  //返回值 無
  
  //修改記錄
  
  //
  
   procedurDrawLine(tab:Ttable;const Rect:Trect;Field:Tfield;state:TgridDrawState;dbg:TDBGrid)
  
   begin
  
   if (tabfieldbyname(zdm)asstring=zdz)then
  
  begin
  
  lor:=clred;
  
  lor:=clyellow;
  
  end;
  
   dbgDefaultDrawDataCell(RectFieldState);
  
   end;
From:http://tw.wingwit.com/Article/program/Delphi/201311/8436.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.