毕业设计题目上网计费,请大家帮忙(100分)

  • 主题发起人 主题发起人 dutuike
  • 开始时间 开始时间
D

dutuike

Unregistered / Unconfirmed
GUEST, unregistred user!
我是一名即将毕业的大学生。通信工程专业,但因为某些原因,我的
毕业设计题目选到了《用DELPHI编写个人上网计费软件》。众所周知,隔行如隔山,现在
我就遇到了一个设计上的瓶颈。现在我非常地希望能得到帮助,希望大家能教教我。
我现在的问题是如何实现网络状态的实时监控,我在网上找到的资料是用
InternetGetConnectedState函数。
以下是程序段:
Function ConnectionKind :boolean;
var
flags: dword;
begin
Result := InternetGetConnectedState(@flags, 0);
if Result then
begin
if (flags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM then
begin
showmessage('Modem');
end;
if (flags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN then
begin
showmessage('LAN');
end;
if (flags and INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY then
begin
showmessage('Proxy');
end;
if (flags and INTERNET_CONNECTION_MODEM_BUSY)=INTERNET_CONNECTION_MODEM_BUSY then
begin
showmessage('Modem Busy');
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ConnectionKind;
end;



这个程序段如果是完全照搬的话是行得通的,但如果要实现计费就要添加记时器控件,我添加了两个,
一个用来定时执行以上函数,判断状态,另一个用来记时。当判断是用modem上网则开始记时,即将
showmessage('Modem') 改为Timer1.Enabled:=true;记时开始。
理论上似乎是正确的,但编译执行后在执行到Timer1.Enabled:=true;这里就出错了,系统资源很快
耗尽,只有重启了。
请大家能在百忙之中抽空帮帮我,能否把您实现网络监控并如何记时的方法教教我,我将不胜感激!!!
因离交设计结果还剩十天了,非常希望能得到您的回复,再次感谢!

礼!
 
这里代码我运行过,没出现你说的情况,可能问题不在这儿
 
为什么要使用两个Timer?用一个Timer就已经足够了啊
每隔一秒就判断一次是否在线
我正好用DELPHI编写过个人上网计费软件,完全没问题的
 
两个TIMER是因为一个用来定时扫描监控网络状态,另一个是用来记时的。
左兄能否把你的源程序MAIL一份给我参考一下呢?谢谢!
 
抱歉,我的程序因为去向未明,暂时不能给你源码
在一个Timer中完全可以实现记时和监控网络状态啊,为什么要专门用一个Timer来计时呢?
例如可以用一个starttime全局变量来记录上网开始的时候,以后每次需要取得在线时间
的时候,用now-starttime即可得到
 
我现在先做成手工控制了,但循环判断网络状态并进行处理的方法还是不会,请高手们指点。
比如说我想在第一次判断到上网后弹出一个message提示已经在网上,然后手工点击
开始计费,而断网后同样有提示停止计费。其中因需要循环地判断状态,就不能每次都弹出
提示吧。请问应如何避免这种情况的出现呢?谢谢!
 
毕业论文都想在此混,学delphi干骂,以后的路远着呢。。。。。
 
>循环地判断状态
用一个全局Boolean变量OldNetStatus表示过去的状态,True为在网上,False为已断网。初始化为False。
在OnTimer事件里判断网络当前的状态,一旦发现当前状态与过去状态不同,则谈出相应对话框,同时更新
OldNetStatus为当前网络状态。大体代码如下:

var
OldNetStatus:Boolean=false;
NetTimeCount:Integer=0;
procedure TForm1.Timer1Timer(Sender: TObject);
var
CurrentNetStatus:Boolean;
begin
CurrentNetStatus:=GetNetState; //获得当前网络状态 GetNetState是我随便写的
if OldNetStatus<>CurrentNetStatus then
begin
if CurrentNetStatus then
ShowMessage('开始记费')
else
ShowMessage('停止记费');
OldNetStatus:=CurrentNetStatus;
end;
if CurrentNetStatus then //如果在网上...
Inc(NetTimeCount);
end;

OK?
 
大致思路如下:
全局变量:
var
starttime:Tdatetime; //上线时间
onlinetime:Tdatetime; //在线时长
isOnline:boolean; //是否在线

在timer事件中:
var
isonlinenow:boolean;
begin
isonlinenow := Getnetstatus; //取得当前网络状态
if isonlinenow = false then //不在线
begin
if isonline <> isonlinenow then //刚刚下线
begin
showmessage('断线了!');
end
end
else //在线
begin
if isonline <> isonlinenow then //刚刚连上线
begin
starttime := now; //初始化上线时间
showmessage('上线了!');
end
else
begin
onlinetime := now - starttime; //得到在线时长
end;
end;
isOnline := isonlinenow;

end;

匆匆写就,可能会有BUG,但思路就是这样。如果有问题请继续讨论。
 
感谢各位的帮助和解答,我马上测试。


to samboy111:三人行必有我师,在遇到困难时向别人请教我想那是很正常的事吧。
再说这本来就不是我的专业啊,隔行如隔山,我想你也知道这个道理吧。
 
经测试,左兄和creation-zy兄的方案均可实现,感谢两位的大力帮助,送上分数,
虽然有些少了,但总是我的一点心意,望别见怪,再次感谢!
 
多人接受答案了。
 
后退
顶部