Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > StringGrid


Автор: LExpert 18.9.2007, 07:39
Всем доброго время суток
возник такой проблемс 
возможно ли с StringGrid`e сделать выделение вертикальное (колонок) и не как по умолчнию (строк)
тоесть надо чтобы выделяся столец а не строка smile
заранее всем спасибо.

Автор: skyboy 18.9.2007, 09:19
используй DrawGrid. Тем более, что за отрисовку теблицы там отвечает только OnDrawCell.  Там только одна "проблема"(на самом деле - просто особенность): таблица изначально имеет "виртуальный" стиль - никакого свойства Cells нет, за хранение информации отвечаешь сам. 
Процедура отрисовки будет выглядеть:
Код

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var txt: string;
      backColor, textColor: TColor;
      isSelected: Boolean;
      senderGrid: TDrawGrid;
begin
 senderGrid:= Sender as TDrawGrid;
 isSelected:= false;
 {генерируем текст ячейки}
 if (ACol= 0) AND (ARow = 0)
  then
   txt:= ''
  else
   begin 
    if ACol = 0
     then // заголовок строки
      txt:= 'Строка ' + inttostr(ARow)
     else
      begin
       if ARow = 0
        then // заголовок столбца
         txt:= 'Столбец ' + inttostr(ACol)
        else // "обычная" ячейка
         txt:=  inttostr(ARow * senderGrid.ColCount + ACol);
      end;
   end;
 {/генерируем текст ячейки}
 if gdFocused in State 
  then // ячейка непосредственно выбрана
   isSelected:= True;
 if (SenderGrid.Selection.Left<= ACol) AND (SenderGrid.Selection.Right>= ACol) AND (SenderGrid.Selection.Top = 0) 
 then // среди выбранных ячеек есть заголовок столбца, к которому относится текущая ячейка
  isSelected:= True;
 if isSelected
  then // ячейка выделена
   begin
    textColor:= clWhite;
    if gdFixed in State
     then
      backColor:= $0999999
     else
      backColor:= $0FFAAAA;
   end
  else // ячейка не выделена
   begin
    textColor:= clBlack;
    if gdFixed in State
     then
      backColor:= $0DDDDDD
     else
      backColor:= $0FFFFFF;
   end;
 senderGrid.Canvas.Brush.Color:= backColor;
 senderGrid.Canvas.Font.Color:= textColor;
 senderGrid.Canvas.FillRect(Rect);
 senderGrid.Canvas.TextRect(Rect,Rect.Left,Rect.Top,txt);
end;

чтоб можно было выбирать заголовки столбцов, надо бы установить FixedCols/FixedRows == 0, а также добавить процедуру-обработчик onClick, чтоб при выборе заголовков инициировать перерисовку
Код

procedure TForm1.DrawGrid1Click(Sender: TObject);
begin
 DrawGrid1.Invalidate();
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)