Конференция "Базы" » Выделение строки в гриде цветов [D7, access]
 
  • yurikon (13.10.10 15:28) [0]
    Добрый  день!

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

     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);

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

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

    С уважением.
  • Медвежонок Пятачок © (13.10.10 16:24) [1]
    ячейки отрисовываются не только тогда, когда текущей является строка датасета, которой эти ячейки соответствуют.
    поэтому твой код неверный
  • Плохиш © (13.10.10 16:25) [2]
    статья "разноцветный грид"
  • Медвежонок Пятачок © (13.10.10 16:27) [3]
    смотреть надо не на рекно, а на параметры обработчика рисования. они тебе не просто так даны.
  • yurikon (13.10.10 16:58) [4]

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


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

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

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

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

    С уважением.
  • Германн © (13.10.10 23:54) [5]

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


    > State
  • Германн © (14.10.10 04:25) [6]

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

    Наверно я не прав.
  • Медвежонок Пятачок © (14.10.10 13:37) [7]
    Последняя строчка отрисовывает все остальные строки.

    Мда.
    Кто бы мог подумать, что она такая трудолюбивая и заботливая.
  • Медвежонок Пятачок © (14.10.10 13:58) [8]
    если нот фокусед внутри стэйт тогда дефолтдросолумнцелл
    иначе сначала филрект нужным цветом затем текст ячейки поверх.

    предварительно выключив дефолтдровинг у грида
  • yurikon (14.10.10 15:46) [9]
    Добрый день!

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

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

    С уважением.
  • Медвежонок Пятачок © (14.10.10 16:07) [10]
    а вся строка выделяется когда в гриде включена сам угадай какая опция.
  • yurikon (14.10.10 17:01) [11]

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


    Уже угадал, Вы пропустили... Но вопрос остался.
  • Медвежонок Пятачок © (14.10.10 17:32) [12]
    Вопрос давно решен.
    Следуй инструкциям выше и получишь грид с желтой шпалой по всей ширине.
  • TohaNik © (14.10.10 18:45) [13]
    Не кошерно!
    Надо, что б определялся текущий цвет ногтей у главбуха, и никоим образом не менялся до смены настроения у её же.
  • Кайрат (30.11.10 09:44) [14]
    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;
  • Ega23 © (30.11.10 10:25) [15]
    dgr.DataSource.DataSet.RecNo



    Далеко не всегда сработает. Не стоит на это свойство закладываться.
 
Конференция "Базы" » Выделение строки в гриде цветов [D7, access]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]