Hast du schon mal über einen Filestream nachgedacht?
Da könntest du deine Daten hintereinander rein schreiben und auch wieder lesen.
Nachteil ist, da du ja kein "Inhaltsverzeichnis" hast, musst du alle Bitmaps durchgehen bis du das gefunden hast, welches du möchtest.
Also beim Speichern:
1. zuerst einen String mit dem Namen des Bitmap speichern
2. danach das Bitmap selbst abspeichern
3. wieder einen Namen, usw.
Ich habe sowas mal gemacht, weil ich gemischte Daten (u.a. auch Bitmaps) in einer Datei halten wollte. Im Unterschied zu deiner Anforderung lade ich allerdings die gesamte Datei wieder zurück.
Delphi-Quellcode:
procedure TCardset.ReadFromFile(Filename: string);
var
lFs: TFileStream;
lMs: TMemoryStream;
lLen: Longint;
lI: Integer;
begin
Free;
lFs:=TFileStream.Create(Filename,fmOpenRead);
lMs:=TMemoryStream.Create;
try
//Länge des Cardset
lFS.Read(lLen,SizeOf(lLen));
SetLength(Cards,lLen);
//Die Daten des Cardset speichern
for lI := 0 to Length(Cards) - 1 do begin
//Bitmap
lMs.Clear;
lFs.Read(lLen,SizeOf(lLen));
lMs.CopyFrom(lFs,lLen);
Cards[lI].Bitmap:=TBitmap.Create;
lMs.Position:=0;
Cards[lI].Bitmap.LoadFromStream(lMs);
//Strings
lFs.Read(lLen,SizeOf(lLen));
SetLength(Cards[lI].Name,lLen);
lFs.Read(PChar(Cards[lI].Name)^,lLen);
lFs.Read(lLen,SizeOf(lLen));
SetLength(Cards[lI].Kind,lLen);
lFs.Read(PChar(Cards[lI].Kind)^,lLen);
lFs.Read(lLen,SizeOf(lLen));
SetLength(Cards[lI].Description,lLen);
lFs.Read(PChar(Cards[lI].Description)^,lLen);
lFs.Read(lLen,SizeOf(lLen));
SetLength(Cards[lI].Action,lLen);
lFs.Read(PChar(Cards[lI].Action)^,lLen);
end;
finally
lFS.Free;
lMs.Free;
end;
end;
procedure TCardset.SaveToFile(Filename: string);
var
lFs: TFileStream;
lMs: TMemoryStream;
lLen: Longint;
lI: Integer;
begin
lFs:=TFileStream.Create(Filename,fmCreate);
lMs:=TMemoryStream.Create;
try
//Länge des Cardset
lLen:=Length(Cards);
lFs.Write(lLen,SizeOf(lLen));
//Die Daten des Cardset speichern
for lI := 0 to Length(Cards) - 1 do begin
//Bitmap
lMs.Clear;
Cards[lI].Bitmap.SaveToStream(lMs);
lMs.Position:=0;
lLen:=lMs.Size;
lFs.Write(lLen,SizeOf(lLen));
lFs.CopyFrom(lMs,lLen);
//Strings
lLen:=Length(Cards[lI].Name);
lFs.Write(lLen,SizeOf(lLen));
lFs.Write(PChar(Cards[lI].Name)^,lLen);
lLen:=Length(Cards[lI].Kind);
lFs.Write(lLen,SizeOf(lLen));
lFs.Write(PChar(Cards[lI].Kind)^,lLen);
lLen:=Length(Cards[lI].Description);
lFs.Write(lLen,SizeOf(lLen));
lFs.Write(PChar(Cards[lI].Description)^,lLen);
lLen:=Length(Cards[lI].Action);
lFs.Write(lLen,SizeOf(lLen));
lFs.Write(PChar(Cards[lI].Action)^,lLen);
end;
finally
lFs.Free;
lMs.Free;
end;
end;