我在一个窗体上放置了很多的控件,现在我想把这个窗体加入到一个DLL文件中,然后在一个应用程序中调用这个窗体,怎么做?程序中调入窗体时,那个窗体的初始化能不能在设计阶段设置好?还是必须在代码中实现?
procedure TMainForm.N1Click(Sender: TObject);
begin
 //我想在这里写调出那个窗体的代码!
end;

解决方案 »

  1.   

    我这里暂时没有实例,但是我记得以前做的思路是这样的:
      --现建立一个DLL,这是一个Project,可以添加Form
      --在DLL 的 Project 文件中写函数来动态建立Form,作为接口。
      --然后在你上面注释的地方加入接口函数,应该就可以了。
      

  2.   

    建立一个DLL,添加Form,Dll中引用这个窗体单元
    窗体单元中定义生成窗体的函数和代码实现
    例如
    procedure ShowDllModalForm(aHandle:Thandle);stdcall;
    实现
    procedure ShowDllModalForm(aHandle:Thandle);stdcall;
    begin
      Application.Handle:=aHandle;
      with TfrmDll.Create(Application) do
      begin
        try
         ShowModal;
        finally
         free;
        end;
      end;
    end;
    在 Dll中倒出接口函数名
    exports
      ShowDllModalForm;调用Dll时 现加载Dll
    然后
    type
      TShowDLLForm=procedure(aHandle:THandle);stdcall;
    procedure ButtonClick;
    var 
      ShowDllModalForm:=TShowDllForm;
    begin
      if (@ShowDllModalForm=nil) then exit;
      ShowDllModalForm(Application.Handle);
    end;
      

  3.   

    procedure Tfm_main.N2Click(Sender: TObject);
    var
      vardll:String;
    begin
      vardll:=extractfilepath(application.ExeName)+'gxc.dll';
      try
      if vardll<>'' then
      begin
        moudle:=loadlibrary(pchar(vardll));
        @showdll:=getprocaddress(moudle,'showdll');
        showdll(application.Handle,pchar(usercode),pchar(compcode),pchar('GXC1'));
      end;
      finally
      freelibrary(moudle);
      end;
    end;
    以上为调用部分,以下是DLL部分
    procedure showdll(ahandle:thandle;g_usercode,g_compcode,g_bblx:pchar);stdcall;
    var
      old_handle:thandle;
    begin
      old_handle := application.Handle;
      application.Handle := ahandle;
      usercode:=g_usercode;
      compcode:=g_compcode;
      bblx:=g_bblx;
      dm:=tdm.Create(application);//同下
      try
        gxc:=tfm_gxcyb.Create(application);//这个很重要,不然会报错
        gxc.ShowModal;
      finally
        gxc.Free;
        dm.Free;
        application.Handle := old_handle;
      end;
    end;
      

  4.   

    DLL中加载窗体分模态、非模态,楼上老兄使用的是模态调用,非模态调用为:
    uses DllFormUnit;procedure ShowForm
    begin
      dllForm:=TDllForm.Create(nil);
      DllForm.Show;
    end;procedure DeleteForm
    begin
      DllForm.Free;
    end;exports 
      ShowForms,DeleteForm;
      

  5.   

    to  bee2518(真棒)您的代码好像有点问题!
      usercode:=g_usercode;
      compcode:=g_compcode;
    哪来的?