急!监控软件的取数据最大值问题!(70分)

  • 主题发起人 主题发起人 蚂蚁根
  • 开始时间 开始时间

蚂蚁根

Unregistered / Unconfirmed
GUEST, unregistred user!
用spcomm做一个电源监控程序,用一个timer定时发送上位机命令(‘Q1’+#13),用Comm1ReceiveData接受并分割数据,分别显示在edit里,现要求不仅要实时显示数据,还要得出显示这一段时间的最大最小值,分别存入在其他edit里,(最大最小值这里不太会写,请各位高手给出思路,最好是代码,谢谢)
部分代码如下:
全局变量:
var
Ts,Ts1: Tstringlist;
k : integer;
procedure TFrmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; //接受下位机数据
BufferLength: Word);
var
pStr:PChar;
s: string;
sp1: integer;
Ts,Ts1: Tstringlist;
step : integer;
begin
step := 0;
pStr:= Buffer;
s:= pstr;
if cbrevhex.Checked then
begin
memo1.text:=memo1.Text+StrToHexStr(pStr);

end else
begin

memo1.text := memo1.Text + pstr;

end;


if (k mod 2 = 0) then
begin
if (pos('(',s)<>0) then
begin
sp1 := pos('(',s);
s :=copy(s,sp1+1,length(s)-sp1);
ts := SplitString(s,' ');
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
edit1.text := ts[0]+'V';
edit4.text := ts[2]+'V';
edit7.text := ts[4]+'Hz';
edit13.text := COPY(ts[3],2,1)+'.'+copy(ts[3],3,1)+'%';
edit16.text := ts[6]+'C'+' '+Floattostr(9/5*StrToFloat(ts[6])+32)+'F';
end;
end


else
begin
if (pos('(',s)<>0) then
begin
sp1 := pos('(',s);
s :=copy(s,sp1+1,length(s)-sp1);
ts1 := SplitString(s,' ');
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
edit1.text := ts1[0]+'V';
edit4.text := ts1[2]+'V';
edit7.text := ts1[4]+'Hz';
edit13.text := COPY(ts1[3],2,1)+'.'+copy(ts1[3],3,1)+'%';
edit16.text := ts1[6]+'C'+' '+Floattostr(9/5*StrToFloat(ts1[6])+32)+'F';
end;
Timer2.Enabled := True;
end;
end;

procedure TFrmMain.compare1(st1, st2: Tstringlist);

begin
edit5.text := floattostr(max(strtofloat(st1[0]),strtofloat(st2[0])));
edit6.text := floattostr(min(strtofloat(st1[0]),strtofloat(st2[0])));
end;

procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
sendstring('Q1'+#13);
inc(k);
end;

procedure TFrmMain.Timer2Timer(Sender: TObject);
begin
compare1(ts,ts1);
//ShowMessage(TS[0]+'#'+TS[TS.Count-1]);
end;

问题1
这里想实现将接受数据按timer1的发送命令的奇偶次,分别存在两个TS,TS1:TSTRINGLIST里,然后进行比较,但后来发现行不通,只是每次2个进行比较,不能算是最大值
请各位高手指点一下如何作能得到历史最大值,(不用数据库)
问题2
按我上面的方法去做,编译通过,但运行时会出现错误:raised exception class estringlisterror with message 'list index out of bounds(0)'
我的Tstringlist为空,我不是设为全局变量ts,ts1了吗?为什么还是空呀?请高手教教我这个变量参数调用的问题,谢谢
 
如果得到的数据是string,可以用strcmp这个函数应该就可以了,好象也是可以直接用>,<进行比较的
 
谢谢andd_chen的支持,你是这两天第一个回帖的人,大家都帮帮我亚,踊跃回帖亚!
 
实时显示数据你会了吧??
假如说你显示的数据的值是 k,
之前定义两个全局的 minK,maxK;初值都为0吧(假设你的k是>0)
以后每次收到k值的时候和minK,maxK比较啊,如果k < minK ,那么minK := k;
如果k>maxK,那么 maxK := k;

//这不是最基本的判断思路吗?你不会??
 
刚才来如风说得让我想起了一种笨办法,就是去每次采集好的值edit1里的数字,在进行比较,这样好像太笨了,我的问题的重点是为什么全局变量ts,ts1:tstringlist;没有数据????不是应该在Comm1ReceiveData里接收了吗?请高手再次指教!!!
 
很简单的问题,咋会复杂呢,动动脑筋
 
多人接受答案了。
 
后退
顶部