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


Автор: Гость_AlexZ 20.3.2004, 23:20
Во время работы с StringGrid`ом, нужно выбраный столбец с данными виделить цветом.

Автор: p0s0l 21.3.2004, 14:09
Если надо сменить цвет текста, то делается примерно так (вешать на OnDrawCell):
Код

var HighlightCol : integer;
...
procedure TForm1.sg1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
 with sg1 do
 begin
   if ACol = HighlightCol then Canvas.Font.Color := clRed
     else Canvas.Font.Color := Font.Color; // или else exit;
   Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
 end;
end;

sg1 - TStringGrid;
sg1.DefaultDrawing := true должно быть (вначале рисуется ячейка полностью по дефолту, а потом поверх нарисованного рисуется текст другим цветом).
В переменной HighlightCol хранится № подсвечиваемого столбца. Если ты меняешь эту переменную, то после этого делай sg1.Repaint или sg1.Refresh, чтобы обновить окошко.

Если же тебе надо подсветку делать сменой цвета фона ячеек, то тут сложнее будет: DefaultDrawing := false, и в OnDrawCell отрисовывать ячейку полностью вручную - фон, учитываеть фокус, выделение, писать текст...

Автор: <Spawn> 21.3.2004, 15:30
По моему он хочет при клике на "шапку" столбца выделить его весь. Решил проверить как это можно сделать, но до конца не довел(есть одна ошибочка), т.к. нет ща времени. Вот код:

Код
type
 TSelInfo = record
   Selected: Boolean;
   SelCol: integer;
 end;

var
 Form1: TForm1;
 SelInfo: TSelInfo = (Selected:False; SelCol: 0);

implementation

{$R *.dfm}

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
 ClickCoord: TGridCoord;
begin
 ClickCoord := StringGrid1.MouseCoord(X, Y);
 if ClickCoord.Y < StringGrid1.FixedCols then
 begin
   SelInfo.Selected := True;
   SelInfo.SelCol := ClickCoord.X;
 end
 else
   SelInfo.Selected := False;
 StringGrid1.Invalidate;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 OldColor: TColor;
begin
 if SelInfo.Selected and (SelInfo.SelCol = ACol)
    and (ARow > StringGrid1.FixedRows - 1)
    and (ACol > StringGrid1.FixedCols - 1) then
 begin
   StringGrid1.DefaultDrawing := False;
   try
     OldColor := StringGrid1.Brush.Color;
     StringGrid1.Brush.Color := clRed;
     FillRect(StringGrid1.Canvas.Handle, Rect, StringGrid1.Brush.Handle);
   finally
     StringGrid1.Brush.Color := OldColor;
   end;
 end
 else
   StringGrid1.DefaultDrawing := True;
end;

Автор: Гость_AlexZ 21.3.2004, 17:25
Огромное спасибо всем за наводку! thumbs-up.gif
Это как раз то, что мне нужно ((почти)).
Но хотелось-бы выделить весь столбец/столбцы цветом, так, чтобы текст в ячейке отображался.
Заранее благодарен! adv/jump.gif

Автор: p0s0l 21.3.2004, 19:03
Я бы исправил код Spawn'а так:
Код
var
 SelCol : integer = -1;

procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
ClickCoord: TGridCoord;
begin
ClickCoord := StringGrid1.MouseCoord(X, Y);
if ClickCoord.Y < StringGrid1.FixedCols then
begin
  SelCol := ClickCoord.X;
end
else
  SelCol := -1;
StringGrid1.Invalidate;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 OldColor: TColor;
begin
 if not (gdFixed in State) and (ACol = SelCol) then
 with StringGrid1 do
 begin
  Canvas.Brush.Color := clRed;
  Canvas.TextRect(Rect, Rect.Left+2, Rect.Top + 2, Cells[ACol, ARow]);
 end;
end;

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