CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  VCL组件使用和开发

MDIChild窗体真的不能放在dll里吗?请高手执教

楼主voxforce(阿便)2003-02-01 21:52:07 在 C++ Builder / VCL组件使用和开发 提问

我不管啦!!高手一定要告诉我应该怎么办? 问题点数:0、回复次数:11Top

1 楼ilikeff8(迷茫)回复于 2003-02-01 22:03:07 得分 0

当然可以,不过你要重新指定application给mdi窗口,并且在DLLEntryPoint里要做下处理Top

2 楼ilikeff8(迷茫)回复于 2003-02-01 22:09:40 得分 0

TApplication   *App=NILL;  
  ...  
  void   ShowIt(TApplication   *LinkApp)  
  {  
      if   (!App)   //   只需连接一次  
      {  
          App=Application;  
          Application=Link;  
      }  
      MdiForm=new   TMdiForm(Application);  
      MdiForm->Show();  
  }  
  ...  
  int   WINAPI   DllEntryPoint(...)  
  {  
      if   ((reason==DLL_PROCESS_DETACH)&&(App))    
          Application=App;  
      return   1;  
  }  
   
  Top

3 楼voxforce(阿便)回复于 2003-02-01 22:14:58 得分 0

能不能具体点,我好苯阿Top

4 楼voxforce(阿便)回复于 2003-02-01 22:15:21 得分 0

谢Top

5 楼voxforce(阿便)回复于 2003-02-03 16:04:34 得分 0

照你这样做,没问题,就是关闭主窗口的后,出现异常。不知道为什么?Top

6 楼ilikeff8(迷茫)回复于 2003-02-03 16:09:50 得分 0

具体我也没怎么用过  
  你需要单步跟踪一下  
  可能reason的其他情况也要处理一下?,如果不是内存溢出,在close时捕获掉异常好了Top

7 楼Jim3(Jim)回复于 2003-02-05 10:41:03 得分 0

学习Top

8 楼Behard(我爱天安门)回复于 2003-02-08 15:07:47 得分 0

应该是关闭子窗体的问题  
  如果在关闭主窗体前关闭子窗体就可以的了  
   
  见:  
  http://expert.csdn.net/Expert/topic/1139/1139410.xml?temp=3.142947E-02Top

9 楼sczyq(我又...........)回复于 2003-03-19 13:31:12 得分 0

完全可以,终于搞通了。  
   
  原因是,放在   MDIForm   内的   MDIChild   窗口,最后窗口不能由自己关闭,应该由主程序来关闭,否则就出错。  
   
  因此,当   MDIChild   自己关闭(点“关闭”或其他自己的关闭控制)时,通过FormCloseQuery来给主程序发消息,让主程序来关闭自己。关闭后,通过FormDestroy通知主程序释放动态装入的DLL。  
   
  由主程序控制的关闭,则省略FormCloseQuery。Top

10 楼sczyq(我又...........)回复于 2003-03-19 13:33:24 得分 0

//     DLL  
  //---------------------------------------------------------------------------  
  #include   <vcl.h>  
  #include   <windows.h>  
  #pragma   hdrstop  
  //---------------------------------------------------------------------------  
   
  #include   "Unit3.h"  
  extern   "C"   __declspec(dllexport)   void   __stdcall   OpenDLLChild(TApplication   *ParentApplication,  
                                          TForm   *MainForm);  
  TApplication   *DllApplication   =   NULL;  
   
  #pragma   argsused  
  int   WINAPI   DllEntryPoint(HINSTANCE   hinst,   unsigned   long   reason,   void*   lpReserved)  
  {  
      if   (   reason==DLL_PROCESS_ATTACH   )                         //装载   DLL  
      {  
            DllApplication=Application;                               //保存DLL的   Application   对象  
      }  
      if   (   reason==DLL_PROCESS_DETACH   )                         //释放   DLL  
      {  
            Application=DllApplication;                               //恢复保存的Application   对象  
      }  
      return   1;  
  }  
  //---------------------------------------------------------------------------  
  void   _stdcall   OpenDLLChild(TApplication   *ParentApplication,  
                          TForm   *MainForm)  
  {  
      Application=ParentApplication;  
      TForm3   *Form3   =   new   TForm3(MainForm);  
      Form3->Parent   =   MainForm;  
      Form3->ParentWindows   =   MainForm;  
      Form3->Caption   =   MainForm->Caption;  
      Form3->Show();  
  }  
  //---------------------------------------------------------------------------  
   
  Top

11 楼sczyq(我又...........)回复于 2003-03-19 13:36:20 得分 0

//     Unit3.h     in   DLL   project  
  //     Form3->FormStyle   =   fsMDIChild  
  //---------------------------------------------------------------------------  
  #ifndef   Unit3H  
  #define   Unit3H  
  //---------------------------------------------------------------------------  
  #include   <Classes.hpp>  
  #include   <Controls.hpp>  
  #include   <StdCtrls.hpp>  
  #include   <Forms.hpp>  
  //---------------------------------------------------------------------------  
  class   TForm3   :   public   TForm  
  {  
  __published: //   IDE-managed   Components  
          TMemo   *Memo1;  
          void   __fastcall   FormClose(TObject   *Sender,   TCloseAction   &Action);  
          void   __fastcall   FormCloseQuery(TObject   *Sender,   bool   &CanClose);  
          void   __fastcall   FormDestroy(TObject   *Sender);  
  private: //   User   declarations  
  public: //   User   declarations  
          TWinControl   *ParentWindows;  
          __fastcall   TForm3(TComponent*   Owner);  
  };  
  //---------------------------------------------------------------------------  
  extern   PACKAGE   TForm3   *Form3;  
  //---------------------------------------------------------------------------  
  #endif  
   
  //===========================================================================  
  //     Unit3.cpp  
  //---------------------------------------------------------------------------  
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "Unit3.h"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TForm3   *Form3;  
  //---------------------------------------------------------------------------  
  __fastcall   TForm3::TForm3(TComponent*   Owner)  
          :   TForm(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm3::FormClose(TObject   *Sender,   TCloseAction   &Action)  
  {  
          ShowWindow(Handle,SW_HIDE);  
          if   (WindowState   ==   wsMinimized   ||   Caption.Length()==0)  
          {  
                  Parent=NULL;  
                  Action   =   caFree;  
          }  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm3::FormCloseQuery(TObject   *Sender,   bool   &CanClose)  
  {  
          if   (WindowState   !=   wsMinimized   &&   Caption.Length()>0)  
                  PostMessage(ParentWindows->Handle,WM_USER,0,10000+Tag);  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm3::FormDestroy(TObject   *Sender)  
  {  
          PostMessage(ParentWindows->Handle,WM_USER,10000+Tag,0);  
  }  
  //---------------------------------------------------------------------------  
  Top

相关问题

  • 如何使dll的窗体成为当前MDI窗体的MDIChild窗体
  • Dll 窗体 与 Action
  • 后台启动MdiChild窗体
  • dll中的窗体调用
  • dll子窗体问题
  • 问dll中显示窗体
  • 带窗体DLL的问题
  • 怎么把窗体编译成dll,怎么调用窗体dll?
  • 我通过DLL调用一个MDICHILD窗体怎么判断它是不是已经在运行.
  • mdichild的窗体可否showmodule另外一个窗体?

关键词

  • application
  • dll
  • 窗体
  • tform
  • mdichild
  • 主程序
  • 关闭
  • formclosequery
  • fastcall
  • dllapplication

得分解答快速导航

  • 帖主:voxforce

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo