关于TIMER的OnTimer事件的问题(100分)

  • 主题发起人 主题发起人 jobsxy
  • 开始时间 开始时间
J

jobsxy

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序因某种原因不能直接用TIMER的
Procedure OnTimer(Sender:TObject)
我需要让TIMER的OnTimer事件指向我自己定义的过程。
Procedure GetMyInfo;
begin
//自定义过程
end;

Procedure TForm1.FormCreate(Sender:TObject);
begin
Timer1Timer.OnTimer := GetMyInfo //我自定义的过程名;
//我应该怎样赋值了?
end;
 
procedure GetMyInfo(Sender: TObject);
begin
....
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1Timer.OnTimer := GetMyInfo; // it's enough
end;
 
好快呀,实际上,关键是参数一致。
实际上只是指针复制而已
 
按你写的那样就可以了。
 
与Timer的事件ontimer必须一致
 
另一只眼就是手快啊! 看来我得练习一下打字了!呵呵!
 
eyes眼多,自然看得快:-)
 
提醒你注意:
OnTimer事件指针是Delphi的标准方法指针,定义为TNotifyEvent;
向此方法指针加载某过程时不须写参数,但定义该过程时必须写参数。
 
SORRY,诸位,可能是我的问题太含糊。我们单位一邦小子闲着没事就喜欢到我
机器上玩游戏,我又不好意思拒绝,只好想别的招了。我搞的这个东东很简单
就是WIN启动后挂上,然后时不时冒出个警告框,吓吓这群傻小子,程序是这样
写的,但编译时出现类型不匹,求各路大侠相助!!
(另能否教我怎样把CDROM屏蔽掉,但不能把数据线扒了)

program af;

uses extctrls, Dialogs;

{$R *.RES}
var
timer1:TTimer;
procedure mygetinfo(sender:TObject);
begin
Timer1.Enabled := False;
ShowMessage('产生致命错误!');//+IntToStr(i));
Timer1.Enabled := True;
end;

begin
Timer1 := TTimer.Create(Nil);
with Timer1 do begin
Interval := 60000;
OnTimer := Mygetinfo;
end;
end.
 
呵呵, 如果是这样, 为什么不去www.pchome.net下载一个恶作剧的程序呢, 可以不时
弹出个对话框, 告诉你这里出错那里出错:-) 好象zdnet上也有.

下面的程序没问题, 你参照改改就行.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure aaa(sender:tobject);
public
{ Public declarations }
end;

var
Form1: TForm1;
timer1:ttimer;

implementation

{$R *.DFM}
procedure tform1.aaa(sender:tobject);
begin
timer1.Enabled:=false;
showmessage('good');
timer1.enabled:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
timer1:=ttimer.Create(nil);
timer1.Interval:=1000;
timer1.OnTimer:=aaa;
timer1.Enabled:=true;

end;

end.
 
cytown: 我原来也是象您的思路,但我不想出现FORM,让它静悄悄地在后台发作,
我觉得这是个炼手脚的机会,吓走它群家伙,然后想法骗领导给俺配台P3。所以
还要麻烦您老再指点指点
 
我把你的程序改动如下,没有了编译错误。可运行后立刻就结束了。

PROGRAM timer;
uses
extctrls, Dialogs;

{$R *.RES}
type
TTimer1 = class(TTimer)

private
procedure mygetinfo(sender:TObject);
public

end;

var
timer1:TTimer1;

procedure TTimer1.mygetinfo(sender:TObject);
begin
Timer1.Enabled := False;
ShowMessage('产生致命错误!');//+IntToStr(i));
Timer1.Enabled := True;
end;

begin
{ 这里应该:
CreateWindowEx(...
UpdateWindow(...
}
Timer1 := TTimer1.Create(Nil);
with Timer1 do begin
Interval := 2000;
OnTimer := Mygetinfo;
end;
end.

如果你只是不想出现FORM,大可不必如上。只要在Form得Onshow事件后(不能
在OnCreate,Onshow里)执行语句:
form1.visible:=false;

例如,你可以在Form1中直接使用Timer控件,在第一次Timer事件时执行
form1.visible:=false;
以后每次则:ShowMessage('产生致命错误!');
第一次的Interval值可设为1,以后改为较大值。
 
呵呵, 你要不想formshow的方法很多, 最简单用visible:=false或form1.hide,
不过要考虑到退出程序呀:-)
不然一启动就只有用alt-ctrl-del去关闭它了:-)
 
补充: application.showmainform:=false;
 
program Project1;

uses
forms, extctrls, dialogs;

{$R *.RES}

type
TMyTimer = class(TTimer)
public
procedure aaa(sender: Tobject);
end;

var
tm: TMyTimer;

procedure TMyTimer.aaa(sender: TObject);
begin
tm.Enabled := false;
showmessage('ok');
tm.Enabled := true;
end;

begin
Application.Initialize;
tm := tmytimer.create(application);
tm.Interval := 1000;
tm.OnTimer := tm.aaa;
while true do
application.ProcessMessages;
end.
 
多人接受答案了。
 
后退
顶部