(编辑:这是从Are objects reference counted in Windows-targeted Delphi applications, and if so, what is its purpose?和Dynamic arrays and memory management in Delphi开始的。
我有两个课程(TGenericHoldingSummary
,TGenericHoldingResultSet
)和一个记录(TGenericHoldingResult
)。
TGenericHoldingSummary
包含一个TGenericHoldingResultSet
,如果需要,该nil
设置为TGenericHoldingResultSet
并从数据库延迟加载。TGenericHoldingResult
包含TGenericHoldingResultSet
条记录的动态数组。在下面,错误发生在TGenericHoldingResult = record
code : Integer;
level : String;
msg : String;
end;
TGenericHoldingResultSet = class(TObject)
public
// Lifecycle
constructor Create(parent : TGenericHoldingSummary; resArr : Array of TGenericHoldingResult);
destructor Destroy;
// Accessors
function ResultCount() : Integer;
function Result(i : Integer) : TGenericHoldingResult;
private
// Variables
summary : TGenericHoldingSummary;
resultArray : Array of TGenericHoldingResult;
end;
TGenericHoldingSummary = class(TObject)
public
// Note that the summary object 'owns' the results, and deallocates
// its memory in the destructor.
function getResultSet: TGenericHoldingResultSet;
private
// Member variables
resultSet: TGenericHoldingResultSet;
end;
// Note that the summary object 'owns' the results, and deallocates
// its memory in the destructor.
function TGenericHoldingSummary.getResultSet() : TGenericHoldingResultSet;
var
sql : String;
i : Integer;
resultArray : Array of TGenericHoldingResult;
begin
if resultSet = nil then
begin
// Get results via SQL.
SetLength(resultArray, holding.clientDataSet.RecordCount);
for i := 0 to holding.clientDataSet.RecordCount - 1 do
begin
resultArray[i].code := holding.clientDataSet.FieldByName('code').AsInteger;
resultArray[i].level := holding.clientDataSet.FieldByName('level').AsString;
resultArray[i].msg := holding.clientDataSet.FieldByName('message').AsString;
end;
resultSet := TGenericHoldingResultSet.Create(self, resultArray);
end;
result := resultSet;
end;
// Lifecycle
constructor TGenericHoldingResultSet.Create(parent : TGenericHoldingSummary; resArr : Array of TGenericHoldingResult);
begin
summary := parent;
// The following *should* work, shouldn't it?
// E.g., seeing as dynamic arrays a reference counted in Delphi for
// all platforms, this should simply increment the reference count.
resultArray := resArr;
end;
构造函数中的赋值。
[DCC Error] GenericHolding.pas(302): E2010 Incompatible types: 'Dynamic array' and 'Array'
错误如下:
{{1}}
答案 0 :(得分:5)
您无法将打开的数组分配给动态数组。请参阅Open Array Parameters
。
注意:开放数组参数的语法类似于动态数组类型的语法,但它们并不意味着相同。前面的示例创建了一个函数,该函数接受任何Char元素数组,包括(但不限于)动态数组。要声明必须是动态数组的参数,您需要指定类型标识符:
type TDynamicCharArray = array of Char;
function Find(const A: TDynamicCharArray): Integer;
可以在此处找到open arrays
用例的完整摘要以及与动态数组的区别:Open array parameters
。
如果你有一个支持泛型的Delphi版本,可以声明构造函数头:
constructor TGenericHoldingResultSet.Create(parent : TGenericHoldingSummary;
const resArr : TArray<TGenericHoldingResult>);
以及resultArray
为TArray<TGenericHoldingResult>
。
这将避免必须为数组声明特定类型。
如David所述,开放数组具有一个优势,因为它们具有更广泛的用例,应尽可能使用。