Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > закраска cells в dxDBGrid


Автор: Napalm 4.3.2004, 18:49
подскажите пожалуйста как изменить цвет фона или шрифта в определенных ячейках dxDBGrid

Автор: Maverick 5.3.2004, 12:28
Между прочим, тема и мне достаточно близка.... Подскажите, плиз как закрасить, предположим строку в зависимости от значения поля в ней...
Если предположим, поле пустое - вся строка красная, иначе - зеленая....
Я думаю, это имелось в виду в вопросе.....

Автор: AlexV1 5.3.2004, 12:45
 Не знаю, что такое DxDBGrid, но для Rx так:
Подсветка строк в RxGrid'e, удовлетворяющие какому-либо условию

Код

procedure TForm1.DBGrid1GetCellParams(Sender: TObject; Field: TField;
  AFont: TFont; var Background: TColor; Highlight: Boolean);
begin
  // Если зн-е поля id=NULL, то подсветить всю строку
  if Field.DataSet.FieldByName('id').IsNull then
  begin
    if Highlight then Background := clHighlight;
//      else Background := clLime;
  end;
end;


Если нужно подсветить не всю строку, а только зн-е в одной из колонок,
то заменить условие на
Код

   if Field.FieldName='id' then if Field.value=NULL then

 
M
z-END
кнопка код создана для того чтобы ее нажимать

Автор: Maverick 5.3.2004, 13:43
Спасибо... счас будем пробовать сопостовлять...

DxDBGrid - DevExpress Quantum Grid.... Очень мощный грид.... Ссылки, где скачать - есть на форуме...

Автор: Napalm 9.3.2004, 15:50
Код

 procedure TForm1.DBGrid1CustomDrawCell(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn;
  ASelected, AFocused, ANewItemRow: Boolean; var AText: String;
  var AColor: TColor; AFont: TFont; var AAlignment: TAlignment;
  var ADone: Boolean);
begin
if not ANode.HasChildren then
begin
    if (DBGrid1.FocusedNode=ANode) and (not ASelected) then
      AColor:=clAqua;
end;
end;


вот нашел.  правда не совсем то что нужно. этот кусок подсвечивает текущую строку другим цветом (Аква). как только уходишь с него все возвращается... пытался ставить другое условие, но со строками получается чехорда. може кто еще чего раскапает 
 
M
z-END
кнопка код создана  для того чтобы ее нажимать

Автор: Napalm 9.3.2004, 16:20
 о! нашел. тут надо другое событие обрабатывать. это я пытался по анологии с простым dbgrid делать. сдесь оказывается надо 

Код

procedure TForm1.DBGrid1CustomDraw(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxDBTreeListColumn;
  const AText: String; AFont: TFont; var AColor: TColor; ASelected,
  AFocused: Boolean; var ADone: Boolean);
begin

if (ATExt>'0')and(acolumn.Field.FieldName='k1') then AColor:=clRed;
end;



фон поля вывода поля k1 из таблицы если там не 0 будет красный smile 
 
M
z-END
кнопка код создана  для того чтобы ее нажимать

Автор: Akella 11.8.2006, 14:13
поднимаю тему, актуально сейчас для версии 5.
Как раскрасить cxGrid разными цветами и шрифтами в зависимости от значения конкретной ячейки?

Добавлено @ 14:19 
вот надыбал, но работает некорректно
Код
    if (TcxGridDBColumn(AViewInfo.Item).DataBinding.DataController.DataSet.FieldByName('AMOUNTONBEGIN').Value < 0) then begin
      ACanvas.Font.Color := clRed;
    end;


раскрашивается всё красным, верне всё красным, т.к. значение ячейки первой записи отрицательное

Автор: Akella 11.8.2006, 14:31
так тоже тест всего грида красный
Код
    if (TcxGridDBColumn(AViewInfo.Item).DataBinding.DataController.DataSet.FieldByName('AMOUNTONBEGIN').Value < 0) then
      ACanvas.Font.Color := clRed
    else
      ACanvas.Font.Color := clWindowText ;


Добавлено @ 14:32 
забыл сообщить, что обрабатываю событие OnCustomDrawCell

