我正在构建一个函数:在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;
答案 0 :(得分: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
的字段,并在True
过程中将其设置为N_SearchClick
。但是,由于该过程以模态方式显示表单然后释放它,您可以完全省略该变量,因此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;
答案 1 :(得分: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;