VCL控件的创建问题
定义类TForm1, TForm1中有控件Button1.
那么在调TForm1.Create(self)创建Form1时,TForm1中的Button1是怎么创建的呢?
我只知道因TForm1从TForm继承来的,而TForm是从TCustomForm继承来的,实际调用的是TCustomForm.Create, 而TCustomForm.Create主要是调用 TCustomForm.CreateNew, 看完之后(没有怎么看懂),还是不知道Button1是在什么位置创建的,请教各位了,谢谢.
type
TForm1 = class(TForm)
Button1: TButton;
...
end;
Var
Form1: TForm1;
implementation
...
Form1 := TForm1.Create(self);
...
问题点数:50、回复次数:9Top
1 楼xhuagen(蜗牛爬坡)回复于 2005-04-02 21:03:23 得分 0
那位帮帮忙啊,才学delphi,对它某些机制不是很清楚.谢谢了!Top
2 楼alexanda2000(书生活)回复于 2005-04-02 22:04:28 得分 5
帮你顶Top
3 楼CareYouOnly(只在乎你)回复于 2005-04-03 01:43:22 得分 10
VCL内部做了工作,当你Create窗体时,窗体会将窗体上的组件Create(窗体里面有那些组件,Delphi将他们保存在“窗体所在的单元名.dfm”里,窗体被创建的时候它会自动读取这个文件然后创建窗体上的组件),不用你操心。Top
4 楼ehom(?!)回复于 2005-04-03 02:09:20 得分 15
重点看TReader和TWriter这两个class相关的代码
包括各级class对其实例的调用。Top
5 楼xhuagen(蜗牛爬坡)回复于 2005-04-03 08:58:41 得分 0
现谢谢楼上几位大哥指点.
我还有一点不明白,代码如下,我第一次按button1时,会创建并显示Form2,但是再按Button1时,程序就没有反应了. Form2.Free后Form2不是重新变为nil了吗? 疑惑啊! 谢谢各位了.
procedure TForm1.Button1Click(Sender: TObject);
begin
if Form2 = nil then
begin
Form2 := TForm2.Create(self);
Form2.ShowModal;
Form2.Free;
end
end;Top
6 楼e5022(helpid)回复于 2005-04-03 09:13:03 得分 5
Form2.ShowModal;
是显示模式化对话框,这样的对话框一旦出现,你不关闭它的话,程序其他部分就不会接到任何事件。显示这种模式的窗体常常是出于很高级别的错误,或者是不得不输入的数据。平时推荐不要用。
据个例子,平时大多数程序的文件打开和关闭对话框就是模式窗体。一旦打开就无法操作其他的东西了。另外,相对于模式,还有一种叫“非模式”就是很多平常的窗口了,一个非模式窗口的打开并不影响其他窗口接受事件。打开方式就是Form2.Show;
另外,你的程序中再执行了Form2.ShowModal;之后就进入了一种线程阻塞状态,程序就停在了Form2.ShowModal那句话上面了,直到对From2的操作结束位置。
平时编程的时候也可以理解,在同一段程序中,一个函数未执行完成时是不会直接执行下一条语句的。
Top
7 楼xhuagen(蜗牛爬坡)回复于 2005-04-03 09:20:20 得分 0
谢谢e5022(helpid) ( ),我的意思是,在Form2关闭后,我再点击Form1.Button1,但是程序没有响应,是不是Form2不是nil啊,那Form2是什么呢?Top
8 楼ehom(?!)回复于 2005-04-03 10:28:22 得分 10
Form2的值还是以前的值,Form2.Free只是释放对象,不改变Form2的值Top
9 楼CareYouOnly(只在乎你)回复于 2005-04-03 16:40:40 得分 5
Form2其实是一个指针,Form2.free后Form2这个指针依然指向原来那个Form2对象(尽管这个对象已经被释放了),最好在Form2.free之后执行Form2:=nil或者直接调用FreeAndNil(Form2)来释放Form2Top




