RxRichEdit里面既有图片又有文字,用什么方法保存,即节省空间,效率又比较高呢?

解决方案 »

  1.   

    保存成流格式在数据库中,不过如果数据很大的话,保存成文件存放在电脑上吧,数据库就只保存路径流格式大概像这样:
    var
      MS:TMemoryStream;
    begin
      MS:=TMemoryStream.Create;
      try
        Adoquery1.append;
        RxRichEdit.Lines.SaveToStream(MS);
        MS.Position:=0;  
        TBlobField(Adoquery1.FieldByName('KKOO')).LoadFromStream(MS);
        Adoquery1.post;
      finally
        MS.Free;
      end;
    end;
      

  2.   

    RxRichEdit存储文件流,然后将流存入数据库
      

  3.   

    我大概里面有些图片文字吧,最多可能是有2,3M的内容,数据库为ACESS,主要是希望能节省空间,速度又快点
      

  4.   

    我刚才试验了一下,发现一个40KB的图片,要占差不多10MB样子,这也太大了,空间占的好大,除了保存在本地磁盘上,没有别的方法可以节省空间了吗
      

  5.   


    怎么可能,代码show出来。流只是一个字节读写的封装而已,影响最终大小的还是看你代码怎么写。
      

  6.   

    刚才由重新试验了,把原来的表删除了,发现了数据库的大小还是20M,而当我重新插入几个图片放进去的时候,数据库的大小也还是20M,并我没有像我第一次的时候插入的时候那种情况,每插入一张表,数据库就快速增长,这是为什么呢?数据库ACCESS   InsertNode :=RzTV_Function.Selected ;
      if (InsertNode <>nil) and (InsertNode.Level <>0) then
      begin
        Parent_Name :=InsertNode.Parent.Text;
        Child_Name :=InsertNode.Text ;
        Ms :=TMemoryStream.Create ;
        try
          with frm_Common do
          begin
            AdoCon_Formula.Connected :=True ;
            Adoqry_Save.Close ;
            Adoqry_Save.SQL.Clear ;
            Adoqry_Save.SQL.Add('Select * from '+Parent_Name +' where Type = :c');
            Adoqry_Save.Parameters.Items[0].Value :=Child_Name ;
            Adoqry_Save.Open ;
            Adoqry_Save.Edit ;
            RxRedt_Formulas.Lines.SaveToStream(Ms);
            Ms.Position :=0;
            TBlobField(Adoqry_Save.FieldByName('Content')).LoadFromStream(Ms);
            Adoqry_Save.Post ;
          end;
        finally
          Ms.Free ;
        end;
      end;
    end;
    下面是我的数据库加入字段后的大小和删除后的数据库大小,
    有两个表,电气这个表是专门用来存放“流的”,我删除了电气这个表后,数据大小没有改变
      

  7.   

    流的大小直接通过Ms.Size来判断单位是字节;
    RxRedt_Formulas.Lines.SaveToStream(Ms);这种代码中保存了文本,并不会保存richedit中的其他内容。
      

  8.   

    但是图片肯定也保存进去了,我用的是rxrichEdit,因为我可以从数据库中直接读出图片啊,恩,我试验一下看下MS.SIZE
      

  9.   

    单位是字节吗?我刚才插入一个图片后,显示的SIZE是456881,然后我把图片删除了以后显示的SIZE是164
      

  10.   

    刚才我试验了,SIZE的单位是字节吗?刚才我写了几个字,我看了一下,SIZE的大小是180,如果我添加了一个图片,SIZE就变为456897,为什么呢
      

  11.   

    RichEdit 存为流同样是 rtf编码,这个编码就是以16进制的文本来保存二进制数据,一个二进制字节,要用3个字节来保存,再加上格式控制码字节会比3个字节还多, (类似\hh 的文本,当然占的空间大了),既然是可见纯文本,用Zlib压缩一下吧,压缩比能达到5:1,空间是很可观的,效率上稍微要慢一点点,不过对单记录来说不会有感觉的。
    首先把RichEdit存到内存流中,然后用TCompressionStream压缩,最后把输出流保存到数据库中,解压缩反之,用TDecompressionStream而已。