Глюки rxDBGrid
Модераторы: alexs, Модераторы
А можно попросить об одной реализации?
Добавить в событие OnGetCellProps параметр Highlight = boolean.
Чтобы можно было отследить,что в гриде строка подсвечивается и соответственно не менять цвет строки (строка может подсвечиваться свойством dgRowHighlight или быть выделенной при gdMultiSelect).
Или подскажите как еще можно определить, что данная строка является выделенной/выбранной? Может просто не нахожу нужного свойства или метода
Добавить в событие OnGetCellProps параметр Highlight = boolean.
Чтобы можно было отследить,что в гриде строка подсвечивается и соответственно не менять цвет строки (строка может подсвечиваться свойством dgRowHighlight или быть выделенной при gdMultiSelect).
Или подскажите как еще можно определить, что данная строка является выделенной/выбранной? Может просто не нахожу нужного свойства или метода
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
V@S писал(а):Или подскажите как еще можно определить, что данная строка является выделенной/выбранной? Может просто не нахожу нужного свойства или метода
Что-то типа этого
RxDBGrid1.SelectedRows.IndexOf(quMain.Bookmark);
В DrawCell модуля rxdbgrid даже учитывается, что строка выделена, но не учитывается что она подсвечена
Но тут проверять еще на активную подсветку всей строки неправильно, вдруг надо перекрашивать все равно.
Даже можно aState передать, как в других событиях.
Добавлено спустя 52 секунды:
Даже если запись не в закладках? Или активная запись всегда в закладки помещается?
Код: Выделить всё
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
- Откуда: г.Ставрополь
- Контактная информация:
А ещё кажется должно так сработать
if RxDBGrid1.SelectedRows.CurrentRowSelected then
Хотя в реализации CurrentRowSelected тоже самое и есть:
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;
alexs писал(а):А ещё кажется должно так сработать
if RxDBGrid1.SelectedRows.CurrentRowSelected then
Это нашел, но не смог заставить так срабатывать для текущей строки.
Не берет название шрифта из TitleFont для об'единенних колонок "|", для простих - нормально.
-
YaroslavSh
- новенький
- Сообщения: 26
- Зарегистрирован: 21.07.2010 08:09:41
Добрый день.

При раскрашивании таким методом, пропадают горизонтальные разделители строк, и все сливается в одну картинку, хотя вертикальные остаются. Ни как не могу их вернуть. Что для этого нужно сделать?
Код: Выделить всё
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;
При раскрашивании таким методом, пропадают горизонтальные разделители строк, и все сливается в одну картинку, хотя вертикальные остаются. Ни как не могу их вернуть. Что для этого нужно сделать?
-
YaroslavSh
- новенький
- Сообщения: 26
- Зарегистрирован: 21.07.2010 08:09:41
Я много вариантов пробовал, но либо не рисует совсем, либо просто без изменений
По идеи, должно быть:
fillRect(X1,Y1,X2,Y2: Integer)
RxDBGrid1.Canvas.FillRect(0,0,Width,Height-1);
По идеи, должно быть:
fillRect(X1,Y1,X2,Y2: Integer)
RxDBGrid1.Canvas.FillRect(0,0,Width,Height-1);
Варианты решения:
1 - Выставить прозрачность при сплошной заливке?
2 - заливать частями, чтоб не затереть линии.
3 - делать заливку, а потом делать таблицу сверху? (странный вариант...)
Чтоб понимать - FillRect - это сплошная заливка сплошного прямоугольника, где все линии, попадающие в прямоугольник заливки так же приобретают цвет заливки. (рисовался бы текст раньше заливки, то и его бы тоже не видно было).
1 - Выставить прозрачность при сплошной заливке?
2 - заливать частями, чтоб не затереть линии.
3 - делать заливку, а потом делать таблицу сверху? (странный вариант...)
Чтоб понимать - FillRect - это сплошная заливка сплошного прямоугольника, где все линии, попадающие в прямоугольник заливки так же приобретают цвет заливки. (рисовался бы текст раньше заливки, то и его бы тоже не видно было).
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
YaroslavSh, а если так:
RxDBGrid1.Canvas.FillRect(0,1,Width,Height-2);
RxDBGrid1.Canvas.FillRect(0,1,Width,Height-2);
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Предложений уже набросали
Вот ещё один вариант:
Вот ещё один вариант:
Код: Выделить всё
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, а если так:
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;
Это то, что нужно, спасибо ГУРУ.
