Автор: Jeff Fisher

 

Я пытаюсь показать StringGrid без выделенной ячейки. Первая нефиксированная ячейка всегда имеет состояние "инвертированного" цвета. Я не хочу позволить пользователю редактировать сетку, но эта выделенная ячейка производит впечатление того, что сетка имеет возможность редактирования...

 

Вам необходимо создать обработчик события OnDrawCell. Это легче чем вы думаете. Вот образец кода, который сделает вас счастливым:

Code:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids;

 

type

TForm1 = class(TForm)

   StringGrid1: TStringGrid;

   procedure FormCreate(Sender: TObject);

   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

     Rect: TRect; State: TGridDrawState);

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.FormCreate(Sender: TObject);

var

C, R: Integer;

begin

for C := 0 to StringGrid1.ColCount - 1 do

begin

   for R := 0 to StringGrid1.RowCount - 1 do

   begin

     if (C < StringGrid1.FixedCols) or

        (R < StringGrid1.FixedRows) then

       StringGrid1.Cells[C, R] := Format('Fixed Cell (%dx%xd)', [C, R])

     else

       StringGrid1.Cells[C, R] := Format('Cell (%dx%d)', [C, R]);

   end;

end;

end;

 

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

var

I: Integer;

begin

with StringGrid1 do

   if gdFixed in State then

   begin

     Canvas.FillRect(Rect);

     InflateRect(Rect, -2, 0);

     if (ACol = Col) or (ARow = Row) then

       Canvas.Font.Style := [fsBold]

     else

       Canvas.Font.Style := [];

     DrawText(Canvas.Handle,

       PChar(Cells[ACol, ARow]), -1, Rect,

       DT_SINGLELINE or DT_VCENTER);

   end else begin

     Rect := CellRect(ACol, 0);

     for I := 1 to FixedRows - 1 do

       with CellRect(ACol, I) do

         Inc(Rect.Bottom, Bottom - Top);

     InvalidateRect(Handle, @Rect, True);

 

     Rect := CellRect(0, ARow);

     for I := 1 to FixedCols - 1 do

       with CellRect(I, ARow) do

         Inc(Rect.Right, Right - Left);

     InvalidateRect(Handle, @Rect, True);

   end;

end;

 

end.

То же самое я проделывал и с DBGrid. (Пока не реализован Shift-MouseDown, только Ctrl-MouseDown).

 Для TStringGrid вам нужно выполнить следующие шаги:

Заполните сетку, связывая Objects[0, ARow] с некоторым логическим объектом типа:

Автор: Neil J. Rubenking

 

Вот функция, выбирающая при нажатии на кнопку первую строку сетки. Это работает независимо от размера сетки и количества фиксированных строк/колонок.

Code:

function IsCellSelected(StringGrid: TStringGrid; X, Y: Longint): Boolean;

begin

  Result := False;

  try

    if (X >= StringGrid.Selection.Left) and (X <= StringGrid.Selection.Right) and

      (Y >= StringGrid.Selection.Top) and (Y <= StringGrid.Selection.Bottom) then

      Result := True;

  except

  end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  if IsCellSelected(stringgrid1, 2, 2) then

    ShowMessage('Cell (2,2) is selected.');

end;

 Если Вы хотете избавиться от выделенных ячеек TStringGrid, которые не имеют фокуса либо используются только для отображения данных, то попробуйте воспользоваться следующей небольшой процедурой.

Code:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

const

SelectedColor = Clblue;

begin

if (state = [gdSelected]) then

   with TStringGrid(Sender), Canvas do

   begin

     Brush.Color := SelectedColor;

     FillRect(Rect);

     TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);

   end;

end;