motoedy 发表于 2014-2-17 10:53:11

delphi串口接受数据在Memo如何实现每行显示字符个数自定义?

delphi串口接受数据在Memo如何实现每行显示字符个数自定义?
最近在学习delphi
写个串口接受小软件,想实现接受数据自定义显示格式
例如下位机发数据没有做格式处理,(这里的格式处理指的是每N个数据加一个换行符之类的)
在串口接受到下位机发出的一大串数据后,每行只显示自定义个Hex数据;
用的是CportLib控件,接受用的ComPort1.ReadStr(Str, Count);
但是有个问题假如串口一次发送5000个数据,并不是一次就是把5000个数据送到Str中,
而是随机分成N次,好像没有规律。。
用Lines.Add(Str);会发现5000个数据会被随机分成参差不齐的N行;
用Memo.Text + Str会是一整段。
想问各位,如何自定义行显示个数换行?

ysoni 发表于 2014-2-17 11:00:11

自己判断当前行的字符数, 到达需要换行时尾部+#13

motoedy 发表于 2014-2-17 11:15:28

ysoni 发表于 2014-2-17 11:00
自己判断当前行的字符数, 到达需要换行时尾部+#13

可以给个例子么?
总感觉不好弄。。
比如5000个字符
被分成了10次
第1次str得到103个字符
第2次str得到354个字符
第3次str得到1235个字符
第4次str得到88个字符
第5次str得到631个字符
第6次str得到555个字符
第7次str得到238个字符
第8次str得到1039个字符
第9次str得到257个字符
第10次str得到976个字符

在不用全局变量的情况下,
让这5000个字符按每行5个字符分成1000行?

motoedy 发表于 2014-2-17 13:34:42

没人指导么?呼叫村长,大波妹{:lol:}

ysoni 发表于 2014-2-17 14:51:00

你可以用一个数组存储接收到的数据,这样你输出了多少字符就可以计算的。
使用一个全局变量更简便, 至少比再开发一个VCL省时多了。

Length(mmo1.Lines.Strings)最后一行文本的字符长度。

motoedy 发表于 2014-2-17 16:37:30

ysoni 发表于 2014-2-17 14:51
你可以用一个数组存储接收到的数据,这样你输出了多少字符就可以计算的。
使用一个全局变量更简便, 至少 ...

能给个完整的例子么?

locky_z 发表于 2014-2-17 20:42:37

你的是只读不可编辑的数据吧,你可以用VCL里面的ListBox来显示这些数据,人工填充ListBox

motoedy 发表于 2014-2-18 07:48:07

locky_z 发表于 2014-2-17 20:42
你的是只读不可编辑的数据吧,你可以用VCL里面的ListBox来显示这些数据,人工填充ListBox ...

能给个例子?

smset 发表于 2014-2-18 08:11:57

本帖最后由 smset 于 2014-2-18 08:20 编辑

设定一个全局字符串变量,比如G_Buf; 串口数据事件里面把收到的数据累加到G_Buf:    G_Buf:=G_Buf+RecvStr;
随即,进行G_Buf的处理:

var G_Buf:string;


ifform1.Memo1.Lines.Count>0 then
begin
if length(form1.Memo1.Lines)<>LINELEN thenform1.Memo1.Lines.Delete(form1.Memo1.Lines.Count-1);//清除最后的非整行。
end;

whilelength(G_Buf)>=LINELEN   do
begin
    form1.Memo1.Lines.Add(copy(G_Buf,1,LINELEN));//将一个整行长度的字符加入Memo1
    G_Buf:=copy(G_Buf,LINELEN+1,length(G_BUF)-LINELEN);//截取后面的内容,保存到G_Buf中,继续处理。
end;
if G_Buf<>'' thenform1.Memo1.Lines.Add(G_Buf);//将最后剩余的不够整行的数据加入到最后。

smset 发表于 2014-2-18 08:27:31

还有一个最简单的办法,就是你把memo1的font字体设置为等宽字体,比如宋体,这种字体下,任何字符的宽度都是相同的。

你通过控制memo1本身的宽度,就可以间接控制每行显示的字符个数了,而且每行的字符个数肯定是相同的。

motoedy 发表于 2014-2-18 10:49:25

smset 发表于 2014-2-18 08:11
设定一个全局字符串变量,比如G_Buf; 串口数据事件里面把收到的数据累加到G_Buf:    G_Buf:=G_Buf+RecvStr ...

谢谢,确实可选,但是遇到了个问题
用Cportlib控件,如果在接收个数未知的情况下,如何判断接收已经完成?


页: [1]
查看完整版本: delphi串口接受数据在Memo如何实现每行显示字符个数自定义?