Я использую Lazarus v0.9.30 (32-битный компилятор).
У меня есть TForm со стандартной TStringGrid.Сетка имеет следующие свойства.RowCount = 5, ColumnCount = 5, FixedCols = 0, FixedRows = 0.
Я прогуглил некоторый код , который показал мне, как изменить цвет ячейки и добавить некоторый текст в ячейку, когдапользователь нажимает на ячейку TStringGrid.Все работает нормально, и я немного расширил его, чтобы включить или выключить цвет / текст в событии GridClick.
У меня больше вопросов, чтобы лучше понять цель некоторых элементов кода.
Существует массив объектов Foregroud (FG) и Background (BG) TColor.Должны ли они хранить атрибуты цвета ячейки, которые установлены в событии GridClick, поэтому, если событие DrawCell должно быть запущено снова по какой-либо причине, ячейка может перерисовать себя?Можете ли вы избежать использования массива TColors и просто установить цвет / текст в событии DrawCell, как требуется?
Если вам нужно использовать массивы, я бы предположил, что измерения должны соответствовать Grid.ColCount и Grid.RowCount (т. Е. Устанавливается с помощью вызова SetLength в Form.Create)
Есть ли способ обнаружить, что вы щелкаете за пределами 5 × 5 ячеек сетки строк (т. Е. В пустом пространстве) и, таким образом, предотвращатьGridClick от вызова события DrawCell.Независимо от того, где вы нажимаете, вы всегда получаете действительное значение для строки и столбца.
unit testunit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
ExtCtrls, Menus, ComCtrls, Buttons, Grids, StdCtrls, Windows, Variants,
LCLType;
type
{ TForm1 }
TForm1 = class(TForm)
Grid: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure GridClick(Sender: TObject);
procedure GridDrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
end;
var
Form1: TForm1;
implementation
var
FG: array of array of TColor;
BG: array of array of TColor;
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
Col, Row: integer;
begin
// Set the sizes of the arrays
SetLength(FG, 5, 5);
SetLength(BG, 5, 5);
// Initialize with default colors
for Col := 0 to Grid.ColCount - 1 do begin
for Row := 0 to Grid.RowCount - 1 do begin
FG[Col, Row] := clBlack;
BG[Col, Row] := clWhite;
end;
end;
end;
procedure TForm1.GridDrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var
S: string;
begin
S := Grid.Cells[ACol, ARow];
// Fill rectangle with colour
Grid.Canvas.Brush.Color := BG[ACol, ARow];
Grid.Canvas.FillRect(aRect);
// Next, draw the text in the rectangle
Grid.Canvas.Font.Color := FG[ACol, ARow];
Grid.Canvas.TextOut(aRect.Left + 22, aRect.Top + 2, S);
end;
procedure TForm1.GridClick(Sender: TObject);
var
Col, Row: integer;
begin
Col := Grid.Col;
Row := Grid.Row;
// Set the cell color and text to be displayed
if (Grid.Cells[Col,Row] <> 'Yes') then
begin
BG[Col, Row] := rgb(131, 245, 44);
FG[Col, Row] := RGB(0, 0, 0);
Grid.Cells[Col, Row] := 'Yes'
end {if}
else
begin
BG[Col, Row] := rgb(255, 255, 255);
FG[Col, Row] := RGB(255, 255, 255);
Grid.Cells[Col, Row] := '';
end; {else}
end;
end.