Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
DBGrid с цветными ячейками 3

Автор: Neil Rubenking

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;


Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay