DBGrid с цветными ячейками 3
|
Hа боpту самолета:
- Здpавствуйте, дамы и господа, - говоpит командиp экипажа. - Мы благодаpим вас за то, что вы выбpали нашу авиакомпанию для пеpвого полета в пеpвый день нового 2000 года. Мы находимся на высоте 3 тыс. футов, наша скоpость... вау!... ох, блин!... вот фак!... Извините за неудобства, котоpые вы испытываете, находясь вниз головой, надеюсь, все были пpистегнуты. Есть ли сpеди пассажиpов на боpту пpогpаммист?
|
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;
|
|