当主窗体创建的时候,窗体上的控件是什么时候建的啊?

1窗体创建的时候,窗体上的控件是什么时候建的啊?
2控件算不算窗体啊,要是算的话,他也应该注册窗体类并且创建的啊,这又是怎么完成的
[71 byte] By [zhuyif] at [2008-1-9]
# 1
1、窗体上的控件是在窗体的Create阶段创建的。
2、

type
TForm1 = class(TForm)
Button1: TButton; //控件是窗体类TForm1的成员。
Panel1: TPanel;
private
{ Private declarations }
public
{ Public declarations }
end;
lihuasoft-坐井观天 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 2
如果是上面那段代码的话,他好象只做了个定义。那我先请你回答第二个问题
zhuyif at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 3
是啊,是一个类定义啊,每个窗体对应的UNIT都基本是这样的啊...是Delphi自动生成的啊。。。

我没有回答你的第二个问题吗?
lihuasoft-坐井观天 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 4
建议看李维的
Inside VCL
zhmnsw-糖醋鼻子 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 5
类的构造方法,在Object Pascal里,一般都是Create()函数,这是共同祖先类TObject的构造方法。你定义的窗体类TForm1,如果想处理一些自己的事务,那可以重载它,很简单,双击窗体,就可以定Create代码了...

至于主窗体的创建,在工程文件里,一般会有调用该窗体构造方法Create的语句
lihuasoft-坐井观天 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 6
类似这样的问题,你细心看一下Delphi(O P)程序结构,再结合自己学过的OO知识,会恍然大悟,所以,这样的问题,是不容易回答的,因为实在不知提问者的基础程度。关键在自己领悟
lihuasoft-坐井观天 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 7
祝楼主新年快乐。88
lihuasoft-坐井观天 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 8
实话告诉你,我现在手边就放着Inside VCL,tapplication.createform讲的是在怎么建form,但控件也算个窗口把,但找不到实现它们的代码
zhuyif at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 9
实话告诉你,我现在手边就放着Inside VCL
----------------------------------------
是在跟我说吗,楼主?
lihuasoft-坐井观天 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 10
呵呵~~等了15分钟不见您回答~不等了,希望不是在跟我说。再次祝你开心。Bye
lihuasoft-坐井观天 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 11
1.在窗口类创建的时候创建的。
2.控件是对象,并不是显示容器。
CreateDreams at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 12
lihuasoft(学习低调做人), 感谢这么热心跟贴,新年快乐!我想问的楼上回答了正是我的那个意思,但我以为象button也是窗口,所以创建button对象后要creatwindow(....)
zhuyif at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 13
楼上的关于第2个问题的回答是错误的
1,窗口创建:function CreateWindow(lpClassName: PChar; lpWindowName: PChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
var
FPUCW: Word;
begin
FPUCW := Get8087CW;
Result := _CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
Set8087CW(FPUCW);
end;
function CreateWindowA(lpClassName: PAnsiChar; lpWindowName: PAnsiChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
var
FPUCW: Word;
begin
FPUCW := Get8087CW;
Result := _CreateWindowExA(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
Set8087CW(FPUCW);
end;
function CreateWindowW(lpClassName: PWideChar; lpWindowName: PWideChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
var
FPUCW: Word;
begin
FPUCW := Get8087CW;
Result := _CreateWindowExW(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
Set8087CW(FPUCW);
end;
这些都是调用了系统的API函数来完成的,而窗口的控件则由Tcomponent类一层一层inherited Create(AOwner)下来的,直到完成指定的生成样板,
2、控件Tcontrol其实都是容器,类似于Form! 任何具有handle的控件其都能用来加载其它组件,只要将parent指定,这个结构类似于数据结构里数据链, 不过这里是对象链,对象包含了其指定的父类对象,将其断开父类对象的挂钩,挂靠到你指定的control中是完全可以的,回归C语言,form和control的原理还是一样的
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 14
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self);
except
TComponent(Reference) := nil;
raise;
end;
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;

这里面TForm(Instance).HandleNeeded;这一句才完成窗口类的注册和主窗体的创建而
Instance.Create(Self);只完成窗口对象的建立,并无窗口类的注册和主窗体的创建。那依楼上说的:“窗口的控件则由Tcomponent类一层一层inherited Create(AOwner)下来的”,create 只建了对象.不知楼上明白我的意思没
zhuyif at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 15
看来你对delphi比较了解,真正要了解窗体创建的机制,你最好看C,呵呵,看来你没明白我的意思呀 你可以先对C++的winmain函数做一个了解!
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 16
我觉得楼主过于在P语言中打转,应该像winxkm一样用C去了解你需要掌握的知识!
rocxu007 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 17
我再看看,不懂再问,先结了
zhuyif at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 18
简单的说,所有的可视化控件都继承自TWinControl,所有的底层构造都由他掌管。
而程序的生命开始是在Application.Run之后,通过各种继承/关联关系,就如核裂变一样,各种控件就诞生了,呵呵
zhmnsw-糖醋鼻子 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...