我用自定义控件时用不了自定义过程,很急啊(100分)

  • 主题发起人 主题发起人 goodman
  • 开始时间 开始时间
G

goodman

Unregistered / Unconfirmed
GUEST, unregistred user!
我想写过通用的方法,用了个UNIT,里面全是自定义的过程和函数的,没有FORM,控件在里都
是自生成的,如unit transact;

interface
uses Messages, SysUtils, Variants,Classes,IdUDPBase, Dialogs,IdUDPServer, IdBaseComponent, IdComponent, IdTCPServer,
IdUDPClient, IdTCPConnection, IdTCPClient,IdStack,ExtCtrls;
procedure settimer;
procedure judgemethod;
procedure Gtcpclientcreate(Gtcpclient:tIdtcpclient;ghost:string;gport,cbuffersize,ctimeout:integer);
procedure Gtcpclientfree(Gtcpclient:tIdtcpclient);
procedure Gtcpclientsendstring(s,ghost:string;gport,cbuffersize,ctimeout:integer);//SEND DATA TO SERVER IN IDTTCPCLIENT PROTOCOL
implementation
procedure settimer;
var gtime:ttimer;
begin
gtime:=ttimer.Create(nil);
gtime.OnTimer:=judgemethod;
end;

procedure judgemethod;
begin
....
end;
结果不行,说什么'incompatible types:'method pointer and regular procedure '
哪位高手帮帮手啊,这个定时器是一定要用的,我在有FORM中定给过程时是没问题的
 
procedure judgemethod;定义为procedure judgemethod(Sender: TObject);再试试
 
老大,还是不行的,没办法的
 
uses ExtCtrls,Classes;

procedure settimer(event: TNotifyEvent);
var
gtime:ttimer;
begin
gtime:=ttimer.Create(nil);
gtime.OnTimer:=event;
end;

event是你调用时定义在其它有Form的unit中的过程。
 
老兄,看来你应该找本书看看Object Pascal关于OOP的知识,你定义的自定义过程是全局函数(过程),
是而象过程的东东,而事件句柄是必须指向成员函数(过程),请注意是成员函数不是全局函数(过程),
全局函数(过程)一般我们就叫函数或过程,但成员函数(过程)我们一般叫方法.成员函数和普通函数
之间一般是不能赋值的,况且你定义的过程和事件对应的类型的参数还不一样.
你可以这样改一改:

然后在应用程序主Form的OnCreate事件中
TmpClass:=TTmpClass.Create;来构造TTmpClass类的实例TmpClass.并在OnClose事件中释放TmpClass.

interface
uses Messages, SysUtils, Variants,Classes,IdUDPBase, Dialogs,IdUDPServer, IdBaseComponent, IdComponent, IdTCPServer,
IdUDPClient, IdTCPConnection, IdTCPClient,IdStack,ExtCtrls;
TTmpClass=Class
procedure judgemethod(Sender:TObject);
end;
procedure settimer;
procedure Gtcpclientcreate(Gtcpclient:tIdtcpclient;ghost:string;gport,cbuffersize,ctimeout:integer);
procedure Gtcpclientfree(Gtcpclient:tIdtcpclient);
procedure Gtcpclientsendstring(s,ghost:string;gport,cbuffersize,ctimeout:integer);//SEND DATA TO SERVER IN IDTTCPCLIENT PROTOCOL

Var TmpClass:TTmpClass;

implementation
procedure settimer;
var gtime:ttimer;
begin
gtime:=ttimer.Create(nil);
gtime.OnTimer:=judgemethod;
end;

procedure TTmpClass.judgemethod(Sender:TObject);
begin
....
end;

请注意:
然后在应用程序主Form的OnCreate事件中
TmpClass:=TTmpClass.Create;来构造TTmpClass类的实例TmpClass.并在OnClose事件中释放TmpClass.
 
惨.....
今天被留在公司,又没事情做...
又要等他们把事情做完.
 
先定义:
var xxx:procedure(sender:tobject)of object;
这可以是全局变量.
然后再定义一个过程.
procedure yyy;
begin
showmessage('ok');
end;
再然后:
@xxx:=@yyy;
Timer1.OnTimer:=xxx;
Timer1.Enabled :=true;
可以吧?:)
 
另外还要注意:
1.你的gtime是个局部变量,这样过程调用后就不存在了,应使用全局变量
2.通过Create(nil)生成的对象必须手工释放。
 
接受答案了.
 
后退
顶部