当主窗体创建的时候,窗体上的控件是什么时候建的啊? 1窗体创建的时候,窗体上的控件是什么时候建的啊?2控件算不算窗体啊,要是算的话,他也应该注册窗体类并且创建的啊,这又是怎么完成的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、窗体上的控件是在窗体的Create阶段创建的。2、type TForm1 = class(TForm) Button1: TButton; //控件是窗体类TForm1的成员。 Panel1: TPanel; private { Private declarations } public { Public declarations } end; 是啊,是一个类定义啊,每个窗体对应的UNIT都基本是这样的啊...是Delphi自动生成的啊我没有回答你的第二个问题吗? 建议看李维的Inside VCL 类的构造方法,在Object Pascal里,一般都是Create()函数,这是共同祖先类TObject的构造方法。你定义的窗体类TForm1,如果想处理一些自己的事务,那可以重载它,很简单,双击窗体,就可以定Create代码了....至于主窗体的创建,在工程文件里,一般会有调用该窗体构造方法Create的语句 类似这样的问题,你细心看一下Delphi(O P)程序结构,再结合自己学过的OO知识,会恍然大悟,所以,这样的问题,是不容易回答的,因为实在不知提问者的基础程度。关键在自己领悟 实话告诉你,我现在手边就放着Inside VCL,tapplication.createform讲的是在怎么建form,但控件也算个窗口把,但找不到实现它们的代码 实话告诉你,我现在手边就放着Inside VCL----------------------------------------是在跟我说吗,楼主? 呵呵~~等了15分钟不见您回答~不等了,希望不是在跟我说。再次祝你开心。Bye lihuasoft(学习低调做人), 感谢这么热心跟贴,新年快乐!我想问的楼上回答了正是我的那个意思,但我以为象button也是窗口,所以创建button对象后要creatwindow(.....) 楼上的关于第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的原理还是一样的 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 只建了对象.不知楼上明白我的意思没 看来你对delphi比较了解,真正要了解窗体创建的机制,你最好看C,呵呵,看来你没明白我的意思呀 你可以先对C++的winmain函数做一个了解! 我觉得楼主过于在P语言中打转,应该像winxkm一样用C去了解你需要掌握的知识! 简单的说,所有的可视化控件都继承自TWinControl,所有的底层构造都由他掌管。而程序的生命开始是在Application.Run之后,通过各种继承/关联关系,就如核裂变一样,各种控件就诞生了,呵呵 请问删除数据库记录时,为什么不能返回影响的记录数 杀毒软件与可执行文件的问题,请高手指点! TDBCtrlGrid中放置TDBMemo显示数据只有将光标移到该记录时才能显示 这个问题怎么解决? 文件转移问题 痛苦!报表控件FastReport 怎么实现QQ式样的列表框? 为什么我的 Delphi6 要我注册,不注册就用不了!请各位帮助!!!!!! 讨论一下!怎么让DBGrid 或StringGrid有如下格式的头! 如何依次调用几个Edit的内容 TCHART问题,帮我一下 兄弟们! 我是新人 有段简单的数据保存按钮有问题 请高手指导 谢谢!!
2、type
TForm1 = class(TForm)
Button1: TButton; //控件是窗体类TForm1的成员。
Panel1: TPanel;
private
{ Private declarations }
public
{ Public declarations }
end;
Inside VCL
----------------------------------------
是在跟我说吗,楼主?
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的原理还是一样的
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 只建了对象.不知楼上明白我的意思没
而程序的生命开始是在Application.Run之后,通过各种继承/关联关系,就如核裂变一样,各种控件就诞生了,呵呵