如何在状态栏里用图标提示是否已经连上intenet?(50分)

  • 主题发起人 主题发起人 tempname
  • 开始时间 开始时间
T

tempname

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在状态栏里用图标提示是否已经连上了网络代码如下:
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var filename:string;
begin
filename:=extractFilePath(paramstr(0))+'image/';
if InternetCheckConnection('http://www.yahoo.com/', 1, 0) then
image1.Picture.LoadFromFile(filename+'isconnect2.bmp')
else
image1.Picture.LoadFromFile(filename+'isconnect1.bmp');
image1.Parent:=statusbar1;
image1.Left:=rect.left+5;
image1.top:=rect.top-4;
image1.width:=panel.width;
image1.height:=rect.bottom-rect.top;
end;
我把状态栏分成panels,只有其中一个style属性设为:psOwnerDraw
为什么运行的时候这段代码会不停在运行呢?请多指教
 
“会不停在运行”是什么意思?
你把InternetCheckConnection放在StatusBar1DrawPanel事件中,只要发生重画就
会触发的。比如说窗体的大小发生了改变就会触发该事件。
 
就好像是进入了死循环一样,图像会不停的闪烁。要是你按着一个按钮不放的话(最大化、最小化,还原)
就会恢复正常,放开的话,就又闪烁了。
 
你需要在什么时候检测InternetCheckConnection呢?
最好不要把
filename:=extractFilePath(paramstr(0))+'image/';
if InternetCheckConnection('http://www.yahoo.com/', 1, 0) then
image1.Picture.LoadFromFile(filename+'isconnect2.bmp')
else
image1.Picture.LoadFromFile(filename+'isconnect1.bmp');
这一段放在StatusBar1DrawPanel事件中。
 
to:zw84611
那要怎么修改这段代码呢?
我是想在状态栏里能显示张图片啊。谢谢
 
想在状态栏里能显示张图片,
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var filename:string;
begin
image1.Parent:=statusbar1;
image1.Left:=rect.left+5;
image1.top:=rect.top-4;
image1.width:=panel.width;
image1.height:=rect.bottom-rect.top;
end;
就已经做到了。

如果你想实时监测,可以放一个Timer,在Ontimer事件中加入
filename:=extractFilePath(paramstr(0))+'image/';
if InternetCheckConnection('http://www.yahoo.com/', 1, 0) then
image1.Picture.LoadFromFile(filename+'isconnect2.bmp')
else
image1.Picture.LoadFromFile(filename+'isconnect1.bmp');

 
我想是这样,你原来的程序中:
image1.Picture.LoadFromFile会触发StatusBar1DrawPanel事件,
而StatusBar1DrawPanel事件又调用image1.Picture.LoadFromFile,
如此一来构成了一个死循环的递归,所以“会不停在运行”。
所以不能把那段代码放在StatusBar1DrawPanel事件中。

 
to:zw84611
能介绍一个StatusBar1DrawPanel事件吗?我看delphi很多控件都有类似的事件。
以前很少用到,没想到现在用一下就产生这样的后果:)。我来我是要仔细研究一下这个事件了。
 
没什么的,就是一个重画事件。看看帮助吧。:)
 
1. 图片不要从磁盘中加载
2. 不行试一下别的状态栏控件
 
另外,你不要每次都Picture.LoadFromFile,你可以用一个BOOL变量记录上次检测时
的连接情况,下次再检测时若状态改变再Picture.LoadFromFile,否则不要LoadFormFile。
 
你可以在连接时再指定Tbitmap,然后调用 bar 的重绘过程
 
1、不应该实时从文件读图片,太费资源,应该用TImagelist实现图片切换;
2、这段代码不应该放在OnDrawPanel事件里面,因为这个事件只有在屏幕刷新的
时候才发生,而你的internet连接可不一定什么时候就断了,所以应该用Timer监测

完整代码如下:

添加一个imagelist控件,里面放上表示不同状态的图标

var iconindex:integer; //定义一个全局变量

procedure TForm1.Timer1Timer(Sender: TObject);
var tmp:integer;
begin
if InternetCheckConnection('http://www.yahoo.com/', 1, 0) then
tmp:=0
else
tmp:=1;
//发现网络连接发生变化,就强制statusbar刷新
if tmp<>iconindex then
begin
iconindex:=tmp;
StatusBar1.Repaint;
end;
end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
imagelist1.Draw(StatusBar1.Canvas,rect.left,rect.top,iconindex);
end;
 
后退
顶部