установить цвет выбранной ячейки строки в TStringGrid с помощью клавиши пробела

У меня есть отчет в TStringGrid, и мне нужно, чтобы при нажатии клавиши пробела менялся цвет bg выбранных ячеек горизонтальной строки.

как это сделать


person zuluman    schedule 06.09.2015    source источник
comment
Запомните состояния строк (в некоторой коллекции), и когда пользователь нажимает клавишу пробела, обновите это состояние и вызовите Invalidate для сетки. Наконец, в событии OnDrawCell нарисуйте ячейку строки по ее состоянию.   -  person TLama    schedule 07.09.2015
comment
Установка цвета фона выбранной строки в TStringGrid вам не помогает?   -  person Ken White    schedule 07.09.2015


Ответы (1)


      TSelColor = class
      public
        Color: TColor;
        constructor Create(const aColor: TColor);
      end;

      TForm1 = class(TForm)
        StringGrid1: TStringGrid;
        procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
          Rect: TRect; State: TGridDrawState);
        procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
      public
        kPressed: boolean;
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      yourColor: TColor;
    begin
      yourColor:= clRed;
      if gdFixed in State then
        TStringGrid(Sender).Canvas.Brush.Color:= clBtnFace
      else if gdSelected in State then
      begin
        TStringGrid(Sender).Canvas.Brush.Color:= clAqua;
        if kPressed and not (TStringGrid(Sender).Objects[ACol, ARow] is TSelColor) then
          TStringGrid(Sender).Objects[ACol, ARow]:= TSelColor.Create(yourColor)
        else if kPressed and (TStringGrid(Sender).Objects[ACol, ARow] is TSelColor) then
          TStringGrid(Sender).Objects[ACol, ARow]:= nil;
      end
      else
      begin
        TStringGrid(Sender).Canvas.Brush.Color:= clWindow;
        if TStringGrid(Sender).Objects[ACol, ARow] is TSelColor then
          TStringGrid(Sender).Canvas.Brush.Color:= TSelColor(TStringGrid(Sender).Objects[ACol, ARow]).Color;
      end;
      TStringGrid(Sender).Canvas.FillRect(Rect);
      TStringGrid(Sender).Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, TStringGrid(Sender).Cells[ACol, ARow]);
    end;

    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if Key = 32 then
      begin
        kPressed:= true;
        StringGrid1.Repaint;
        kPressed:= false;
      end;
    end;

    { TSelColor }

    constructor TSelColor.Create(const aColor: TColor);
    begin
      inherited Create;
      Color:= aColor;
    end;

StringGrid1
DefaultDrawning [false] Options.goRowSelect [true]

person scribe    schedule 08.09.2015