(編輯:這是來自Are objects reference counted in Windows-targeted Delphi applications, and if so, what is its purpose?和Dynamic arrays and memory management in Delphi)。爲什麼我收到有關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'
這很有幫助,但現在我收到另一個錯誤。我改變了添加類型'TGenericHoldingResultDynamicArray = TGenericHoldingResult;數組'並且改變了參數,但是現在分配線'[DCC錯誤] GenericHolding.pas(261):E2010不兼容的類型:'TGenericHoldingResultDynamicArray'和'動態數組'。 – magnus
resultArray也必須聲明爲'TGenericHoldingResultDynamicArray'。 –
+1爲您的答案。 – magnus