Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обновление цветов в TDBGrid

9.0K
28 марта 2009 года
Toxin_F
93 / / 03.01.2007
Здравствуйте.

Есть таблица с полем Status с возможными значениями 1, 2, 3, 4, есть DBGrid, с обработчиком OnDrawColumnCell, который в соответствии со значением присваивает цвет ячейке
Код:
procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with TCustomDBGridC(Sender) do
    case DataLink.Fields[14].AsInteger of
      1: Canvas.Brush.Color:=clGreen;
      2: Canvas.Brush.Color:=clSkyBlue;
      3: Canvas.Brush.Color:=clSilver;
      4: Canvas.Brush.Color:=clAqua;
    end;
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
Теперь столкнулся с такой проблемой, нужно чтобы при изменении значений поля Status, после нажатия на некий TButton, цвета переназначались в соответствии с изменениями, с утра бьюсь, не получается... помогите, пожалуйста!
397
28 марта 2009 года
SergPas
527 / / 03.02.2007
А может весь код приведёте? А лучше бы весь проект выложить, дабы ускорить процесс и не морочить голову форумчан...
9.0K
28 марта 2009 года
Toxin_F
93 / / 03.01.2007
Цитата: SergPas
А может весь код приведёте? А лучше бы весь проект выложить, дабы ускорить процесс и не морочить голову форумчан...


Весь проект выкладывать не совсем легко, цвета были последними штрихами... пока набросок делал понял что я сам себя заморочил, всё работает без лишних вызовов функций. 7 часов просидел :(

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, XPMan;

type
  TCustomDBGridC = class(TCustomDBGrid);
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOQuery1id: TAutoIncField;
    ADOQuery1Status: TIntegerField;
    ADOQuery1SimpleText: TWideStringField;
    Button1: TButton;
    XPManifest1: TXPManifest;
    procedure Button1Click(Sender: TObject);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  ADOQuery1.First;
  for i := 0 to ADOQuery1.RecordCount - 1 do begin
    ADOQuery1.Edit;
    ADOQuery1Status.Value:=Random(4);
    ADOQuery1.Next;
  end;
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with TCustomDBGridC(Sender) do
    case DataLink.Fields[1].AsInteger of
      1: Canvas.Brush.Color:=clGreen;
      2: Canvas.Brush.Color:=clSkyBlue;
      3: Canvas.Brush.Color:=clSilver;
      4: Canvas.Brush.Color:=clAqua;
    end;
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

end.
303
28 марта 2009 года
makbeth
1.0K / / 25.11.2004
Попробуй вызвать DBGrid1.Invalidate после установки значений. Но у меня такое подозрение, что у тебя просто грид не обновляется после изменения значений в датасете.

И еще.. не совсем в тему. Выкини нафиг с формы XP манифест. Пользы от него нет, только память занимает. Чтобы контролы отображались со стилями, достаточно просто подключить модуль XPMan в любом юните проекта. Собственно компонент TXPManufest и предназначен для этого - кинул его на форму - в uses добавилось XPMan :) В общем сделан он для ленивых компонентокидателей...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог