如何在运行时动态改变一窗体类的OnCreate事件。当然,该窗体类还无实例的。(100分)

  • 主题发起人 主题发起人 djdsz
  • 开始时间 开始时间
在这个窗体的文件设置一个全局变量,
在OnCreate中根据这个变量值来决定
怎么Create。
 
...
procedure myOncreate(Sender:TObject); //declare
...
procedure myOncreate(Sender:TObject);
begin
...
end;

//in project file source:

yourform.oncreate := myOncreate;

//must so much uses
 
procedure myOncreate(Sender:TObject); //declare
应该是
procedure myOncreate(Sender:TObject) of object;
CJ这个方法比较正规,呵呵。
 
OF OBJECT要写的吗?俺记得自己从来不写的啊?呵呵……
 
也许第一种方法还有一点可行性,但我先试试。

第二种方法应该会造成内存非法访问的,因为yourform是不存在的(还没创建),访问其属性或事件是非法的。

我以前想通过RTTI机制实现,但在中途我进行不下去了,大致要解决的问题是:

type
TMyFormObj=Class of TMyForm;
var
myFormObj:TMyFormObj;

myFormObj:=TMyFormObj(FindClass(FormClassName));
myFormObj.OnCreate:=MyNewOnCreate; //关键在这里该如何实现
MyFormObjInstance:=myFormObj.Create(Owner);

注意,窗口类只有类型信息,没有创建实例,需要在类型信息中改变其OnCreate.请各位大虾帮忙了。

如果觉得银子不够,我将全部家当奉献了。(再加160)
 
呵呵,Sorry,的确,是OnCreate,好厉害!
难道要:
TYourForm.OnCreate := MyOnCreate???//好像有问题的说;

不过,我觉得,你直接写在那个Form的OnCreate事件里应该可以搞定:
procedure TForm1.OnCreate...
begin
if x then
OnCreate1(Sender)
else if y then
OnCreate2(Self);
end;
这里OnCreate1/2都是事先定义好的函数、过程。我觉得应该可以满族你的要求;
 
faint!
犯了一样的错误,哈哈,还没有Create就想赋值。
动态改变整个类的OnCreate,有难度哦。
设置全局变量,应该是没有什么问题的。
 
为两位各加50分吧^-^
我的本意是要通过RTTI去改变未有实例类的属性的。
我现在的做法如下:
3个Form(Form1,Form2,Form3.其中Form3由Form2继承)
//Form2中(Unit2)
var
Form2:TForm2;
f:TNotifyEvent;

procedure TForm2.FormCreate(Sender:TObject);
begin
if assigned(f) then
f(sender);
...
end;

//Form1(Unit1)

procedure TForm1.Button1Click(Sender:TObject);
begin
Unit2.f:=MyOnCreate;//MyOnCreate是在Form1中定义的TNotifyEvent
Form3:=TForm3.Create(Self);
Form3.show;
end;

这样,TForm2的OnCreate事件被改变了。不过,请两位大虾想一想该如何用RTTI解决。谢谢。
shizhong-deng@21cn.com
 
后退
顶部