Gibt es nur soviel Strings (A) wieviel Knoten es auch gibt (S)?
Hier die Speichern- und Laden-Procedure, allerdings ungetestet
Delphi-Quellcode:
procedure LoadKnotFromStream(AStream: TStream; AKnot: PKnot);
var LChilds, LCount, LInt: Integer;
begin
AStream.Read(LChilds, SizeOf(LChilds));
for LCount := 1 to 11 do
begin
if LCount <= LChilds then
begin
//Länge des Strings lesen
AStream.Read(LInt, SizeOf(LInt));
setlength(AKnot.A[LCount], LInt);
//String aus Stream lesen
AStream.Read(AKnot.A[LCount][1], LInt);
//speicher für unterknoten anfordern
new(AKnot.S[LCount]);
LoadKnotFromStream(AStream, AKnot.S[LCount]);
end else
AKnot.S[LCount] := nil;
end;
end;
procedure SaveKnotToStream(AStream: TStream; AKnot: PKnot);
var LChilds, LCount, LInt: Integer;
begin
//ermitteln wieviel Chidls
LChilds := 0;
while (LChilds < 11) and (AKnot.S[LChilds + 1] <> nil) do
inc(LChilds);
//Anzahl der Childs in Stream speichern
AStream.Write(LChilds, SizeOf(LChilds));
//Childs durchgehen
for LCount := 1 to LChilds do
begin
//Länge des Strings ermitteln
LInt := Length(AKnot.A[LCount]);
//Länge des Strings speichern
AStream.Write(LInt, SizeOf(LInt));
//String speichern
AStream.Write(AKnot.A[LCount][1], LInt);
//unterKnoten aufrufen
SaveKnotToStream(AStream, AKnot.S[LChilds]);
end;
end;
irgendwo wirst du ja einen RootKnoten vom Typ "TKnot" haben. Somit erfolgt der Aufruf so:
Delphi-Quellcode:
var LStream: TStream;
begin
LStream := TMemoryStream.Create;
SaveKnotToStream(LStream, PKnot(@YourRootKnot));
LStream.SaveToFile('xyz.txt');
LStream.Free;
end;
Laden funkioniert dann nach dem gleichen Prinzip.