Глюки rxDBGrid

Модераторы: alexs, Модераторы

Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Наверное надо както приводить к общему знаменателю... Надо подумать
Аватара пользователя
V@S
новенький
Сообщения: 19
Зарегистрирован: 31.03.2008 10:23:20

Сообщение V@S »

А можно попросить об одной реализации?
Добавить в событие OnGetCellProps параметр Highlight = boolean.
Чтобы можно было отследить,что в гриде строка подсвечивается и соответственно не менять цвет строки (строка может подсвечиваться свойством dgRowHighlight или быть выделенной при gdMultiSelect).

Или подскажите как еще можно определить, что данная строка является выделенной/выбранной? Может просто не нахожу нужного свойства или метода :?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

V@S писал(а):Или подскажите как еще можно определить, что данная строка является выделенной/выбранной? Может просто не нахожу нужного свойства или метода

Что-то типа этого
RxDBGrid1.SelectedRows.IndexOf(quMain.Bookmark);
Аватара пользователя
V@S
новенький
Сообщения: 19
Зарегистрирован: 31.03.2008 10:23:20

Сообщение V@S »

В DrawCell модуля rxdbgrid даже учитывается, что строка выделена, но не учитывается что она подсвечена

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

    if Assigned(FOnGetCellProps) and not (gdSelected in aState) then
    begin
      FBackground := Canvas.Brush.Color;
      FOnGetCellProps(Self, GetFieldFromGridColumn(aCol), Canvas.Font, FBackground);
      Canvas.Brush.Color := FBackground;
    end;                                                       

Но тут проверять еще на активную подсветку всей строки неправильно, вдруг надо перекрашивать все равно.
Даже можно aState передать, как в других событиях.

Добавлено спустя 52 секунды:
alexs писал(а):RxDBGrid1.SelectedRows.IndexOf(quMain.Bookmark);

Даже если запись не в закладках? Или активная запись всегда в закладки помещается?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

А ещё кажется должно так сработать
if RxDBGrid1.SelectedRows.CurrentRowSelected then

Хотя в реализации CurrentRowSelected тоже самое и есть:

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

function TBookmarkList.GetCurrentRowSelected: boolean;
var
  Bookmark: TBookmark;
begin
  CheckActive;
  Bookmark := FDataset.GetBookmark;
  Result := IndexOf(Bookmark)>=0;
  FDataset.FreeBookmark(Bookmark);
end;
Аватара пользователя
V@S
новенький
Сообщения: 19
Зарегистрирован: 31.03.2008 10:23:20

Сообщение V@S »

alexs писал(а):А ещё кажется должно так сработать
if RxDBGrid1.SelectedRows.CurrentRowSelected then

Это нашел, но не смог заставить так срабатывать для текущей строки.
kit
постоялец
Сообщения: 156
Зарегистрирован: 29.09.2016 08:39:07

Сообщение kit »

Не берет название шрифта из TitleFont для об'единенних колонок "|", для простих - нормально.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

kit писал(а):Не берет название шрифта из TitleFont для об'единенних колонок "|", для простих - нормально.

Уже берёт - ревизия 7680
YaroslavSh
новенький
Сообщения: 26
Зарегистрирован: 21.07.2010 08:09:41

Сообщение YaroslavSh »

Добрый день.

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

procedure TForm3.RxDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if RxDBGrid1.DataSource.DataSet.FieldByName('kolvo').AsFloat<=0 then begin
with  RxDBGrid1.Canvas do begin
Brush.Color:=$00605BF4;
if gdSelected in State then begin
Brush.Color:= $00FFBF80;
Font.Color := clblack;
end;
FillRect(Rect);
end;
end;

RxDBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


Изображение

При раскрашивании таким методом, пропадают горизонтальные разделители строк, и все сливается в одну картинку, хотя вертикальные остаются. Ни как не могу их вернуть. Что для этого нужно сделать?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

В Rect находится координата также и разделительной линии
Просто уменьши на единицу нижнюю кординату.
YaroslavSh
новенький
Сообщения: 26
Зарегистрирован: 21.07.2010 08:09:41

Сообщение YaroslavSh »

Я много вариантов пробовал, но либо не рисует совсем, либо просто без изменений
По идеи, должно быть:
fillRect(X1,Y1,X2,Y2: Integer)

RxDBGrid1.Canvas.FillRect(0,0,Width,Height-1);
Seenkao
энтузиаст
Сообщения: 566
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

Варианты решения:
1 - Выставить прозрачность при сплошной заливке?
2 - заливать частями, чтоб не затереть линии.
3 - делать заливку, а потом делать таблицу сверху? (странный вариант...)

Чтоб понимать - FillRect - это сплошная заливка сплошного прямоугольника, где все линии, попадающие в прямоугольник заливки так же приобретают цвет заливки. (рисовался бы текст раньше заливки, то и его бы тоже не видно было).
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

YaroslavSh, а если так:
RxDBGrid1.Canvas.FillRect(0,1,Width,Height-2);
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Предложений уже набросали
Вот ещё один вариант:

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

procedure TForm1.RxDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  P: TSize;
begin
  P:=Rect.Size;
  P.cy:=P.cy - 1;
  P.cx:=P.cx - 1;
  Rect.Size:=P;
  if FBDataSet1SPR_UNITS_CODE.AsInteger<=2 then
  begin
YaroslavSh
новенький
Сообщения: 26
Зарегистрирован: 21.07.2010 08:09:41

Сообщение YaroslavSh »

Спасибо за помощь.
Снег Север писал(а):YaroslavSh, а если так:
RxDBGrid1.Canvas.FillRect(0,1,Width,Height-2);
- это неверно.

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

var
  P: TSize;
begin
P:=Rect.Size;
  P.cy:=P.cy - 1;
  P.cx:=P.cx - 1;
  Rect.Size:=P;

if RxDBGrid1.DataSource.DataSet.FieldByName('kolvo').AsFloat<=0 then
begin
with  RxDBGrid1.Canvas do begin
Brush.Color:=$00605BF4;
if gdSelected in State then begin
Brush.Color:= $00FFBF80;
Font.Color := clblack;
end;
RxDBGrid1.Canvas.FillRect(rect);
end;
end;
 


Это то, что нужно, спасибо ГУРУ.
Ответить