|
C цветом ячейки DBGrid не так все просто, ведь в Delphi 1.0 разукрасить ячейку можно в обработчике события OnDrawDataCell, тогда как в Delphi 2.0 вам придется прибегнуть к событию OnDrawColumnCell. Для того чтобы создать код, который бы работал в ОБОИХ версих Delphi, вам необходимо прибегнуть к механизму условной компиляции, с помощью которого вы можете СКРЫТЬ обработчик OnDrawColumnCell в Delphi 1.0 и ВКЛЮЧИТЬ его в Delphi 2.0. Вот пример, в котором все ячейки строки рисуются красным, если колонка 'Preferred' содержит 'True':
... private { Private declarations } {$IFDEF Win32}
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); {$ENDIF} procedure DrawField(const Value: string; const Rect: TRect; vCanvas: TCanvas; vFont: TFont; vAlignment: TAlignment); ... procedure TForm1.DrawField(const Value: string; const Rect: TRect; vCanvas: TCanvas; vFont: TFont; vAlignment: TAlignment); var X: Integer; begin vCanvas.Font := vFont; vCanvas.Font.Color := clRed; vCanvas.Font.Style := vCanvas.Font.Style + [fsUnderline]; case vAlignment of taRightJustify: begin SetTextAlign(vCanvas.Handle, TA_RIGHT); X := Rect.Right - 2; end; taLeftJustify: begin SetTextAlign(vCanvas.Handle, TA_LEFT); X := Rect.Left + 2; end; taCenter: begin SetTextAlign(vCanvas.Handle, TA_CENTER); X := (Rect.Right + Rect.Left) div 2; end; end; vCanvas.TextRect(Rect, X, Rect.Top + 2, Value); SetTextAlign(vCanvas.Handle, TA_LEFT); end;
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); begin with Sender as TDBGrid, DataSource.DataSet do begin if FieldByName('Preferred').AsString <> 'True' then Exit; DrawField(Field.DisplayText, Rect, Canvas, Canvas.Font, Field.Alignment); end; end;
{$IFDEF Win32} procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin with Sender as TDBGrid, DataSource.DataSet do begin if FieldByName('Preferred').AsString <> 'True' then Exit; DrawField(Column.Field.DisplayText, Rect, Canvas, Column.Font, Column.Alignment); end; end; {$ENDIF}
procedure TForm1.FormCreate(Sender: TObject); begin {$IFDEF Win32} DBGrid1.OnDrawDataCell := nil; DBGrid1.OnDrawColumnCell := DBGrid1DrawColumnCell; {$ENDIF} end;
|