1窗体创建的时候,窗体上的控件是什么时候建的啊?
2控件算不算窗体啊,要是算的话,他也应该注册窗体类并且创建的啊,这又是怎么完成的

解决方案 »

  1.   

    1、窗体上的控件是在窗体的Create阶段创建的。
    2、type
      TForm1 = class(TForm)
        Button1: TButton;     //控件是窗体类TForm1的成员。
        Panel1: TPanel;
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      

  2.   

    是啊,是一个类定义啊,每个窗体对应的UNIT都基本是这样的啊...是Delphi自动生成的啊我没有回答你的第二个问题吗?
      

  3.   

    建议看李维的
    Inside VCL
      

  4.   

    类的构造方法,在Object Pascal里,一般都是Create()函数,这是共同祖先类TObject的构造方法。你定义的窗体类TForm1,如果想处理一些自己的事务,那可以重载它,很简单,双击窗体,就可以定Create代码了....至于主窗体的创建,在工程文件里,一般会有调用该窗体构造方法Create的语句
      

  5.   

    类似这样的问题,你细心看一下Delphi(O P)程序结构,再结合自己学过的OO知识,会恍然大悟,所以,这样的问题,是不容易回答的,因为实在不知提问者的基础程度。关键在自己领悟
      

  6.   

    实话告诉你,我现在手边就放着Inside VCL,tapplication.createform讲的是在怎么建form,但控件也算个窗口把,但找不到实现它们的代码
      

  7.   

    实话告诉你,我现在手边就放着Inside VCL
    ----------------------------------------
    是在跟我说吗,楼主?
      

  8.   

    呵呵~~等了15分钟不见您回答~不等了,希望不是在跟我说。再次祝你开心。Bye
      

  9.   

    lihuasoft(学习低调做人), 感谢这么热心跟贴,新年快乐!我想问的楼上回答了正是我的那个意思,但我以为象button也是窗口,所以创建button对象后要creatwindow(.....)
      

  10.   

    楼上的关于第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的原理还是一样的
      

  11.   

    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 只建了对象.不知楼上明白我的意思没
      

  12.   

    看来你对delphi比较了解,真正要了解窗体创建的机制,你最好看C,呵呵,看来你没明白我的意思呀 你可以先对C++的winmain函数做一个了解!
      

  13.   

    我觉得楼主过于在P语言中打转,应该像winxkm一样用C去了解你需要掌握的知识!
      

  14.   

    简单的说,所有的可视化控件都继承自TWinControl,所有的底层构造都由他掌管。
    而程序的生命开始是在Application.Run之后,通过各种继承/关联关系,就如核裂变一样,各种控件就诞生了,呵呵