TObjectList ( 积分: 50 )

  • 主题发起人 主题发起人 流水寿司
  • 开始时间 开始时间

流水寿司

Unregistered / Unconfirmed
GUEST, unregistred user!
有一二进制文件格式如下:
文件头
文件名1
图像1
文件名2
图像2
.
.
.
文件名N
图像N

我想写两个类:
TItem,有两个属性,FileName:String 和 Image:TJPEGImage
再写一个TItemList的类来保存TItem的列表,我想使用TObjectList,但调用Add方法的后发现没有把对象添加进去,望解答,谢谢
 
有一二进制文件格式如下:
文件头
文件名1
图像1
文件名2
图像2
.
.
.
文件名N
图像N

我想写两个类:
TItem,有两个属性,FileName:String 和 Image:TJPEGImage
再写一个TItemList的类来保存TItem的列表,我想使用TObjectList,但调用Add方法的后发现没有把对象添加进去,望解答,谢谢
 
Create了没有
 
肯定可以的
不过如果你只有2个属性,不如用tstringlist
string存放FileName,objects存放Image
 
看看你调用add方法的代码
 
代码:
    item:=TItem.Create;
    fs:=TFileStream.Create(FFileName,fmOpenRead and fmShareDenyWrite);
    ms:=TMemoryStream.Create;

    FItemList.Clear;//清空表情列表

    while fs.Position<fs.Size do//如果文件指针未到底
    begin
      try
        ReadHead;//读文件头
        fs.Read(FileNameLength,4);
        fs.Read(ImageLength,4);
        fs.Read(Item.FFileName,FileNameLength);//读入文件名
        ms.SetSize(Filel);
        fs.Read(ms.Memory^,Filel);
        jpg:=TJPEGImage.Create;
        jpg.LoadFromStream(ms);
        Item.FImage.LoadFromStream(ms);//这句会有AV错误,也就是无效内存访问错误,不知为何
        ItemList.Add(Item);
      except
        on E:Exception do
          begin
            ShowMessage(E.Message);
            ItemList.Clear;
            Exit;
          end;
      end;
所有变量我都事先声明了,我认真得检查过了,所以没问题,ItemList的Add只有一行:
代码:
function TEmotions.Add(Value: TItem): Integer;
begin
  Result:=FList.Add(value);//FList为TObjectList,也在TItemList.Create中创建过了
end;
望各位大侠百忙之中,指教一二,谢谢
 
Item.FImage.LoadFromStream(ms);//这句会有AV错误,也就是无效内存访问错误,不知为何
这句改成Item.FImage := jpg;

原因是Item.FImage 没有初始化
 
直接用tstringlist就好了,不用自己建类吧。
AddObject方法可以直接附加个对象在每一行上
var
...
sfilename: string;
sl: tstringlist;
begin
...
fs.Read(FileNameLength,4);
fs.Read(ImageLength,4);
fs.Read(sFileName,FileNameLength);//读入文件名
ms.SetSize(Filel);
fs.Read(ms.Memory^,Filel);
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(ms);
stringlist.add(filename, jpg);
...
 
Filel这个变量哪里来的?
 
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(ms);
不好意思,这两句是测试用的,忘记拿掉了,
FImage在TItem.Create中已经创建过了
Filel就是ImageLength,命令误差,对不住.

因为我觉得TObjectList既然专门用来放对象的,应该是可以使用的,而且可能以后还会扩展属性,暂时不考虑用TStringList,以后再研究,呵呵,谢谢.
 
跟踪进去看了
 
>>TItem,有两个属性,FileName:String 和 Image:TJPEGImage
>>fs.Read(Item.FFileName,FileNameLength);//读入文件名
这里肯定有问题,FileName最好用静态字符数组定义
 

Similar threads

回复
0
查看
676
万一
D
回复
0
查看
767
DelphiTeacher的专栏
D
D
回复
0
查看
744
DelphiTeacher的专栏
D
后退
顶部