假如已在DLL中建立了一个简单的窗体,上面只有一个edit,
1.如何在一个新程序中显示这个窗体,
2.不显示DLL窗体,但要取得DLL中窗体上的EDIT的值如何来做?

解决方案 »

  1.   

    在DLL中封装的窗体,与普通窗体一样使用:先创建(Create),再使用。
    一般就是在窗体单元文件中写一个公开的方法,用于创建这个窗体
    要想不显示窗体,那么就不Show或Showmodal就行了,窗体的状态是Visible=False但是,要使用对象或对象的成员,前提是:对象必须被创建(Create)
      

  2.   

    1.创建DLL
    library ProjectDll;{ Important note about DLL memory management: ShareMem must be the
      first unit in your library's USES clause AND your project's (select
      Project-View Source) USES clause if your DLL exports any procedures or
      functions that pass strings as parameters or function results. This
      applies to all strings passed to and from your DLL--even those that
      are nested in records and classes. ShareMem is the interface unit to
      the BORLNDMM.DLL shared memory manager, which must be deployed along
      with your DLL. To avoid using BORLNDMM.DLL, pass string information
      using PChar or ShortString parameters. }uses
      Windows,
      Messages,
      SysUtils,
      Classes,
      Graphics,
      Controls,
      Forms,
      Dialogs,
      UnitDll in 'UnitDll.pas' {Form1};procedure ProvaChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
    var
      Form1: TForm1;  
      DllProc: Pointer;             { Called whenever DLL entry point is called }begin
       Application:=ParentApplication;   Form1:=TForm1.Create(ParentForm);
       Form1.MyParentForm:=ParentForm;
       Form1.MyParentApplication:=ParentApplication;
       windows.SetParent(Form1.Handle,ParentForm.Handle);
     Form1.FormStyle:=fsMDIChild;
       Form1.Show;
       from1.visible := false ;
       
    end;procedure DLLUnloadProc(Reason: Integer); register;
    begin
      if Reason = DLL_PROCESS_DETACH then  Application:=DllApplication;
    end;exports
       ProvaChild;begin
       DllApplication:=Application;
       DLLProc := @DLLUnloadProc;
    end.
    第二: 主窗口调用问题unit MainUnit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ToolWin, ComCtrls, Menus;type
      TMainForm = class(TForm)
        MainMenu1: TMainMenu;
        Start: TMenuItem;
        procedure StartClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;   T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;var
      MainForm: TMainForm;implementation{$R *.DFM}procedure TMainForm.StartClick(Sender: TObject);
    var
       DllHandle: THandle;
       ProcAddr: FarProc;
       ProvaChild: T_ProvaChild;
    begin   
       DllHandle := LoadLibrary('ProjectDll');
       ProcAddr := GetProcAddress(DllHandle, 'ProvaChild');
       if ProcAddr <> nil then
       begin
          ProvaChild := ProcAddr;
          ProvaChild(Application,Self);
       end;
    end;end.