DELPHI中DBGrid中行的定位與著色實現
在對一個資料庫系統進行操作的時候,發現不能對DBGrid控制項中的資料行定位及在定位到某行後無法對當前行進行明顯的標誌(例如改變顏色),在往上查找了很多資料,發現基本上沒有這個內容的介紹,包括一些動態設頂行的顏色等文章講的都是在資料初始化時做的操作,而沒有在資料來源刷新後的重新定位功能,所以下決心解決這個問題,透過一上午對DELPHI幫助的研究和查看相關的資料,稍有小成,現寫出來和各位同行共同學習,不當之處請多指教。
首先查找Ttable和Tquery控制項沒有發現能夠直接定位資料行的方法,同樣查找DBGrid也沒有找到對應的能夠直接定位到某行資料的函數,然後我就從資料集的類別上查找,經過不斷努力,終於在TdataSet中發現了一個方法:GoToBookmark,這個方法能夠讓目前的DBGrid中的記錄指標指向你需要指定的行。
在找到這個方法後,問題還只解決了一半,還必須把當前指標指向的資料行改變顏色,就是說必須用一個明顯的方式去標誌目前選取的行(出了在DBGrid上的那個小的不明顯的書籤外)這個很顯然就是在DBGrid控制項中實作了,在DBGrid控制項中有一個事件OnDrawDataCell,重載這個方法就可以實現指定的資料行的顏色的改變了。
具體的使用過程如下:
(1) 動態定位資料行
//================================================ ===============
//過程名稱: DyDbgDataLine
//作者: haitian
//日期: 2003-02-22
//功能: 依照使用者指定的條件自動移動到DBGrid控制項中符合此條件的某行資料上
//輸入參數:
// sValue:目前需要移動到的行的值;
// tab:目前DBGrid中對應的表的資料;
// dsr:目前需要操作的資料來源;
//傳回值: 無
//修改記錄:
//================================================ ==================
PRocedure DyDbgDataLine(sValue:string;tab:Ttable;dsr:TDatasource)
var
bookmark:TBookMark;
begin
//記錄目前標記的行;
bookmark:=self. tab.GetBookmark;
self. tab.first;
while not self. tab.Eof do
begin
if self. tab.FieldByName('cpbh').AsString= sValue then
begin
bookmark:=self. tab.GetBookmark;
break;
end;
self. tab.Next;
end;
self. dsr.DataSet.GotoBookmark(pointer(bookmark));
End;
說明:使用的表格已經和目前顯示介面上的DBGrid綁定;
(2) 改變顏色標記目前資料行
先把DBGrid的DefaultDrawing屬性設為false;然後在OnDrawDataCell事件函式中呼叫下面的函式:
//================================================ ===============
//過程名稱: DrawLine
//作者: haitian
//日期: 2003-02-22
//功能: 把Dbgrid中的指定的行改變顏色作為標記;
//輸入參數:
// zdm:欄位名稱;
// Rect:需要出入的行的某個單元;
// Field:目前顯示的網域;
// state:目前行的顯示狀態;
// zdz:目前需要移動到的行的值;
// tab:目前DBGrid中對應的表的資料;
// dbg:目前需要操作的DBGrid;
//傳回值: 無
//修改記錄:
//================================================ ==================
procedurDrawLine(tab:Ttable;const Rect:Trect;Field:Tfield;state:TgridDrawState;dbg:TDBGrid)
begin
if (tab.fieldbyname(zdm).asstring=zdz)then
begin
dbg.canvas.font.color:=clred;
dbg.canvas.brush.color:=clyellow;
end;
dbg.DefaultDrawDataCell(Rect,Field,State);
end;