магазин цвет в то время вы рисуете его в предопределенной TStringGrid.Objects
собственности. Когда вам нужно его восстановить, вы можете вернуть его из координат Column
и . Вот тривиальный пример, который хранит либо clWhite
, либо clBlack
в ячейке Objects
для ячейки, основываясь на том, является ли это столбцом с нечетными номерами и просто отображает сохраненное значение в виде строки, когда ячейка выбрана. Это должно заставить вас начать.
procedure TForm1.FormCreate(Sender: TObject);
var
r, c: Integer;
const
ColorSel: array[Boolean] of TColor = (clWhite, clBlack);
begin
StringGrid1.RowCount := 10;
StringGrid1.ColCount := 6;
for c := 1 to StringGrid1.ColCount - 1 do
for r := 1 to StringGrid1.RowCount - 1 do
begin
StringGrid1.Cells[c, r] := Format('C: %d R: %d', [c, r]);
StringGrid1.Objects[c, r] := TObject(ColorSel[Odd(c)]);
end;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
ShowMessage(ColorToString(TColor(StringGrid1.Objects[ACol, ARow])));
end;
Вы можете использовать это в OnMouseUp
случае легко обнаружить, что цвет в клетке. Удалите StringGrid1SelectCell
(с помощью инспектора объектов, просто удалите значение для события) и добавить это как OnMouseUp
событие для сетки вместо:
procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Col, Row: Integer;
begin
StringGrid1.MouseToCell(X, Y, Col, Row);
if (Col > -1) and (Row > -1) then
ShowMessage(ColorToString(TColor(StringGrid1.Objects[Col, Row])));
end;
Handling двойного щелчка мышью становится очень легко (благодаря @TLama для большой помощь):
procedure TForm1.StringGrid1DblClick(Sender: TObject);
var
IsDefaultColor: Boolean;
CurrCellColor: TColor;
CurrCol, CurrRow: Integer;
begin
// Save typing by grabbing the currently selected cell col/row
CurrCol := StringGrid1.Col;
CurrRow := StringGrid1.Row;
// Get the stored color for the selected cell
CurrCellColor := TColor(StringGrid1.Objects[CurrCol, CurrRow]);
// See if it's been painted a different color than the default
IsDefaultColor := (CurrCellColor = StringGrid1.Color);
if not IsDefaultColor then
HandleDifferentColorCell
else
HandleNormalColorCell;
end;
Обратите внимание, что если вы выбираете не изменить цвет для ячейки, вы все равно должны назначить по умолчанию цвет ячейки в Objects[Column, Row]
, так что есть что-то значимое там во избежание неправильного обращения при извлечении значения.
Вы должны запросить базовые данные (список перечисленных вами данных) по выбранным координатам ячейки для этого условия. – TLama
«цвет» ваших ячеек в событии рисования или у вас есть базовая структура раскраски? – jachguate
@TLama Я мог бы использовать данные в моем списке, чтобы узнать, занята ли ячейка, но это похоже на долгую проблему. @jachguate Я окрашиваю ячейки с использованием свойства 'Rect'. Я только что попытался использовать 'if StringGrid.Canvas.Pixels [ACol, ARow] <> $ 00FFFFFF then' и, похоже, работает, но только некоторое время. Я не уверен, что заставляет его вести себя непредсказуемо. – Babah254