各位,我使用delphi做一个上位机软件,其中有一项功能是解析文件,我把解析好的文件以内存流的形式存储,现在想验证解析是否正确,将内存流内容读到memo上看,for i:=1 to index do {index为内存流个数}
Memo1.Lines.LoadFromStream(mStream[i]);可是在memo上却没有显示,请问各位是什么原因?
Memo1.Lines.LoadFromStream(mStream[i]);可是在memo上却没有显示,请问各位是什么原因?
解决方案 »
- 问一个关于ADO access和XML比较的问题
- 请问如何将此C语句转换成DELPHI的
- 怎样接收别的机子(不是电脑,而是像医疗仪器那样的可用COM口实时传出数据的仪器)的COM口数据?
- 如何通过函数获得当前计算机中的打印机列表,同时获得打印机的连接端口?
- 请问怎样在Delphi直接运行C:\WINNT\SysTem32\cmd.exe上面的DOS命令?
- 如何将dbgrid中的负数变为(正的红色)?(急!)
- 关于窗口重画的问题,求助
- 判断ClientDataSet.Delta.或有关OleVariant类型的帮助。
- 如何动态计算计ehlib的DBGridEh中的columns统计值(avg or sum)
- 向高手请教DELPHI中中文件绑定
- 安装DELPHI7自带的TEECHART,怎么弄
- rs485串口通讯
刚才加了一句mStream[i].position:=0;就可以显示了,但是显示的结果不是我想要的,不知道是显示过程错了,还是解析过程错了,请问如何能直接观测mStream的值呢?
Memo1.Lines.Add(string)的方式
如果内存流里的是其他内容,你想用观测其16进制值,则要先把它转换成十六进制的字符串,再用上面那句加到memo1里显示,这样就可以每行显示一个Stream的值
mStream.Write(DataContent,DataSize);{DataContent是写入内存流数据的缓存,DataSize是写入流字节数}
mStream.Position:=0;
Memo1.Lines.LoadFromStream(mStream); {读出流中的内容到 Memo1}观测DataContent是 000B000B000B000B000B000B000B000B000B000B000B000B000B000B000B000B
而从memo1中看到的却是 @000B000B000B000B000B000B000B000
这是怎么回事呢?
如果不是字符好像不能这样读入memo吧
DataContent:string[64]; //写入FLASH的有效数据
我这里写的是有问题,因为才接触delphi,好多知识不熟悉,请大侠指点啊~
for i:=0 to 63
Memo1.Lines.Add(DataContent[i]);
是这样,在这里把程序的作用省略了。我是把一个文件解析出来,读入一个内存流中,现在只是为了验证读入的数据是否是正确的,才显示在memo上,观察是否是正确的。实际操作时,是把内存流的数据读出,再加载到一个数组中,以CAN报文的形式发送出去的。
估计问题出在mStream.Write(DataContent, DataSize)这里,因为你的DataContent被定义为String[64]类型的变量,而String类型的变量包含了一个头结构(里面存在的是字符串的长度)。如果你非要使用String类型的变量,那么请使用mString.Write(DataContent[1], DataSize)来处理。另外,通常做通讯软件的时候,建议采用Array[0..len] of Char类型的变量来发送。
比如,你的内存流中的数据是(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型数组模拟你内存流中的数据,这个方法效率不高,但大至意思如此