Ultra
24-10-2004, 05:41 PM
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:
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:
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;
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:
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;
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:
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:
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;
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:
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;