在vcl中,而不是用windows sdk创建的窗体。

解决方案 »

  1.   

    在VCL里窗体刚刚创Create的时候(还没有其他操作)不拥有窗口句柄,你可以通过这个来判断窗体是否第一次创建,当你调用show或showmodal的时候,才创建句柄!
      

  2.   

    用ONCREATE 和ONSHOW事件中判断,oncreate中置首次创建标志
      

  3.   

    to  juliens(星星球)我的意思是在窗口第一次创建并显示完成时触发一个事件,注意是完成时,而不是完成前。
      

  4.   

    OnCreate-->OnShow-->OnPaint-->OnActivate-->OnResize-->OnPaint-->OnCloseQuery-->OnClose-->OnDeactivate-->OnHide-->OnDestroy 
    问题:我做了一个 MDI FORM,当MDI Form出现以後,如果判断出某些资料未设定,
    要再出现一个Form2.ShowModal设定资料的对话盒,应该写在那儿呢?我试过的
    OnActivate ,OnShow ,但MDI Form皆未出现就去执行这部份程式,就出现错误了。
        要解决这个问题, 首先要了解从 Form 产生的""个过程中, 各事件发生与执行的次序.如果是一般的 SDI Form, 各事件的发生次序如下:
    OnCreate
    OnShow
    在萤幕上看到这个视窗
    OnActivate
    OnPaint
    如果是 MDI 视窗, 而 MdiChild 的第一个子视窗是在程式启动时, 就出现在MdiForm中的话,
    那麽,各事件的次序是
    主视窗的 OnCreate
    子视窗的 OnCreate
    子视窗的 OnShow
    子视窗的 OnActivate
    主视窗的 OnShow
    在萤幕上看到主视窗及第一个子视窗
    主视窗的 OnPaint
    ok, 您发现了吗? OnShow 是在视窗被看到之前的事, 而 OnActivate 并没有发生,因此,您的问题中所采用的 '我试过的 OnActivate ,OnShow ....',
    当然不能在视窗於'被看到後'才出现设定资料的对话盒
    因此, 以您的状况, 检查与设定的程式可以写在主视窗的 OnPaint 中, 不过,OnPain是一个常发生的事件,所以应该要在主视窗的类别定义中额外加上一个 private 的逻辑成员资料变数,以控制不要每次视窗重画时都检查设定.
      

  5.   

    在OnPaint事件中写,这个我也想到过,这些事件的执行顺序我也清楚。只不过OnPaint事件是个极其频繁的事件,而我得的事件只是在第一次显示完窗体时执行,
    所以我觉得每次判断是不是第一次不划算,不知道还有没有其他方法。等等等
      

  6.   

    OnShow事件就是显示时触发的。你第一次收到这个事件就表示完成了。
      

  7.   

    //OnShow事件就是显示时触发的。你第一次收到这个事件就表示完成了。no,no,no......
    等高手......
      

  8.   

    在創建前用findcomponent啊,根據結果決定是Create還是Active。
      

  9.   

    错,句柄在窗体构造函数里并没有被创建,不信你可以看VCL源码!只有主窗体被创建时才创建句柄。
    我说过了,控件的句柄在创建完后第一次使用时才被创建,证据还是在VCL里。
      

  10.   

    //控件的句柄在创建完后第一次使用时才被创建我不明白你指的第一次使用是什么意思。我指的创建好窗体,就是最终执行了CreateWindowEx函数以后,否则能叫“创建好窗体”么?如果这时候他还不返回句柄,我会疯掉的。
      

  11.   

    我不太明白你想做什么,你可不可以把你的事件写到onShow中,然后在后面继续写你需要的东西!再请问:你是否使用了线程!?
      

  12.   

    //我不太明白你想做什么,你可不可以把你的事件写到onShow中,然后在后面继续写你需要的东西!不可以。