Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выделение строки в гриде цветов [D7, access]


yurikon ©   (2010-10-13 15:28:00) 

Добрый  день!

Простая вроде задача - выделить строку активной записи цветом. Делаю так в событии перерисовки ячейки:

 if Table1.RecNo = Grid1.Row  then
 begin
   grdQoutes.Canvas.Brush.Color := clNavy;
   grdQoutes.Canvas.Font.Color := clYellow  ;
   grdQoutes.DefaultDrawColumnCell(Rect,datacol, column,State);
   Exit;
 end;
 Grid1.DefaultDrawColumnCell(Rect,datacol, column,State);

Работает ... если все записи вмещаются сразу в гриде и начинает сбиваться, если проматываешь грид.

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

С уважением.


Ega23   (2010-11-30 10:25:00) [1]

dgr.DataSource.DataSet.RecNo

Далеко не всегда сработает. Не стоит на это свойство закладываться.


Кайрат   (2010-11-30 09:44:00) [2]

TColorGrid = class
 private
   // Цвет строки
   FRowColor : TColor;
 protected
   // Функция чтения
   function GetRowColor : TColor;

   // Процедура записи
   procedure SetRowColor(const Value : TColor);
 public
   // Начальные значения
   constructor Create;

   destructor Destroy; override;

   // Визуализация сетки
   procedure ColorDBGrid(const dgr : TDBGrid; Rect :TRect; Field : TField; State : TGridDrawState); overload;

   // Свойство для установки цвета строки в сетке.
   property RowColor : TColor read GetRowColor write SetRowColor;
 end;

...
var
 ColorGrid : TColorGrid;

implementation

...

procedure TColorGrid.ColorDBGrid(const dgr: TDBGrid; Rect: TRect;
 Field: TField; State: TGridDrawState);
begin
 try
   if not Odd(dgr.DataSource.DataSet.RecNo) then
     if (gdSelected in State) or (gdFocused in State) then
     begin
       dgr.Canvas.Brush.Color := clHighlight;
       dgr.Canvas.Font.Color := clWhite;
     end
     else
     begin
       dgr.Canvas.Brush.Color := FRowColor;
       dgr.Canvas.Font.Color := clBlack;
     end;
     dgr.Canvas.FillRect(Rect);
     dgr.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Field.AsString);
  finally
   { Nothing }
  end;
end;

constructor TColorGrid.Create;
begin
 inherited;
 FRowColor := $00F7D3C6; // Здесь можете указать любой цвет
end;

destructor TColorGrid.Destroy;
begin

 inherited;
end;

function TColorGrid.GetRowColor: TColor;
begin
 Result := FRowColor;
end;

procedure TColorGrid.SetRowColor(const Value: TColor);
begin
 if FRowColor = Value then
   Exit;
 FRowColor := Value;
end;

// =====================================================
// Пришем обработчик DBGrid1DrawDataCell для грида

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject;
 const Rect: TRect; Field: TField; State: TGridDrawState);
begin
 ColorGrid.ColorDBGrid(TDBGrid(Sender), Rect, Field, State);
end;

// =====================================================
// Изменять цвет можно примерно так
procedure TFormq.btChangeRowColorClick(Sender: TObject);
var
 i : Integer;
begin
 if ColorDialog1.Execute then
 begin
   if ColorDialog1.Color = ColorGrid.RowColor then
     Exit;
   ColorGrid.RowColor := ColorDialog1.Color;
   for i := 0 to ComponentCount - 1 do
     if Components[i] is TDBGrid then
       (Components[i] as TDBGrid).Repaint;
 end;
end;


TohaNik   (2010-10-14 18:45:00) [3]

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


Медвежонок Пятачок   (2010-10-14 17:32:00) [4]

Вопрос давно решен.
Следуй инструкциям выше и получишь грид с желтой шпалой по всей ширине.


yurikon   (2010-10-14 17:01:00) [5]


> PS
Использовать
> встроенную подстветку в DBGridEh не хочу - цвет не тот.
>


Уже угадал, Вы пропустили... Но вопрос остался.


Медвежонок Пятачок   (2010-10-14 16:07:00) [6]

а вся строка выделяется когда в гриде включена сам угадай какая опция.


yurikon   (2010-10-14 15:46:00) [7]

Добрый день!

Если использовать gdFocused или gdSelected, то выделяется только (!) ячейка, а мне нужно выделить всю строку.

Как из передаваемых параметров определить в какой строке перерисовываемая ячейка?

С уважением.


Медвежонок Пятачок   (2010-10-14 13:58:00) [8]

если нот фокусед внутри стэйт тогда дефолтдросолумнцелл
иначе сначала филрект нужным цветом затем текст ячейки поверх.

предварительно выключив дефолтдровинг у грида


Медвежонок Пятачок   (2010-10-14 13:37:00) [9]

Последняя строчка отрисовывает все остальные строки.

Мда.
Кто бы мог подумать, что она такая трудолюбивая и заботливая.


Германн   (2010-10-14 04:25:00) [10]


> Германн ©   (13.10.10 23:54) [5]

Наверно я не прав.


Германн   (2010-10-13 23:54:00) [11]


> Который из этих параметров поможет?


> State


yurikon   (2010-10-13 16:58:00) [12]


> Медвежонок Пятачок ©   (13.10.10 16:24) [1]


Последняя строчка отрисовывает все остальные строки.

(Sender: TObject;  const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState);

Который из этих параметров поможет?

PS
Статью про грид смотрел, раскрасить в зависимости от содержимого - ноу проблем. А вот подсветить просто текущую ... Использовать встроенную подстветку в DBGridEh не хочу - цвет не тот.

С уважением.


Медвежонок Пятачок   (2010-10-13 16:27:00) [13]

смотреть надо не на рекно, а на параметры обработчика рисования. они тебе не просто так даны.


Плохиш   (2010-10-13 16:25:00) [14]

статья "разноцветный грид"


Медвежонок Пятачок   (2010-10-13 16:24:00) [15]

ячейки отрисовываются не только тогда, когда текущей является строка датасета, которой эти ячейки соответствуют.
поэтому твой код неверный


Наверх

Титульная страница Поиск, карта сайта Написать письмо