搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 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行?

出0入0汤圆

 楼主| 发表于 2014-2-17 13:34:42 | 显示全部楼层
没人指导么?呼叫村长,大波妹

出0入0汤圆

发表于 2014-2-17 14:51:00 | 显示全部楼层
你可以用一个数组存储接收到的数据,这样你输出了多少字符就可以计算的。
使用一个全局变量更简便, 至少比再开发一个VCL省时多了。

Length(mmo1.Lines.Strings[mmo1.Lines.Count - 1])最后一行文本的字符长度。

出0入0汤圆

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

能给个完整的例子么?

出0入0汤圆

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

出0入0汤圆

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

能给个例子?

出0入0汤圆

发表于 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;


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

while  length(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<>'' then  form1.Memo1.Lines.Add(G_Buf);  //将最后剩余的不够整行的数据加入到最后。

出0入0汤圆

发表于 2014-2-18 08:27:31 | 显示全部楼层
还有一个最简单的办法,就是你把memo1的font字体设置为等宽字体,比如宋体,这种字体下,任何字符的宽度都是相同的。

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

出0入0汤圆

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

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


回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 14:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表