在 delphi 中创建 TStringGrid class,其中与单元格关联的对象数组被指定为更具体的类型
Creating a TStringGrid class in delphi where the object array associated with the cells is specified as a more specific type
在 Delphi 中,如何创建从 TStringGrid class 派生的 class,以便与网格单元关联的 TObject 数组具有更具体的类型,例如 TColor哪个将用于指定单元格的颜色?
TStringGrid 可以为每个单元格保存一个 TObject。 TColor 没有从 TObject 继承,所以它不起作用。
您可以将 TColor 转换为 TObject,但这将是一个很糟糕的解决方案,以后容易出现问题。这不适用于任何类型(仅适用于最大指针大小的类型)。
最佳解决方案是将您的数据“装箱”到 TObject 中,并将此类对象的实例保存到 StringGrid 中。
TMyBoxingColorObject = class
Data : TColor; // Or any other datatype
end;
不要忘记根据需要创建和释放对象!
如果您有很多不同的类型需要装箱,您也可以使用泛型。
type
TStringColorGrid = class(TStringGrid)
private
function GetColor(ACol, ARow: Integer): TColor;
procedure SetColor(ACol, ARow: Integer; AValue: TColor);
public
property Colors[ACol, ARow: Integer]: TColor read GetColor write SetColor;
end;
function TStringColorGrid.GetColor(ACol, ARow: Integer): TColor;
begin
Result := TColor(inherited Objects[ACol, ARow]);
end;
procedure TStringColorGrid.SetColor(ACol, ARow: Integer; AValue: TColor);
begin
inherited Objects[ACol, ARow] := TObject(AValue);
end;
在 Delphi 中,如何创建从 TStringGrid class 派生的 class,以便与网格单元关联的 TObject 数组具有更具体的类型,例如 TColor哪个将用于指定单元格的颜色?
TStringGrid 可以为每个单元格保存一个 TObject。 TColor 没有从 TObject 继承,所以它不起作用。
您可以将 TColor 转换为 TObject,但这将是一个很糟糕的解决方案,以后容易出现问题。这不适用于任何类型(仅适用于最大指针大小的类型)。
最佳解决方案是将您的数据“装箱”到 TObject 中,并将此类对象的实例保存到 StringGrid 中。
TMyBoxingColorObject = class
Data : TColor; // Or any other datatype
end;
不要忘记根据需要创建和释放对象!
如果您有很多不同的类型需要装箱,您也可以使用泛型。
type
TStringColorGrid = class(TStringGrid)
private
function GetColor(ACol, ARow: Integer): TColor;
procedure SetColor(ACol, ARow: Integer; AValue: TColor);
public
property Colors[ACol, ARow: Integer]: TColor read GetColor write SetColor;
end;
function TStringColorGrid.GetColor(ACol, ARow: Integer): TColor;
begin
Result := TColor(inherited Objects[ACol, ARow]);
end;
procedure TStringColorGrid.SetColor(ACol, ARow: Integer; AValue: TColor);
begin
inherited Objects[ACol, ARow] := TObject(AValue);
end;