задаване на цвят на избрана линия клетка в 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