2015-10-30 22 views
1

我正在構建一個函數:在DBGrid中搜索一個值後,它可以統計多少值並標記這些單元格(更改單元格的顏色)。但是, 。我可以在一個程序中做什麼?搜索數據後,使DBGrid單元格更改顏色

procedure TfmMain.N_SearchClick(Sender: TObject); 

var 
searchname : String; 
i: integer; 
frmSearch : Tfrmsearch; 
data_count : integer; 

begin 

    searchData := ''; 
    searchRow:=self.DBGrid.DataSource.DataSet.RecNo; 
    searchname:= DBGrid.DataSource.DataSet.fieldbyname('FIELD').AsString; 
    frmSearch:=Tfrmsearch.Create(self); 

    try 

    frmSearch.ShowModal; 
    frmSearch.Visible:=true; 

    for i := 0 to DBGrid.FieldCount do 
    begin 


     if ((Pos(searchData,DBGrid.DataSource.DataSet.Fields[i].AsString)>0) AND (CompareStr(searchData,'') <> 0) 
     AND (Pos('VALUE_',DBGrid.DataSource.DataSet.Fields[i].FieldName)>0) 
     AND (searchRow=DBGrid.DataSource.DataSet.RecNo)) then 
     begin 

     data_count:=data_count+1; 
     //DBGrid[DBGrid.Row,i-2].Color:=clLime; 

     end; 
    end; 

     showmessage('countTotal: '+IntToStr(data_count)); 

    finally 
    frmSearch.Free; 
    end; 
end; 

回答

2

所有你需要的是這樣的網格的OnDrawColumnCell事件:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin 
    // Change font- and grid-color if showing search results 
    if ShowingSearchResult then begin 
    TDBGrid(Sender).Canvas.Brush.Color := clSilver; 
    TDBGrid(Sender).Canvas.Font.Color := clBlue; 
    end; 
    TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State); 
end; 

你可以在OnDrawColumnCell事件做的是有點有限,但應該能滿足這種情況。 Iirc在某些時候增加了OnDrawDataCell以提供更大的靈活性。

當然,你會聲明ShowingSearchResult(布爾)變量作爲TfrmSearch的一個領域,它在你的N_SearchClick程序設置爲True。然而,由於該程序顯示形式模態,然後釋放它,你都不可能忽略這個變量完全,所以DBGrid1DrawColumnCell可能只是

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin 
    TDBGrid(Sender).Canvas.Brush.Color := clSilver; 
    TDBGrid(Sender).Canvas.Font.Color := clBlue; 
    TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State); 
end; 
+0

兩個不同的過程(SearchClick和OnDrawColumnCell)如何傳遞一個值? 我應該如何重寫這個語句'ShowingSearchResult'? –

0

非常感謝,這是我寫的最終代碼。

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin  
    if (DBGrid.DataSource.DataSet.FieldByName(Column.FieldName).AsString = searchData) 
and (searchRow=DBGrid.DataSource.DataSet.RecNo) then 
    begin 
     TDBGrid(Sender).Canvas.Brush.Color := $000080FF; 
     DBGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
    end; 
end;