Najlepiej w ogóle zapomnij o Move, dlatego że przykład jaki podałem działa tylko i wyłącznie dla rekordu posiadającego jedno pole jako macierz self-rekordów; Dodasz kolejne pole i się wywali (tak sądzę, bo nie testowałem); Zresztą sam powinieneś się o tym za niedługo przekonać :]
Edit: Tu masz przykład dla rekordów z dwoma polami - http://ideone.com/Nda4Jm:
type
TNode = record
Name: String;
SubNodes: array of TNode;
end;
function Node(const AName: String): TNode;
begin
Result.Name := AName;
Result.SubNodes := nil;
end;
function Node(const AName: String; ASubNodes: array of TNode): TNode;
var
intNodeIdx: Integer;
begin
Result.Name := AName;
SetLength(Result.SubNodes, Length(ASubNodes));
for intNodeIdx := 0 to High(ASubNodes) do
Result.SubNodes[intNodeIdx] := ASubNodes[intNodeIdx];
end;
var
nodeRoot: TNode;
begin
nodeRoot := Node('Level 1, Root 1',
[
Node('Level 2, Leaf 1'),
Node('Level 2, Leaf 2'),
Node('Level 2, Root 1',
[
Node('Level 3, Leaf 1'),
Node('Level 3, Leaf 2'),
Node('Level 3, Root 1',
[
Node('Level 4, Leaf 1'),
Node('Level 4, Leaf 2')
])
]),
Node('Level 2, Leaf 3'),
Node('Level 2, Leaf 4'),
Node('Level 2, Root 2',
[
Node('Level 3, Leaf 1'),
Node('Level 3, Leaf 2')
])
]);
end.
Jak widać też działa prawidłowo i nie ma wyjątków czy wycieków pamięci; Najważniejsze w tym sposobie jest to, że modyfikacja zawartości struktury TNode
nie oznacza poprawiania reszty kodu; Jeśli doda się nowe pole do rekordu to funkcje Node
same się dostosują.