在无窗体的程序中,动态创建非可视控件的问题?急呀(100分)

  • 主题发起人 主题发起人 coolbee
  • 开始时间 开始时间
C

coolbee

Unregistered / Unconfirmed
GUEST, unregistred user!
例如:
程序功能:运行后定时发出声音(此应用程序无窗体)
应用Timer定时控件实现(关键是应用非可视控件)

请各位富翁指点 关键不是程序的功能
而是此中控件的用法和定义方法
 
关键如下:
1。在你的Project 的Uses段一定要加上你所需控件所在Unit

2。写一个过程用来Create所需要的控件,控件的AOwner写Application或Nil,
如果哪个控件有事件需要处理,则写相应类型的事件处理过程然后
Componentname.OnEventName = 相应类型的事件处理过程;

3。写一个过程用来Free所需要的控件

不明白的在问吧!
 
可视和非可视都一样是一个类,动态创建一个类都一样。
 
TO:Jedei

您说的方法我也试过,但总有一些错误
比如:Create也可以,但是给他的属性付值时又出现地址访问错误!

能否写一个小例子实现一下 Email:zhanglei@coresoft.com.cn
 
Jedei说的一点都没有错!
 
为什么我在赋事件时会出现:
incompatible types:method point and regular procedure
的错误。
TImage也在单元文件中动态建立,不加事件一切正常,加了个ONMouseDown就出现以上错误。
以前在有窗体的程序中都没出现过。
实现应该同Jedei说的一样,还有哪边不对,谁能提个醒呢。
事件的定义过程有什么要求吗?
 
你写的动态时间前面有没有加 TYourClass.
TYourClass是你的类名.
 
BlueRain:
我的过程都放在 With 类名 do begin 中,难道这类名前要加个 T 吗?,
哪位能再说得详细点。
 
不是,我不是这个意思。
我的意思是你提到了你动态赋事件,
赋给这个事件,例如onmousedown = somefunction这句中
somefunction的是不是定义为类的成员。
因为你的错误信息好象和此有关
incompatible types:method point and regular procedure
 
是不是事件的参数和你自己定义函数的参数不一样啊!
我一直在用动态付事件处理过程很好的!
 
To SuperJS:
参数应该一样,如果把过程放入有窗体的主程序中,在单元过程中定义的
OnmouseDown:=FrmXXX.过程名 这样就不会出这错。如果放在本单元中,没有
Frmxxx. 就会出这错。
To BlueRain:
不知在动态生成的控件中,该Somefunction怎样定义为该控件的成员函数。
那位回答后请到以下帖子拿分,
http://www.delphibbs.com/delphibbs/dispq.asp?lid=613448 (50分)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=600324 (200分)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=593908 (200分)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=689552 (100分)
其实上面一堆问题差不多有点重复,现在这问题借Coolbee的宝地一用。






 
TO jialiang:
那需要另生成新类,新类中增加该函数,然后你从新类中得到新的对象实例
 
Yntw:
能贴个源码具本点吗?非常感谢。
 
您不能采用控件的形式,应该用class的概念就可以了。
比如TStringList或TListitem实际上不是控件,只是一个class。
 
还是用SETTIMER吧,多简单
 
以你的假设来实现:
Type
Procedure pTest(Sender:TObject);
Var
Timer1:TTimer;
实现处写上:
Procedure pTest(Sender:TObject);
Begin
执行代码;
End;
程序开始执行处写上:
Timer1:=TTimer.Create(Nil);//因为无窗体,所以Owner为Nil
Timer1.Interval:=1000;
Timer1.Enabled:=True;
Timer1.OnTimer:=PTest;
在程序退出处写上:
Timer1.Free;
Windows98+Delphi 5.0下通过,不过测试时为了方便,加了一个窗体来产生生成和释放Timer非可
视控件的事件。Timer控件放在一单独的UNIT中。
 
基类:TBase=class
新类:TNewBase=class(TBase)
private
function SomeFunction;//加入该函数的定义,使之成为新类的成员函数
end;

程序中引用:NewBase1.OnMouseDown := TNewBase.SomeFunction;
 
后退
顶部