我已经编写了一些代码,根据数据列表在我的 delphi 应用程序中为我的 stringgrid 上的单个单元格着色。
我现在需要OnDblClick
在我的 stringgrid 上的事件中编写一些代码来推断单元格是否是彩色的,然后根据找到的结果继续。例如:
DOUBLE CLICK CELL
IS CELL COLOURED
YES > PROCEED A
NO > PROCEED B
我已经编写了一些代码,根据数据列表在我的 delphi 应用程序中为我的 stringgrid 上的单个单元格着色。
我现在需要OnDblClick
在我的 stringgrid 上的事件中编写一些代码来推断单元格是否是彩色的,然后根据找到的结果继续。例如:
DOUBLE CLICK CELL
IS CELL COLOURED
YES > PROCEED A
NO > PROCEED B
将绘制时的颜色存储到预定义TStringGrid.Objects
属性中。当需要取回时,可以从Column
和Row
坐标取回。这是一个简单的示例,它根据单元格是否为奇数列存储或存储在单元格中,并在选择单元格时将存储的值简单地显示为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;
然后处理双击变得非常容易(感谢@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]
以便在那里有一些有意义的东西,以避免在检索值时进行不正确的转换。