DELPHI记录集结构以流的方式文字+图片写入自定义库
文件名:Libdat.dat,这个数据库是自定义的不是标准的
ACCESS之类的,文件内容如下:
//--------------------------------------------------------
Delphi文字和图片以流的方式写入文件中
记录集结构
结构方式写入文件的,但是文件的结构如下:
姓名  年龄  照片
张三  25    张三的照片
李四  20    
赵五  22    赵五的照片
意思是有的记录有照片,有的记录没有照片

解决方案 »

  1.   

    我原记录集结构是:
    type
        TRec=record     {定义一个记录}
        name:string[10];     //姓名
          xb:string[2];      //性别
         age:integer;        //年龄
          yw:integer;        //语文
          xs:integer;        //数学
          zz:integer;        //政治
    end;
    //==============================================
    这个结构的基本操作:添加\删除\修改\保存\第一条记录\上一条\下一条
                       最后一条\插入等功能都完成了
    //----------------------------------------------
    操作方式:非文件流格式,文件格式都测试OK...............
    //==============================================
    我现在的问题是加上:
      zpsize:integer;        //图片的大小
          zp:Tpicture;       //照片
    以文件流的方式,不知如何处理了.........................
      

  2.   

      zpsize:integer;        //图片的大小
          zp:Tpicture;       //照片
    //我这样定义行不行呀
      

  3.   

    你怎么定义结构无所谓,你在保存到你的数据库中的时候,要为这个记录保存好照片的地址。因为你可以“插入”图片,但是你的数据库不能“插入图片”,只能追加图片,所以,追加的图片所在文件中的地址,要保存好。也就是说,你的照片,实际上存的是照片大小和照片地址,而不仅仅是照片的实际内容。你照片的实际内容只有在你的程序中才有意义。所以,你需要的是:zpsize,zpaddr,zp
      

  4.   

    花了半个多小时,随手写的,未测试定义一个文件头filehead://默认偏移量为0
    TFileHead = record
    indexpos:longint;
    indexlen:longint;
    ...
    end;定义一个datahead:
    TDataHead = record
    name:string[8];
    age:byte;
    picoffset:longint;
    picsize:longint;
    pictype:string[5];//也可以定义为其他
    ...
    end;定义一个文件句柄,比如fh:intege;//全局变量,可能后面用得着
    打开文件:
    procedure openmyfile;
    begin
      fh:=fileopen('文件名',fmopenreadwrite);
    end;
    定义一个文件头变量,比如ffilehead;//全局变量,可能后面用得着
    读文件头:
    procedure readfilehead;
    begin
      FileSeek(fh,0,0);
      FileRead(fh,ffilehead,sizeof(TFileHead));
    end;写文件头:
    procedure writefilehead;
    begin
      FileSeek(fh,0,0);
      Filewrite(fh,ffilehead,sizeof(TFileHead));
    end;
    装载纪录:
    procedure doload;
    var i,n,rec:integer;
         ms:tmemorystream;
    begin
      readfilehead;
      ms:=tmemorystream.create;
      fileseek(0,0);
      fileread(fh,ms.Memory^,fh.indexlen);
      n:=fh.indexlen div sizeof(longint);//得到纪录条数
      ms.seek(0,0);
      for i:=0 to n-1 do
      begin
         ms.read(rec,sizeof(longint));//得到数据头偏移量
         readdatahead(rec);//读出数据头
         //具体装载过程....
      end;
      ms.free;
    end;
    保存纪录:
    procedure dosave;
    var i,n,rec:integer;
         ms:tmemorystream;
    begin
      //确定总纪录数n:=....
      ms:=tmemorystream.create;
      for i:=0 to n-1 do
      begin
         rec:=...//取数据头偏移量,它应该由你自己管理,比如用TREEVIEW的DATA,所以可以读出
         ms.write(rec,sizeof(longint));//写数据头偏移量
         ....
      end;
      with ffilehead do
      begin
        indexpos:=filessek(0,2);//文件尾部
        indexlen:=ms.size;
      end;
      filewrite(fh,ms.Memory^,ms.size);//保存
      writefilehead;//保存文件头
      ms.free;
    end;
    关闭文件:
    procedure closemyfile;
    begin
      fileclose(fh);
      fh:=-1;
    end;
    定义一个数据头变量,比如fdatahead;//全局变量,可能后面用得着
    读数据头:
    procedure readdatahead(ofst:Integer); //ofst是指定记录的偏移量
    begin
      FileSeek(fh,ofst,0);
      FileRead(fh,fdatahead,SizeOf(TDataHead));
    end;写数据头:
    procedure writedatahead(ofst:Integer); //ofst是指定记录的偏移量
    begin
      FileSeek(fh,ofst,0);
      FileWrite(fh,fdatahead,SizeOf(TDataHead));
    end;读图片:
    procedure readpic(ofst,len:Integer;ms:tmemorystream);
    begin
      Fileseek(fh,ofst,0);
      fileread(fh,ms.Memory^,len);
    end;写图片:
    procedure writepic(ms: TMemoryStream);
    begin
      fileseek(fh,0,2);//写到文件尾部
      FileWrite(fh,ms.Memory^,ms.size);
    end;
      

  5.   


    iseekcode 请将完整的实例程序发到
      

  6.   

    请你给做个DEMO吧,我看得不太明白呀????????????????//
      

  7.   

    不行呀,看得有点头大,还请各位多多赐教呀>>>>>>>>>>>>>>>>.