RXDBGrid + DrawColumnCell
Модератор: Модераторы
RXDBGrid + DrawColumnCell
Всем доброго дня.
Столкнулся такой проблемой. При использование с RXDBGrid обработчика DrawColumnCell у выводимых данный в гриде становится цвет шрифта белый. Причем обработчик может быть даже пустым достаточно его просто установить в свойствх комонента RXGrid и начинается такая петрушка. Без него все нормально.
В стандартном DBGrid работает все нормально.
Столкнулся такой проблемой. При использование с RXDBGrid обработчика DrawColumnCell у выводимых данный в гриде становится цвет шрифта белый. Причем обработчик может быть даже пустым достаточно его просто установить в свойствх комонента RXGrid и начинается такая петрушка. Без него все нормально.
В стандартном DBGrid работает все нормально.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Xenar писал(а):...При использование с RXDBGrid обработчика DrawColumnCell у выводимых данный в гриде становится цвет шрифта белый. Причем обработчик может быть даже пустым достаточно его просто установить в свойствх комонента RXGrid и начинается такая петрушка....
А зачем делать пустой обработчик? По мне так все логично: определили обработчик - рисуйте в нем сами.
Делаем так:
Код: Выделить всё
procedure TMainForm.GridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: integer; Column: TColumn; State: TGridDrawState);
begin
if (not (gdFocused in State)) and (not (gdSelected in State)) then begin
//if (tDBGrid(Sender).DataSource.DataSet.FieldByName('id_performer').AsInteger = UserID) then begin
// чего-то тут красим....
//end;
end; // if (not (gdFocused in State))
TRxDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol - 1, Column, State); // а что не попадает под условие красим стандартно
end; Добавлено спустя 45 секунд:
alexs писал(а):Пример есть?
Вот:
Код: Выделить всё
procedure TMainForm.GridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: integer; Column: TColumn; State: TGridDrawState);
begin
//
end; - alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
На самом деле всё не так.
Проще показать покоду:
Если указан глобальный отрисовщик ячеек таблицы - то все заботы по отрисовке берёшь на себя.
Если хочешь только конкретный стобец- то определи отрисовщик в указанной колонке.
Иначе - грид рисует согласно правилам сам.
Т.е. если определён обработчик OnDrawColumnCell для грида - то в гриде вызывается только он и больше никаких отрисовок данных.
Ну а насчёт цвета - я его просто не трогаю в том случае. Если определели отрисовщик - то сам и цвет выставляй.
Проще показать покоду:
Код: Выделить всё
procedure TRxDBGrid.DefaultDrawCellData(aCol, aRow: integer; aRect: TRect;
aState: TGridDrawState);
var
S: string;
F: TField;
C: TRxColumn;
j: integer;
begin
if Assigned(OnDrawColumnCell) and not (CsDesigning in ComponentState) then
OnDrawColumnCell(Self, aRect, aCol, TColumn(ColumnFromGridColumn(aCol)), aState)
else
begin
F := GetFieldFromGridColumn(aCol);
C := ColumnFromGridColumn(aCol) as TRxColumn;
if Assigned(C) and Assigned(C.FOnDrawColumnCell) then
C.OnDrawColumnCell(Self, aRect, aCol, TColumn(ColumnFromGridColumn(aCol)), aState)
else
begin
Если указан глобальный отрисовщик ячеек таблицы - то все заботы по отрисовке берёшь на себя.
Если хочешь только конкретный стобец- то определи отрисовщик в указанной колонке.
Иначе - грид рисует согласно правилам сам.
Т.е. если определён обработчик OnDrawColumnCell для грида - то в гриде вызывается только он и больше никаких отрисовок данных.
Ну а насчёт цвета - я его просто не трогаю в том случае. Если определели отрисовщик - то сам и цвет выставляй.
Уважаемый alexs, честно говоря я ничего не понял в Вашем примере
Взял за основу пример из поста dunin.
Ставлю в начале процедуры
а потом высталяю свои закраски, так более менее работает.
Но не могу победить следующую проблему, если я использую заливку типа
то у указанных ячейках исчезают разделительные линии между другими ячейками, как будто заливка и их "задевает"

Такая вот беда идет только в RxDBGrid, до сего момента использовал стандартный DBGrid, там срабатывает штатно
Взял за основу пример из поста dunin.
Ставлю в начале процедуры
Код: Выделить всё
TRxDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol - 1, Column, State);а потом высталяю свои закраски, так более менее работает.
Но не могу победить следующую проблему, если я использую заливку типа
Код: Выделить всё
RxDBGrid1.Canvas.FillRect(Rect);то у указанных ячейках исчезают разделительные линии между другими ячейками, как будто заливка и их "задевает"
Код: Выделить всё
TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol - 1, Column, State);
if SQLQSuperSBt1.FieldByName('lastv').AsString = '05.03.2013' then
begin
RxDBGrid1.Canvas.Brush.Color:=$0079F88D;
RxDBGrid1.Canvas.Font.Color:=clBlack;
RxDBGrid1.Canvas.FillRect(Rect);
RxDBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);
end; 
Такая вот беда идет только в RxDBGrid, до сего момента использовал стандартный DBGrid, там срабатывает штатно
Есть ли у кого Рабочий пример работы DrawColumnCell с RxDBGrid
Ну абсолютно ничего общего со стандартным DBGrid
Ну собственно говоря на два поста выше http://www.freepascal.ru/forum/viewtopic.php?t=8701&view=unread#p70340 я расписал в чем есть затруднение. А вообще в Demos пакета хотелось бы конечно видеть рабочий пример.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
По существу вопроса:
Скорее всего ты переопределяешь в своём обработчике текстшрифта и не востанавливаешь его обратно.
Я не делал контроль этого. Надо будет добавить принудительное востановление параметров канвы.
А теперь советы:
Тебе просто заливку фона сделать?
Воспользуйся обработчиком OnGetCellProps. Он именно для этого и нужен.
А ещё отрисовку конкретной ячеки можно сделать через назначение обработчика у события отрисовки у колонки грида.
Добавлено спустя 1 минуту 5 секунд:
PS
Где тут админы форума - перенесите тему в раздел по RX. Ей там самое место.
Скорее всего ты переопределяешь в своём обработчике текстшрифта и не востанавливаешь его обратно.
Я не делал контроль этого. Надо будет добавить принудительное востановление параметров канвы.
А теперь советы:
Тебе просто заливку фона сделать?
Воспользуйся обработчиком OnGetCellProps. Он именно для этого и нужен.
А ещё отрисовку конкретной ячеки можно сделать через назначение обработчика у события отрисовки у колонки грида.
Добавлено спустя 1 минуту 5 секунд:
PS
Где тут админы форума - перенесите тему в раздел по RX. Ей там самое место.
