在DLL中设置如下的导出函数:
function b(Owner: TComponent): TForm; stdcall;
begin
  frm_xtzd2003:=tfrm_xtzd2003.Create(Owner);
  result:=Tform(frm_xtzd2003);
end;在运行时有时通过,有时又不行?点解?!!!?

解决方案 »

  1.   

    修改如下:
    窗體間用消息傳遞命令!!!function b(): boolean; stdcall;
    begin
      frm_xtzd2003 :=tfrm_xtzd2003.Create(nil);
      frm_xtzd2003.Show;
    end;function b(): boolean; stdcall;
    begin
      if(Assigned(frm_xtzd2003) then
      begin
        frm_xtzd2003.Close;
        FreeAndNil(frm_xtzd2003);
      end;
    end;
      

  2.   

    aiirii(ari) 兄
    //以下这个函数有什么作用?
    function b(): boolean; stdcall;
    begin
      if(Assigned(frm_xtzd2003) then
      begin
        frm_xtzd2003.Close;
        FreeAndNil(frm_xtzd2003);
      end;
    end;
      

  3.   

    Please refer to <Delphi 5 Developer's Guide>
      

  4.   

    你具体要达到什么样的效果?,哪个aiirii(ari)下面是用于判断是否已经已经存在,如果在就销毁
      

  5.   

    >>if(Assigned(frm_xtzd2003) then
    就是先判斷下是不是 frm_xtzd2003 已經創建了, 如是, 再做釋放工作!!
      

  6.   

    下面是源码:
        Project1.DPR {主叫程序}
        Unit1.PAS {主叫程序单元}
        Project2.DPR {DLL}
        Unit2.PAS {DLL单元}
    {---------- DLL 主程序 Project2.DPR ----------}library Project2;uses
      SysUtils,
      Classes,
      Unit2 in 'Unit2.pas' {Form1};{$R *.RES}{ 下面的语句用于向调用该 DLL的程序提供调用接口 }
    exports
      DoTest;       { 过程来自单元Unit2 }begin
    end.
    {---------- DLL中的单元 Unit2.PAS ----------}unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, ADODB, StdCtrls, Menus;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;{ 本地数据库连接 }
        Memo1: TMemo;                  { 用于显示信息   }
      private
      public
      end;{ 该过程向外提供 }
    procedure DoTest(H: THandle;           { 获得调用者的句柄       }
                     AConn: TADOConnection;{ 获得调用者的数据库连接 }
                     S: string;            { 获得一些文本信息       }
                     N: Integer);          { 获得一些数值信息       }
                     cdecl;                { 指定调用协议           } implementation{$R *.DFM}procedure DoTest(H: THandle; AConn: TADOConnection; S: string; N: Integer);
    begin
      Application.Handle := H;              { 将过程的句柄赋值为调用者的句柄 }
      { 上面语句的作用在于, DLL的句柄和调用者的句柄相同,在任务栏中就不会   }
      { 各自出现一个任务标题了。                                             }
      with TForm1.Create(Application) do try{ 创建窗体                       }
        Memo1.Lines.Append('成功调用');     { 显示一行信息                   }
        ADOConnection1 := AConn;            { 获得数据库连接的实例           }
        Memo1.Lines.Append(
          ADOConnection1.ConnectionString +
          ' - ' + S + ' - ' + IntToStr(N)); { 根据得到的参数显示另一行信息   }
        ShowModal;                          { 模式化显示窗体                 }
      finally
        Free;                               { 调用结束时销毁窗口             }
      end;
    end;end.
    {---------- 调用者 Project1.DPR,很普通的工程文件 ----------}program Project1;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1};{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    {---------- 调用者单元Unit1.PAS ----------}unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Db, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;   { 按此按钮进行调用 }
        ADOConnection1: TADOConnection;         { 本地数据库连接,将传递给 DLL }
        procedure Button1Click(Sender: TObject);{ 调用 DLL}
      private
      public
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ 外部声明必须和 DLL中的参数列表一致,否则会运行时错误    }
    procedure DoTest(H: THandle;             { 传递句柄       }
                     AConn: TADOConnection;  { 传递数据库连接 }
                     S: string;              { 传递文本信息   }
                     N: Integer);            { 传递数值信息   }
                     cdecl;                  { 指定调用协议   }
                     external 'Project2.dll';{ 指定过程来源   }{ 调用过程 }
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      DoTest(Application.Handle,
             ADOConnection1,
             'Call OK',
             256);
    end;end.
      

  7.   

    各位,根据你们的回答,我的问题基本解决。但是我用的是窗体的show,而不是showmodal,这就造成了在子窗体和父窗体之间谁获得焦点的问题,如果在子窗体获得焦点时,父窗体就要失去焦点,能不能,在子窗体show的时候,而和父窗体的handle同步,就好像一个界面一样。
      

  8.   

    设置Formstyle是不可行的。我的做法是:
    //设置窗体属性为子窗体。
    setwindowlong(handle,style,WM_CHILD)  
    这样的做法有一个问题,在子窗体中,Tab键和H键被屏蔽。
    有人能找到更好的方法吗?