Hi, I've got a very annoying problem which I can't seem to solve by myself.

I want to load a list of images of my own format (nothing fancy at all as you'll see). I get no error when saving (but there may very well be something in there) however when loading I get a strange AV error that I've not been able to find the cause of.

Anyway I suck at describing things so here's the code that should be the cause of the problem:

TDXImageList saving and loading:
Code:
procedure TDXImageList.SaveToStream(Stream: TStream);
var
  i, len: Integer;
begin
  len := FList.Count;
  Stream.WriteBuffer(len, SizeOf(len));
  for i := 0 to len -1 do
    TDXImage(FList.Items[i]).SaveToStream(Stream);
end;

procedure TDXImageList.LoadFromStream(Stream: TStream);
var
  i, len: Integer;
  img: TDXImage;
begin
  Clear; // clears of any images that already existed
  Stream.ReadBuffer(len, SizeOf(len));
  for i := 0 to len -1 do
  begin
    img := TDXImage.Create(Self);
    img.LoadFromStream(Stream);
  end;
end;
TDXImage saving and loading:
Code:
procedure TDXImage.SaveToStream(Stream: TStream);
begin
  FImage.SaveToStream(Stream);
  Stream.WriteBuffer(FWidth, SizeOf(FWidth));
  Stream.WriteBuffer(FHeight, SizeOf(FHeight));
  Stream.WriteBuffer(FTileWidth, SizeOf(FTileWidth));
  Stream.WriteBuffer(FTileHeight, SizeOf(FTileHeight));
  Stream.WriteBuffer(FTransparent, SizeOf(FTransparent));
  Stream.WriteBuffer(FTransColor, SizeOf(FTransColor));
  WriteStr(FName, Stream);
end;

procedure TDXImage.LoadFromStream(Stream: TStream);
begin
  if Assigned(FImage) then FImage.Free;
  if Assigned(FImageList) then
    FImage := TMyImage.Create(FImageList.FHWnd)
  else
    FImage := TMyImage.Create(0);

  FImage.LoadFromStream(Stream);
  Stream.ReadBuffer(FWidth, SizeOf(FWidth));
  
  Stream.ReadBuffer(FHeight, SizeOf(FHeight));
  Stream.ReadBuffer(FTileWidth, SizeOf(FTileWidth));
  Stream.ReadBuffer(FTileHeight, SizeOf(FTileHeight));
  Stream.ReadBuffer(FTransparent, SizeOf(FTransparent));
  Stream.ReadBuffer(FTransColor, SizeOf(FTransColor));
  ReadStr(FName, Stream);
end;
TMyImage saving and loading;
Code:
procedure TMyImage.SaveToStream(Stream: TStream);
begin
  Stream.WriteBuffer(FWidth, SizeOf(FWidth));
  Stream.WriteBuffer(FHeight, SizeOf(FHeight));
  Stream.WriteBuffer(FPixels[0, 0], SizeOf(FPixels[0, 0])*FWidth*FHeight);
end;

procedure TMyImage.LoadFromStream(Stream: TStream);
begin
  Stream.ReadBuffer(FWidth, SizeOf(FWidth));
  Stream.ReadBuffer(FHeight, SizeOf(FHeight));
  SetLength(FPixels, FWidth, FHeight);
  Stream.ReadBuffer(FPixels[0, 0], SizeOf(FPixels[0, 0])*FWidth*FHeight);
end;
Save/Load a string from a stream:
Code:
procedure ReadStr(var s: String; Stream: TStream);
var
  len: Integer;
begin
  Stream.Read(len, SizeOf(len));
  SetLength(s, len);
  Stream.Read(s[1], SizeOf(s[1]) * len);
end;

procedure WriteStr(const s: String; Stream: TStream);
var
  len: Integer;
begin
  len := Length(s);
  Stream.Write(len, SizeOf(len));
  Stream.Write(s[1], SizeOf(s[1]) * len);
end;