各位,我使用delphi做一个上位机软件,其中有一项功能是解析文件,我把解析好的文件以内存流的形式存储,现在想验证解析是否正确,将内存流内容读到memo上看,for i:=1 to index do   {index为内存流个数}
    Memo1.Lines.LoadFromStream(mStream[i]);可是在memo上却没有显示,请问各位是什么原因?

解决方案 »

  1.   


    刚才加了一句mStream[i].position:=0;就可以显示了,但是显示的结果不是我想要的,不知道是显示过程错了,还是解析过程错了,请问如何能直接观测mStream的值呢?
      

  2.   

    不知道你的内存流里是什么内容,如果是可正常显示的字符,可以先把它转成string,然后可以用
    Memo1.Lines.Add(string)的方式
    如果内存流里的是其他内容,你想用观测其16进制值,则要先把它转换成十六进制的字符串,再用上面那句加到memo1里显示,这样就可以每行显示一个Stream的值
      

  3.   

    亲,先请教一下写内存流的问题吧,我估计错误在这里。mStream := TMemoryStream.Create;
    mStream.Write(DataContent,DataSize);{DataContent是写入内存流数据的缓存,DataSize是写入流字节数}
    mStream.Position:=0;
    Memo1.Lines.LoadFromStream(mStream); {读出流中的内容到 Memo1}观测DataContent是     000B000B000B000B000B000B000B000B000B000B000B000B000B000B000B000B
    而从memo1中看到的却是 @000B000B000B000B000B000B000B000
    这是怎么回事呢?
      

  4.   

    DataContent是什么类型的?或者说是如何定义的?
    如果不是字符好像不能这样读入memo吧
      

  5.   

    亲,忘了说了,DataContent是这样定义的:
    DataContent:string[64];      //写入FLASH的有效数据
    我这里写的是有问题,因为才接触delphi,好多知识不熟悉,请大侠指点啊~
      

  6.   

    既然是string,那就没必要用流读入了,直接加进memo就可以了
    for i:=0 to 63
    Memo1.Lines.Add(DataContent[i]);
      

  7.   


    是这样,在这里把程序的作用省略了。我是把一个文件解析出来,读入一个内存流中,现在只是为了验证读入的数据是否是正确的,才显示在memo上,观察是否是正确的。实际操作时,是把内存流的数据读出,再加载到一个数组中,以CAN报文的形式发送出去的。
      

  8.   


    估计问题出在mStream.Write(DataContent, DataSize)这里,因为你的DataContent被定义为String[64]类型的变量,而String类型的变量包含了一个头结构(里面存在的是字符串的长度)。如果你非要使用String类型的变量,那么请使用mString.Write(DataContent[1], DataSize)来处理。另外,通常做通讯软件的时候,建议采用Array[0..len] of Char类型的变量来发送。
      

  9.   

      这样说吧,memo只能正常显示普通的文本字符,而你从文件中解析出来的内容显然不是,为了要在memo中正常显示,你要先通过某种方式把它变成文本,然后才能装入memo中显示.
      比如,你的内存流中的数据是(16进制):20 00 1A 3B 0C 7F 99 ....
      这种数据是不能直接载入memo中的,你要想在memo中看到这种直观的效果,要先把它们转变成一个字符串.
    例如:
    procedure TForm2.Button1Click(Sender: TObject);
    const
      dt:array [0..9] of byte=($20,$00,$1A,$3B,$0C,$7F,$99,$65,$EE,$B0);
    var
      s,s1:string;
      i:integer;
    begin
      memo1.Lines.Clear;
      s:='';
      for I := 0 to 9 do
        s:=s+format('%.2x ',[dt[i]]);
      memo1.Lines.Add(s);
    end;
    这里我用dt这个Byte型数组模拟你内存流中的数据,这个方法效率不高,但大至意思如此
      

  10.   

    改成mString.Write(DataContent[1], DataSize)以后,果然不出现那个@了,但是很奇怪的是,我明明是要输出32个字节,却显示的是16个字节,这是怎么回事呢?