Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在delphi中创建TStringGrid类,其中与单元格关联的对象数组被指定为更具体的类型_Delphi_Inheritance_Tstringgrid - Fatal编程技术网

在delphi中创建TStringGrid类,其中与单元格关联的对象数组被指定为更具体的类型

在delphi中创建TStringGrid类,其中与单元格关联的对象数组被指定为更具体的类型,delphi,inheritance,tstringgrid,Delphi,Inheritance,Tstringgrid,在Delphi中,如何创建从TStringGrid类派生的类,以便与网格单元格关联的TObject数组具有更特定的类型,例如用于指定单元格颜色的TColor?TStringGrid可以为每个单元格保存一个TObject。TColor不是从TObject继承的,因此不起作用 您可以为TObject添加一个TColor,但这将是一个很难解决未来问题的解决方案。这对任何类型都不起作用(只适用于那些最多只有指针大小的类型) 最好的解决方案是将数据“装箱”到ToObject中,并将此类对象的实例保存到St

在Delphi中,如何创建从TStringGrid类派生的类,以便与网格单元格关联的TObject数组具有更特定的类型,例如用于指定单元格颜色的TColor?

TStringGrid可以为每个单元格保存一个TObject。TColor不是从TObject继承的,因此不起作用

您可以为TObject添加一个TColor,但这将是一个很难解决未来问题的解决方案。这对任何类型都不起作用(只适用于那些最多只有指针大小的类型)

最好的解决方案是将数据“装箱”到ToObject中,并将此类对象的实例保存到StringGrid中

TMyBoxingColorObject = class
    Data : TColor;           // Or any other datatype
end;
不要忘记根据需要创建和释放对象


如果有许多不同的类型要装箱,也可以使用泛型。

TStringGrid可以为每个单元格保存一个TObject。TColor不是从TObject继承的,因此不起作用

您可以为TObject添加一个TColor,但这将是一个很难解决未来问题的解决方案。这对任何类型都不起作用(只适用于那些最多只有指针大小的类型)

最好的解决方案是将数据“装箱”到ToObject中,并将此类对象的实例保存到StringGrid中

TMyBoxingColorObject = class
    Data : TColor;           // Or any other datatype
end;
不要忘记根据需要创建和释放对象

如果有许多不同的类型要装箱,也可以使用泛型。

type
TStringColorGrid=class(TStringGrid)
私有的
函数GetColor(ACol,ARow:Integer):TColor;
过程SetColor(ACol,ARow:Integer;AValue:TColor);
公众的
属性颜色[ACol,ARow:Integer]:t颜色读取GetColor写入SetColor;
结束;
函数TStringColorGrid.GetColor(ACol,ARow:Integer):TColor;
开始
结果:=TColor(继承对象[ACol,ARow]);
结束;
过程TStringColorGrid.SetColor(ACol,ARow:Integer;AValue:TColor);
开始
继承的对象[ACol,ARow]:=TObject(AValue);
结束;
类型
TStringColorGrid=class(TStringGrid)
私有的
函数GetColor(ACol,ARow:Integer):TColor;
过程SetColor(ACol,ARow:Integer;AValue:TColor);
公众的
属性颜色[ACol,ARow:Integer]:t颜色读取GetColor写入SetColor;
结束;
函数TStringColorGrid.GetColor(ACol,ARow:Integer):TColor;
开始
结果:=TColor(继承对象[ACol,ARow]);
结束;
过程TStringColorGrid.SetColor(ACol,ARow:Integer;AValue:TColor);
开始
继承的对象[ACol,ARow]:=TObject(AValue);
结束;

“容易出现未来问题”-仅当Delphi再次使用ARC时。考虑到Embarcadero在10.4版中对该功能的反向兜售,这种情况不太可能在短期内再次发生。“最好的解决方案是将数据“装箱”——装箱的问题在于所有权。谁拥有长方体对象并应将其释放
TStringGrid
不够虚拟,无法单独在子代中可靠地实现这一点,这会给用户带来负担,根本无法实现生成子代的目的。我想说,在Delphi中使用
标记
,(列表视图项)
数据
对象[I]是相当惯用的
等,以存储适合本机大小整数的任何内容。(另外,说“TColor不从TObject继承”有点误导,因为TColor不从任何东西继承。)不过,如果您需要存储的数据超过本机大小的整数所能容纳的数量,您的建议还是很好的。“知道”我指的是TColor类型的对象,当我键入fullstop时,我会得到与TColor相关的选项。这是预期的行为吗?@TonyWalff不,事情不是这样的Tony,如果你想这样做,在不使用强制转换的情况下,你必须从TStringGrid(或自定义)派生一个新类,并公开一个正确装箱类型的新属性。就我个人而言,我成功地使用了拳击类并使用了一个cast:TMyBoxingColorObject(MyStringGrid.Objects[Col,Row])。然后,如果您添加一个点,Delphi将显示可用项。根据您的喜好,interposer类也可能会有所帮助。“容易出现未来问题”-只有在Delphi再次使用ARC时才会使用
TObject
。考虑到Embarcadero在10.4版中对该功能的反向兜售,这种情况不太可能在短期内再次发生。“最好的解决方案是将数据“装箱”——装箱的问题在于所有权。谁拥有长方体对象并应将其释放
TStringGrid
不够虚拟,无法单独在子代中可靠地实现这一点,这会给用户带来负担,根本无法实现生成子代的目的。我想说,在Delphi中使用
标记
,(列表视图项)
数据
对象[I]是相当惯用的
等,以存储适合本机大小整数的任何内容。(另外,说“TColor不从TObject继承”有点误导,因为TColor不从任何东西继承。)不过,如果您需要存储的数据超过本机大小的整数所能容纳的数量,您的建议还是很好的。“知道”我指的是TColor类型的对象,当我键入fullstop时,我会得到与TColor相关的选项。这是预期的行为吗?@TonyWalff不,事情不是这样的Tony,如果你想这样做,在不使用强制转换的情况下,你必须从TStringGrid(或自定义)派生一个新类,并公开一个正确装箱类型的新属性。就我个人而言,我成功地使用了拳击类并使用了一个cast:TMyBoxingColorObject(MyStringGrid.Objects[Col,Row])。然后,如果您添加一个点,Delphi将显示可用项。根据您的喜好,interposer类也会有所帮助。正如我在回答中所说的,这只适用于与指针大小相同的数据。OP说TColor只是一个例子。@fpiette它可以很好地用于指针大小的类型,它们可以更小。在32位系统上,Int64不会