Страница 1 из 1

TdxPivotGrid

Добавлено: 23 янв 2018, 16:37
jurist23rus
Есть у TdxPivotGrid свойство Colors: TKGridColors . У TKGridColors своя куча свойств, но как я понимаю все это имеет отношение ко всей таблице. Можно ли раскрасить только одну строку или ячейку?

Re: TdxPivotGrid

Добавлено: 23 янв 2018, 17:36
admin
В TdxPivotGrid только часть свойств TKGrid. Вот все, что Вы видите в дереве классов, то и есть. Добавлять свойства сейчас нет ни времени, ни желания.

Re: TdxPivotGrid

Добавлено: 23 янв 2018, 19:07
jurist23rus
Я просто спрашиваю не знаете ли вы как раскрасить отдельную строку? Компонент TKGrid достаточно мудрёный, у него много всяких наворотов да только не понятно как ими пользоваться. Я думаю может новых свойств и не надо, можно раскрасить теми что есть, да я не знаю как.

Re: TdxPivotGrid

Добавлено: 23 янв 2018, 19:21
admin
Есть событие OnDrawCell.

TdxPivotGrid

Добавлено: 10 май 2020, 16:23
Иван
admin писал(а):Есть событие OnDrawCell.


Добрый день. Вопрос к Admin. Не работает прорисовка OnDrawCell если ее сохранять в свой обработчик. Прикрепил пример.

Код: Выделить всё

var OnMD: TKGridDrawCellEvent;

procedure MD (Sender: TObject; ACol, ARow: Integer; R: TRect; State: TKGridDrawState);
begin
      if OnMD<>nil then OnMD (Sender, ACol, ARow, R, State);
end;

procedure Form_Create;
begin
       OnMD:= dxPivotGrid1.OnDrawCell;
       dxPivotGrid1.OnDrawCell:= @MD;
end; 


Что бы пошла отрисовка как минимум нужно вручную прописать ряд параметров, добавил внизу. Это так и должно быть?

Код: Выделить всё

TKGrid(Sender).Canvas.FillRect(R);
    TKGrid(Sender).Canvas.TextOut(R.Left, R.Top, TKGrid(Sender).Cells[ACol, ARow]);
                                                                                   

TdxPivotGrid

Добавлено: 10 май 2020, 16:47
Vofka18
jurist23rus писал(а):Есть у TdxPivotGrid свойство Colors: TKGridColors . У TKGridColors своя куча свойств, но как я понимаю все это имеет отношение ко всей таблице. Можно ли раскрасить только одну строку или ячейку?

Кусочек кода из моей программы, чисто для примера

Код: Выделить всё

procedure drawcell(Sender: TObject; ACol, ARow: Integer; R: TRect; State: TKGridDrawState);
var
  FontColor : TColor;
  FontStyle : TFontStyles;
  BrColor : TColor;
  ts:TtextStyleRec;
  i,clr:integer;
