问一个窗体自己调用过程,创建自己的问题。觉得奇怪,请高手解惑。 补充一下: procedure ShowModalSelf();只有定义在Public才可以,这又是为什么呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 procedure TForm1.Button1Click(Sender: TObject);begin form2:=Tform2.Create(application); Form2.ShowModal; Form2.free; //释放Form2所占资源 end;原因:你将Form2从project的左边移到了右边Form2不会在程序运行时自动创立,在调用Form2.ShowModal必需先建立它,它加入内存 是啊。shuixin13没理解我的意思哦。 我在CPU窗口里发现在Form2.ShowModalSelf;这句上面调用的汇编语句是:CALL TForm2.ShowModalSelf;不是我想象的Form2.ShowModalSelf;另外,ShowModalSelf过程实现的代码在Form2.ShowModalSelf的前面; 我想应该是这样既然在form1中user unit2.所以delphi编译器就把他当个单元,所以你在其中写任何函数当然可以调用了“Form2已经从project的坐边移到了右边了”这个只表明form2在工程文件中不自动创建而已窗体不创建但不表示单元不可以引用,如果用Form2.ShowModal因为窗体没有建立所出错,而Form2.ShowModalSelf方法中有窗体建立的代码,所以运行正常“按道理在实列没创建时,应该不能调用他的方法的啊”单元是不需要建立的吧,否者全局模块不是必须有个窗体了 呵呵 补充一下“procedure ShowModalSelf();只有定义在Public才可以,这又是为什么呢?”如果定义为私有,form1就不能引用该函数了 我后来又想了想,我想可能是DELPHI程序运行时并不检查对象是否已经创建。当调用showmodal时,它直接就去访问它认为的这个类的地址,结果window认为程序访问了不该访问的地方,然后windows就报错了。(并不是delphi程序产生的异常)说程序访问了无效地址。当调用showmodalself时,程序一路走来,恰好一直执行顺利,自然就没什么错误了。我还试过不创建实例就访问它的属性,也可以,并且得到一个随机值。我想就是这个原因了。关于效率,我根本不认为这样高明,还容易误导大家,^_^ 我通常都是写一个全局的单元引出函数,作用和这个一样。主要用来控制创建前的一些东西,并且利于单元的模块化,通过一个函数来访问整个单元,是我比较欣赏的做法。上面是我的个人意见,不足之处还请方家斧正! 有道理。是不是可以说,在对象实例没有被创建以前,也可以访问对象实例的一些方法了??感觉好象违反了OOP的原则哦。 呵呵,违反了哪个原则呢?oop并没有告诫我们不要去访问一个未创建的实例的方法啊?只是在开发指南上经常告诫我们不要去访问未创建的实例的方法,免的异常。不过,对于这个问题我还是很模糊,我想应该有不对的地方的。 我认为在form2中所有在public中声明的在form1中都可以调用,但是调用的过程或函数中不能有在form2创建前不能执行的代码,因为这样虽然执行代码,但是他却没有实例的,会出现访问错误。 对了,你过你调用form2的某个public中的过程和函数,失败了,哪在这个过程或函数中肯定访问了未创建的实例。方法吗应该无法调用,只有过程和函数才能在创建前调用 调试时MOV EAX, [$0044eee4]MOV EAX, [EAX] //此时EAX=0即为Form2的值,被传进ShowModalSelf也就是Self值CALL TForm2.ShowModalSelf可在TForm2.ShowModalSelf加上句 ShowMessage(IntToStr(Integer(Self)));显示零因为这里没有对Form2的成员作操作,可加一Buttonprocedure TForm2.ShowModalSelf();begin ShowMessage(IntToStr(Integer(Self))); Application.CreateForm(TForm2, Form2); Button1.Caption := 'gyb'; Form2.ShowModal ;end;则肯定会出错,正是没有对Form2的成员操作,才会正常运行其实这也就相当于procedure TForm2_ShowModalSelf(Self: TForm2);begin Application.CreateForm(TForm2, Form2); Form2.ShowModal ;end;Form2.ShowModalSelf 也就是TForm2_ShowModalSelf(Form2);我也觉得这种写法很是误导人 Form2是一个全局变量(Unit2中)Application.CreateForm(TForm2, Form2);Form2.ShowModal;//如上代码执行多次,就会相当于Form2 := TForm2.Create(Application);Form2 := TForm2.Create(Application);Form2 := TForm2.Create(Application);//.........//一种参考写法with TForm2.Create(Application) do try ShowModal;finally Free;end; showmodalsel是静态方法,静态方法可以,不创建对象,直接调用即,Classname.showmodalsel;用对象调用也可以ClassObject.showmodalsel同样静态成员也可这么调用,而非静态的方法是不可以得,必须先创建对象然后调用 zswang(伴水)(需要充充电) 你讲的跟这个帖子不相关啊 snowmiao2002(苗苗)启发了我,有道理。我这样想不知道对不。我以c++的规则去看,静态函数是编译时(也可以看作未有实例时)就确定了它的地址的,但这个类静态函数代码在内存中只有一份,在编译是便确定了他的内存地址。所以delphi 才可以直接去访问。 静态方法Classname.showmodalsel这样调用能通过码TForm2.ShowModalSelf;类方法才能这样调用 本人求职,强烈推荐自已 104规约问题 〓如何对TQUERY控件的SELECT结果再进行第二次查询 关于更改TEdit控件问题? DBedit中不能输入任何字符的问题? ismask属性怎么设置? 新手请教高手?用RAVE制作报表时,能不能把弹出的预览窗口加到主窗体中去,产生类似ChildForm和MDIForm的效果?? 200分求交叉显示和编辑界面控件....或源码.... 请问哪有比较好的报表控件下载呢? 有谁知道chm文件格式 InstallShield Developer(7.04)的Sn!!!! 不明白? delphi与access数据库有哪几种方式连接数据库?
begin
form2:=Tform2.Create(application);
Form2.ShowModal;
Form2.free; //释放Form2所占资源
end;原因:
你将Form2从project的左边移到了右边
Form2不会在程序运行时自动创立,
在调用Form2.ShowModal必需先建立它,它加入内存
CALL TForm2.ShowModalSelf;
不是我想象的Form2.ShowModalSelf;
另外,ShowModalSelf过程实现的代码在Form2.ShowModalSelf的前面;
既然在form1中user unit2.
所以delphi编译器就把他当个单元,所以你在其中写任何函数当然可以调用了“Form2已经从project的坐边移到了右边了”
这个只表明form2在工程文件中不自动创建而已
窗体不创建但不表示单元不可以引用,
如果用Form2.ShowModal因为窗体没有建立所出错,而Form2.ShowModalSelf方法中有窗体建立的代码,所以运行正常
“按道理在实列没创建时,应该不能调用他的方法的啊”
单元是不需要建立的吧,否者全局模块不是必须有个窗体了 呵呵
”
如果定义为私有,form1就不能引用该函数了
我后来又想了想,我想可能是DELPHI程序运行时并不检查对象是否已经创建。
当调用showmodal时,它直接就去访问它认为的这个类的地址,
结果window认为程序访问了不该访问的地方,然后windows就报错了。(并不是delphi程序产生的异常)说程序访问了无效地址。当调用showmodalself时,程序一路走来,恰好一直执行顺利,自然就没什么错误了。我还试过不创建实例就访问它的属性,也可以,并且得到一个随机值。我想
就是这个原因了。关于效率,我根本不认为这样高明,还容易误导大家,^_^
我通常都是写一个全局的单元引出函数,作用和这个一样。
主要用来控制创建前的一些东西,并且利于单元的模块化,
通过一个函数来访问整个单元,是我比较欣赏的做法。上面是我的个人意见,不足之处还请方家斧正!
也可以访问对象实例的一些方法了??
感觉好象违反了OOP的原则哦。
oop并没有告诫我们不要去访问一个未创建的实例的方法啊?
只是在开发指南上经常告诫我们不要去访问未创建的实例的方法,免的异常。不过,对于这个问题我还是很模糊,我想应该有不对的地方的。
MOV EAX, [EAX]
//此时EAX=0即为Form2的值,被传进ShowModalSelf也就是Self值
CALL TForm2.ShowModalSelf
可在TForm2.ShowModalSelf加上句
ShowMessage(IntToStr(Integer(Self)));
显示零
因为这里没有对Form2的成员作操作,可加一Button
procedure TForm2.ShowModalSelf();
begin
ShowMessage(IntToStr(Integer(Self)));
Application.CreateForm(TForm2, Form2);
Button1.Caption := 'gyb';
Form2.ShowModal ;
end;
则肯定会出错,正是没有对Form2的成员操作,才会正常运行其实这也就相当于
procedure TForm2_ShowModalSelf(Self: TForm2);
begin
Application.CreateForm(TForm2, Form2);
Form2.ShowModal ;
end;
Form2.ShowModalSelf
也就是
TForm2_ShowModalSelf(Form2);我也觉得这种写法很是误导人
Form2.ShowModal;
//如上代码执行多次,就会相当于
Form2 := TForm2.Create(Application);
Form2 := TForm2.Create(Application);
Form2 := TForm2.Create(Application);
//.........//一种参考写法
with TForm2.Create(Application) do try
ShowModal;
finally
Free;
end;
即,Classname.showmodalsel;用对象调用也可以ClassObject.showmodalsel
同样静态成员也可这么调用,
而非静态的方法是不可以得,必须先创建对象然后调用
Classname.showmodalsel
这样调用能通过码
TForm2.ShowModalSelf;类方法才能这样调用