Автор: z-END 11.8.2006, 17:25

M
z-END
Napalm, AlexV1,  в следующий раз просто буду удалять. уважайте тех кто читает ваши посты.

Автор: Fedia 13.8.2006, 04:28
Akella, можно попробовать так:
Код

procedure TConvertDBGridDemoMainForm.cxGridDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if (AViewInfo.Item.DataBinding.FilterFieldName = 'AMOUNTONBEGIN') and (AViewInfo.Value < 0)  then
  ACanvas.Font.Color:=clRed;
end;
.
Если же есть необходимость изменить цвет шрифта для всех полей, имеющих значение меньшее нуля, то могу предложить следующий вариант:
Код

procedure TConvertDBGridDemoMainForm.cxGridDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if ((VarType(AViewInfo.Value) and varTypeMask = varInteger) or
    (VarType(AViewInfo.Value) and varTypeMask = varDouble)) and
    (AViewInfo.Value < 0) then
  ACanvas.Font.Color:=clRed;
end;

Автор: Akella 29.8.2006, 09:50
с меня +

Добавлено @ 09:52 
Код

procedure TConvertDBGridDemoMainForm.cxGridDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if ((VarType(AViewInfo.Value) and varTypeMask = varInteger) or
    (VarType(AViewInfo.Value) and varTypeMask = varDouble)) and
    (AViewInfo.Value < 0) then
  ACanvas.Font.Color:=clRed;
end;


разукрашивает отдельно каждую ячейку

Автор: Fedia 29.8.2006, 11:39
Akella,  я думал ты вообще забыл про этот вопрос smile

Автор: Akella 29.8.2006, 11:58
и я думал, что забыл, но вруг этот грёбанный DevExpress ни с того ни с чего начал опять красить как попало

вопрос по теме?
вот твой код:
Код
procedure TConvertDBGridDemoMainForm.cxGridDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if ((VarType(AViewInfo.Value) and varTypeMask = varInteger) or
    (VarType(AViewInfo.Value) and varTypeMask = varDouble)) and
    (AViewInfo.Value < 0) then
  ACanvas.Font.Color:=clRed;
end;

красит конкретную ячейку, а как вся строку закрасить?

Автор: Fedia 29.8.2006, 12:25
Цитата(Akella @  29.8.2006,  11:58 Найти цитируемый пост)
красит конкретную ячейку, а как вся строку закрасить?

А при выполнении какого условия строчку необходимо закрасить ?

Автор: Akella 29.8.2006, 15:09
если значение любой ячейки строки числовое и мньше нуля

Автор: Fedia 30.8.2006, 13:26
Цитата(Akella @  29.8.2006,  15:09 Найти цитируемый пост)
если значение любой ячейки строки числовое и мньше нуля

Млин, задача оказалась не из легких. Но, слава Богу, решаемая smile
Если у тебя работал вариант закраски отдельных ячеек, то теоретически должен сработать и этот:
Код

var
  Form1: TForm1;
  RecN: Integer = -1;
  DoDraw: Boolean;
//...
var
  i, n: integer;
begin
  if AViewInfo.GridRecord.RecordIndex<>RecN then
  begin
    RecN:=AViewInfo.GridRecord.RecordIndex;
    DoDraw:=False;
    with cxGrid1DBTableView1.DataController do
    begin
      for i:=0 to AViewInfo.GridRecord.ValueCount-1 do
      if (VarType(Values[RecN, i]) and varTypeMask in
        [varInteger, varDouble]) then
      if (Values[RecN, i] < 0) then
      begin
        DoDraw:=True;
        Break;
      end;
    end;
  end;
  if DoDraw then
  ACanvas.Font.Color:=clRed;
end;

Как видишь использования глобальных переменных избежать не удалось. Можно конечно сделать и без них, но тогда для каждой ячейки придется перебирать все значения строки, что в общем притормаживает прорисовку. А отдельного события прорисовки строки я не нашел.
cxGrid1DBTableView1 из примера типа TcxGrid1DBTableView. Если при настройке грида ты менял названия его объектов, то название этого должно находиться выше кнопки "Customize..." справа.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)