begin
  i:=getIndexXls(tEditWindow(tPanel(tdxPivotGrid(sender).parent).parent).form.parentForm);

  with tdxPivotGrid(Sender).Canvas do
  begin
    //Запоминаем параметры шрифта и кисти.
    FontColor := Font.Color;
    FontStyle := Font.Style;
    BrColor := Brush.Color;

    //Устанавливаем новые парметры.
    // xlsLD[i].clrMap это массив шаблон для раскраски каждой ячейки в строке(он заполняется в другой процедуре.
    // чтоб не сбивал с толку)
    try
      if (ACol > 0) and (ARow > 0) then
      begin
        if (Length(xlsLD[i].clrMap)>=Arow+1)then
        begin
          for clr := 0 to High(xlsLD[i].clrMap[Arow].color) do
          begin
            if(xlsLD[i].clrMap[Arow].color[clr]<>'') and (aCol=clr+1)then
            begin
              brush.Color := StringToColor(xlsLD[i].clrMap[Arow].color[clr]);
            end;
          end;
        end;
      end;
    except
      debug('Ошибка при раскраске, в строке: '+intToStr(Arow));
    end;

    if (kgdSelected in State) then
    begin
      Brush.Color := clBlue;
      Font.Color := clWhite;
      Font.Style := Font.Style + [fsBold];
    end;
    //Прорисовываем ячейку.

    //Заливаем квадрат ячейки цветом кисти.
    FillRect(R);
    rectangle(R.Left,R.Top,R.Right,R.Bottom);
    //Прорисовываем в ячейке текст. Здесь +2 - так мы задаём ширину полей в ячейке.
    //TextOut(R.Left + 2, R.Top + 2, tdxPivotGrid(Sender).Cells[ACol, ARow]);
    TextRect(R,R.Left+3, R.Top+2, tdxPivotGrid(Sender).Cells[ACol, ARow],ts);
    //rectangle(R.Left,R.Top,R.Right,R.Bottom);

    //Восстанавливаем прежние параметры.
    Font.Color := FontColor;
    Font.Style := FontStyle;
    Brush.Color := BrColor;
  end;

end;                     

Функция конечно вырвана из контекста программы, но если что спрашивайте. И подобных примеров еще много в интернете по delphi

TdxPivotGrid

Добавлено: 10 май 2020, 17:01
Vofka18
Иван писал(а):
admin писал(а):Есть событие OnDrawCell.


Добрый день. Вопрос к Admin. Не работает прорисовка OnDrawCell если ее сохранять в свой обработчик. Прикрепил пример.

Код: Выделить всё

var OnMD: TKGridDrawCellEvent;

procedure MD (Sender: TObject; ACol, ARow: Integer; R: TRect; State: TKGridDrawState);
begin
      if OnMD<>nil then OnMD (Sender, ACol, ARow, R, State);
end;

procedure Form_Create;
begin
       OnMD:= dxPivotGrid1.OnDrawCell;
       dxPivotGrid1.OnDrawCell:= @MD;
end; 

Разрешите вставить свои 5коп. Вы вызываете старый обработчик рисования. Зачем? если хотите рисовать сами? там единственное, что надо вернуть (после своей отрисовки) стандартные значения отрисовки таблицы, чтоб она дорисовала то, что вам не надо.
Например если вы не раскрашиваете шапку таблицы.

TdxPivotGrid

Добавлено: 10 май 2020, 17:05
Иван
Vofka18 писал(а):...


За пример спасибо, может что пригодится в перспективе, но мне нужно именно поймать выделенные ячейки и записать их в TStringList, рисовать нет необходимости.

По общей логике сохранив и снова вызвав обработчик все должно быть как будто этой процедуры и не прописано. Но отрисовка просто не происходит.

TdxPivotGrid

Добавлено: 10 май 2020, 17:11
Vofka18
Иван писал(а):
Vofka18 писал(а):...


За пример спасибо, может что пригодится в перспективе, но мне нужно именно поймать выделенные ячейки и записать их в TStringList, рисовать нет необходимости.

По общей логике сохранив и снова вызвав обработчик все должно быть как будто этой процедуры и не прописано. Но отрисовка просто не происходит.

Просто разукрасить выделение нужно также как в примере, запомнить текущие параметры вписать следующее условие

Код: Выделить всё

if (kgdSelected in State) then
    begin
      Brush.Color := clBlue;
      Font.Color := clWhite;
      Font.Style := Font.Style + [fsBold];
    end;

И вернуть исходные параметры. По другому пробовал, не получается. Грамотно обьеснить почему, я к сожелению не могу :)

TdxPivotGrid

Добавлено: 10 май 2020, 20:50
admin
Иван писал(а):Добрый день. Вопрос к Admin. Не работает прорисовка OnDrawCell если ее сохранять в свой обработчик. Прикрепил пример.

В программе событие OnDrawCell не используется. Если определен обработчик, то вы сами должны рисовать содержимое ячейки.