Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
Delphi XE2 Professional
|
Re: Speichereffizientes Speichern von Boolean Array's
26. Feb 2008, 10:26
Das würde gehn, wenn ich solche Arrays öfter brauchen würde würde ich die Klasse bestimmt machen, hab es nun fertig gemacht und es Funktioniert wunderbar .
Hier für alle Neugierigen :
Delphi-Quellcode:
Procedure LoadLetterData;
Var
f: TFilestream;
i, j, w, h, k: Integer;
b: Byte;
Begin
If Fileexists(IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'Letters.dat') Then Begin
f := TFileStream.create(IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'Letters.dat', fmopenread);
// Wir Speichern Jeden Buchstaben und einfach alles
For i := 0 To High(MainLetterData) Do Begin
f.read(j, sizeof(j));
setlength(MainLetterData[i], j);
// Laden der Datensätze
For j := 0 To high(MainLetterData[i]) Do Begin
f.read(w, sizeof(w)); // Breite
f.read(h, sizeof(H)); // Höhe
setlength(MainLetterData[i, j], w, h);
For h := 0 To high(MainLetterData[i, j, 0]) Do Begin
For w := 0 To trunc(high(MainLetterData[i, j]) / 8) Do Begin
f.read(b, sizeof(b));
For k := 0 To 7 Do
If (w * 8 + k) <= high(MainLetterData[i, j]) Then
// Das Jeweils Richtige Bit Auslesen
MainLetterData[i, j, w * 8 + k, h] := ((b Shr k) And 1) = 1;
End;
End;
End;
End;
f.free;
End
Else Begin
For i := 0 To High(MainLetterData) Do
setlength(MainLetterData[i], 0);
End;
End;
Procedure SaveDynArr(Const f: TStream; Data: TBoolArray);
Var
w, h, i, j, k: Integer;
b: Byte;
Begin
w := high(Data) + 1;
h := High(Data[0]) + 1;
// Zum Glück ist Data immer Rechteckig
f.write(w, sizeof(w));
f.write(h, sizeof(h));
// Da wir die Breite Packen wirds etwas umständlich *g*
For j := 0 To High(Data[0]) Do Begin // Über alle y - Werte
For i := 0 To trunc(high(Data) / 8) Do Begin
b := 0;
For k := 0 To 7 Do
// Das Letze Byte mus nicht unbedingt voll sein.
If (i * 8 + k) <= High(Data) Then
b := b + ord(Data[i * 8 + k, j]) Shl k;
f.write(b, sizeof(b));
End;
End;
End;
Procedure SaveLetterData;
Var
f: TFilestream;
i, j: Integer;
Begin
f := TFileStream.create(IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'Letters.dat', fmcreate Or fmopenwrite);
// Wir Speichern Jeden Buchstaben und einfach alles
For i := 0 To High(MainLetterData) Do Begin
// f.write(i, sizeof(i)); // Als 1. Die Nummer des Buchstabens <-- Redundant
j := High(MainLetterData[i]) + 1; // Dann die Anzahl der Elemente des Buchstabens
f.write(j, sizeof(j));
// Dann Alle Datensätze des Jeweiligen Buchstabens
For j := 0 To High(MainLetterData[i]) Do Begin
SaveDynArr(f, MainLetterData[i, j]);
End;
End;
f.free;
End;
|
|
Zitat
|