问题是这样的:     1.  如何把MDI子窗体封装在DLL动态链接库文件中?     2.  如何启动这个封装在DLL动态链接库文件中的子窗体?     3.  启动起来的MDI子窗体对Tab按键能够响应。具体情况是这样的:
    
     在DLL中的子窗体上面有两个文本框(Edit),如果不封装在DLL,     而是直接集成在EXE中,能够根据Tab顺序响应Tab按键,     但是如果封装在DLL中,就不能够响应Tab按键。     现在最重要的就是解决DLL中封装的窗体响应Tab按键的问题。希望是这样解决问题的:     1.  不增加额外的代码。主要是指对每个控件设置一个跳转代码。     2.  利用新的技术或者设置一些什么。这段期间由于找工作原因,很可能玩两天结贴,但是相信我一定会结贴,您可以看我的结贴率。至于分数,考虑到这个问题的难度,特奉上100分供大家讨论。抱歉,在这里先感谢大家了!

解决方案 »

  1.   

    借问问题的机会,再问下这个问题吧,很简单:    WinExec这个函数再Delphi 7中用PChar引用字符串就可以使用了。    WinExec(PChar('Notepad'),SW_SHOW);    但是到了Delphi 2009中就不能用了,现在的问题就是:    在Delphi 2009中应该如何使用WinExec这个API函数?谢谢了!
      

  2.   

    借问问题的机会,再问下这个问题吧,很简单:     WinExec这个函数再Delphi 7中用PChar引用字符串就可以使用了。     WinExec(PChar('Notepad'),SW_SHOW);     但是到了Delphi 2009中就不能用了,现在的问题就是:     在Delphi 2009中应该如何使用WinExec这个API函数? 谢谢了!
    2009
     WinExec(PWideChar('Notepad'),SW_SHOW); 
      

  3.   

    DLL  封裝的問題,要描述清楚才好解決。
      

  4.   

    1、
    工程文件中
    var
    DLLAPP:TApplication;
    procedure ExitDLL(Reason: Integer);
    begin
      if Reason=DLL_PROCESS_DETACH then
      begin
        Application:=DllApp;
      end;
    end;begin
      DllApp:=Application;
      DLLProc:=@ExitDLL;
    end.procedure ShowMDIForm(App:TApplication;ParentForm:TForm);stdcall;
    begin
      Application := App;
      if not Assigned(frmMDIForm) then
      frmMDIForm:=TfrmMDIForm.Create(ParentForm);
      frmMDIForm.Show;
    end;
    //子窗体关闭的时候
      Action:=caFree;
      frmMDIForm:=nil;
    2、
    TShowForm=procedure (App:TApplication;ParentForm:TForm);stdcall;
    FShowForm:TShowForm;
    begin
      @FShowForm:=GetProcAddress(FDLLHandle,'ShowMDIForm');//FDLLHandle为DLL句柄
      FShowForm(Application,Application.MainForm);
    end;
    3、
    procedure WMHotKey(var Msg:TWMHotKey); message WM_HOTKEY;
    var
    H:THandle;
    begin
      if Msg.HotKey=id_SnapShot   then
      begin
          H:=GetSysFocus;
          while IsWindow(H) and (H<>frmMain.Handle)   do
          begin
              SendMessage(H,WM_NEXTDLGCTL,0,0);
              H:=GetParent(H);
          end;
      end;
    end;procedure  WMACTIVATEAPP(var  Msg:TMessage);message  WM_ACTIVATEAPP;
    begin
      if Boolean(Msg.WParam) then
        RegisterHotKey(frmMain.Handle,id_SnapShot,0,VK_TAB)//定义热键     在程序得到焦点时
      else
        UnRegisterHotKey(frmMain.Handle,id_SnapShot);//释放已经登记的热键   在程序失去焦点时
    end;
    //此外在DLL中加一个CloseForm方法,用于应用程序退出时关闭子窗口
    procedure CloseForm;stdcall;
    begin
      if Assigned(MDIForm) then
        MDIForm.Close;
    end
      

  5.   

    没时间试,看看有没有可能是模块使用Appliaction不同产生的消息发放的问题
      

  6.   

    其实DLL封装MDI子窗体没那么神秘,只要带包编译,一切问题迎刃而解
      

  7.   


       今天看到这么多人关注这个问题,我非常高兴,但是现在宿舍里面还没有开网,    所以说只能先把这些问题带回去,自己试验之后才能知道结果。这些问题先这样吧。    至于分数的问题,我按照顺序分给大家:       hsmserver:这位超级大大,很辛苦,贴了这么多代码,我没时间看了,回去仔细研究————50分       yct0605:感谢你帮我找了点资料,我大概看了下,希望能够符合我的要求————30分       starluck:也是个超级大大,你头像挺酷的,之前我曾经试过用PAnsiChar('Notepad')转化不成功,                  所以也不敢确定,先给你20分吧。    我先结贴了,但是问题可能还没有解决,我先把解决方案拿回去,如果有什么不懂的问题再向大家提问,可以吗?    其实我感觉,分数是次要的,主要是学会东西,在这里先感谢大家了。    补充一点,8楼的见解很精辟,这个方面我也想过,不过说起来,真要是带包编译,那DLL就没有任何意义了,呵呵。
      

  8.   


        晕死啊,打了半天的字提交没成功    这次不多说了,非常感谢两位超级大大对我问题的关注,现在是网吧,我只能把问题带回去,贴先结了。    总不能因为我个人的原因,让这么多热心人等着。    这样吧:
         
              hsmserver:这位超级大大很辛苦,贴了这么多代码,而且专门针对我的问题,这里给60分了,                      相信这点分不多。          yct0605:非常感谢你帮我找了适合的资料,给你30分吧,别见怪,你比人家hsmserver
    人家少很多事呢
      

  9.   


       还没打完呢   starluck:这位头像很帅的超级大大,之前我曾经用WinExec(PAnsiChar('Notepad'),SW_SHOW)            这个命令试过,不起作用,所以我只能带回去。这里先给你10分好吗?   3150379:你见解很精辟,但是带包编译了,还要DLL干吗
      

  10.   

    呵呵,分無所謂的。WinExec(PWIDEChar('Notepad'),SW_SHOW)這裏是PWideChar  要注意。
      

  11.   

         starluck: 问题解决了,你打出来的命令没错,按照这样打出来的没错,算到下面这段代码就不行了:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s: String;
    begin
      s := 'Notepad';
      WinExec(PWideChar(s),SW_SHOW);
    end;
        这段代码编译无法通过,参数格式不对;     换成WinExec(PAnsiChar(s),SW_SHOW)可以编译过去,但是执行之后,不会出现任何结果。     在研究了7楼提供的那个链接之后,终于弄明白是怎么回事了。     Delphi 2009中默认的String类型是WideChar类型的,而非以前默认的AnsiString类型的,     这样强制转化为PAnsiChar自然就会出现问题,所以在Delphi 2009中需要多一步的转化,看下面这段代码:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s: String;
    begin
      s := 'Notepad';
      WinExec(PAnsiChar(AnsiString(s)),SW_SHOW);
    end;
         这就是结果,在这里贴出来,给需要的人!