我自定义了以下的结构类型,其中包含一个动态数组,动态数组的大小由nMax,nMin,nStep来决定。现在我想保存其到文件,不知道该采用何种类型。用类型文件的话,里面的变量的长度必须都是固定的。如果用文本文件存,数组可能会很大,会影响存取速度。不知道各位有什么好的建议,最好能说清楚点。绝对新手,请多指教。    TScanInfo= record 
        bIsUsed: Boolean;           
        sSamName: String;           
        sOperator: String;          
        dtTestDateTime: TDateTime;  
        nMax: Integer;              
        nMin: integer;              
        nStep: integer;             
        tScanCoor: TCoordinates;    
        tTestValue: array of TCurWLInfo;  
        nStyle: TCurveStyle;        
    end;

解决方案 »

  1.   

    好像可以存成流文件,.dat的后缀,具体方法不是太记得了,很多参考资料上都有的,你查一下吧。
      

  2.   

    我试了一下TFileStream,但是无论我后期给动态数组的大小赋多少值,都没有用。怎么回事?
      

  3.   

    用 TFileStream,但这个保存的时候,要自己从整体上把握,你把你的动态的地方换成存放地址的形式,就相当存个索引到你的TScanInfo 中,要让TScanInfo 这里是固定的,在通过索引
    去找你的变体部分,TFileStream 是很快的,你不必担心
      

  4.   

    除了TFileStream之外还有什么方法吗?哪个会更适合我这种情况呢?因为我在文件前面还要存储一些其他信息。另外,可以反复用Write这个函数吗,结果是怎么样呢?是文件指针依次后移,还是每次都覆盖前面的内容。读取的时候该怎么判断呢?谢谢了
      

  5.   

    我找到方法了,谢谢各位。在存取TScanInfo型变量时,其中的动态数组本身就是将其地址存放的,对我来说没什么用。然后我再继续按照tTestValue[i]的形式,保存数据,大功告成。读取数据类似。好方法,比用文本形式好多了。只是不知道还有没有其它什么方法可以很好的保存数据。其中发现一个现象,就是Delphi中动态数组的存放,(很大程度上)不是连续的一个内存块,猜想其中是以链表的形势,将每个元素随即存放到不同地址,而每个元素都保存相邻元素的地址。可能能充分利用内存,但是一方面也增加了更多的信息。新手,所以发现后就说出来了。可能本来就是这个样子,只是我不知道而已。看过的书很少,本想看看帮助就能搞定,只是Delphi的帮助确实没有MSDN好。这样进展确实缓慢,看来真的要好好找两本书看看了。
      

  6.   

    你把记录类型改为类类型,从TComponent集成。然后使用流可以实现。
    参照代码如下:type
      recordA=class(TComponent)
      private
        FcolumnA:string[20];
        FcolumnB:Integer;
      published  //注意!!一定是published才行
        property columnA: string read FcolumnA write FcolumnA;
        property columnB: Integer read FColumnB write FcolumnB;
      end;给你段参考代码,里面的TNode和TEdge是两个不同的类
    保存对象到文件:
    function TShortWay.SaveTopo(FileName: String): Boolean;
    var
      stream   : TMemoryStream;
      iNodeCnt : Integer;
      iEdgeCnt : Integer;
      NodeTmp  : TNode;
    begin
      stream := TMemoryStream.Create;
      try
         for iNodeCnt := 0 to FNodeList.Count - 1 do
         begin
            NodeTmp := FNodeList.Items[iNodeCnt];
            NodeTmp.EdgeCnt := NodeTmp.EdgeList.Count;
            stream.WriteComponent(NodeTmp);
            for iEdgeCnt := 0 to NodeTmp.EdgeCnt - 1 do
            begin
              stream.WriteComponent(TEdge(NodeTmp.EdgeList[iEdgeCnt]));
            end;{end for iEdgeCnt}
         end;{end for iNodeCnt}
         stream.SaveToFile(FileName);
         Result := True;
      finally
        stream.Free;
      end;{end try}
    end;读文件到对象里:
    function TShortWay.ReadTopo(FileName: String): Boolean;
    var
      stream   : TMemoryStream;
      iEdgeCnt : Integer;
      NodeTmp  : TNode;
      EdgeTmp  : TEdge;
    begin
      stream := TMemoryStream.Create;
      try
        stream.LoadFromFile(FileName);
        while stream.Position <> stream.Size do
        begin
          NodeTmp := TNode.Create(Application);
          stream.ReadComponent(NodeTmp);
          FNodeList.Add(NodeTmp);
          for iEdgeCnt := 1 to NodeTmp.EdgeCnt do
          begin
            EdgeTmp := TEdge.Create(Application);
            stream.ReadComponent(EdgeTmp);
            NodeTmp.EdgeList.Add(EdgeTmp);
          end;{end for}
        end;{end while}
        Result := True;
      finally
        stream.Free;
      end;{end try}
    end;