程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 使用DLL文件中封裝的窗口

使用DLL文件中封裝的窗口

編輯:Delphi
文章摘要:
      編寫軟件時常常使用到DLL文件,本文就使用DLL文件中封裝的窗口來說說Delphi中在DLL如何封裝窗口,如何調用DLL中封裝的窗口,及MDI-Child在DLL中載入並使用
  一、在DLL中封裝窗口
      打開Delphi新建一個DLL工程,保存為usedll,生成代碼

   library usedll; { 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
  SysUtils,
  Classes; {$R *.res} begin
  end.

新建一個窗體,添加一個Label和Button,設置如下:

   object Form1: TForm1
  Left = 192
  Top = 133
  Width = 334
  Height = 221
  Caption = 'DLL'#20013#20351#29992#31383#20307
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
  Left = 104
  Top = 80
  Width = 80
  Height = 13
  Caption = 'DLL'#20013#20351#29992#31383#20307
  end
  object Button1: TButton
  Left = 120
  Top = 152
  Width = 75
  Height = 25
  Caption = #30830#23450
  TabOrder = 0
  OnClick = Button1Click
  end
  end

添加一過程:procedure LoadForm; export;
  procedure LoadForm;
  begin
  Form1 := TForm1.Create(Application);
  try
  Form1.ShowModal;
  finally
  Form1.Free;
  end;
  end; 全部完整的代碼:

   library usedll; uses
  SysUtils,
  Classes,
  Form_Unit in 'Form_Unit.pas' {Form1}; {$R *.res}
  exports
  LoadForm index 1;
  begin end.
  

 

   unit Form_Unit; interface uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls; type
  TForm1 = class(TForm)
  Label1: TLabel;
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end; var
  Form1: TForm1;
  ApplicationName: String;
  procedure LoadForm(Handle: THandle; AppName: ShortString); export; implementation {$R *.dfm}
  procedure LoadForm(Handle: THandle; AppName: ShortString);
  begin
  Application.Handle := Handle;
  ApplicationName := AppName;
  Form1 := TForm1.Create(Application);
  try
  Form1.ShowModal;
  finally
  Form1.Free;
  end;
  end; procedure TForm1.Button1Click(Sender: TObject);
  begin
  self.close;
  end; end.

編譯後生成usedll.dll文件,至此DLL文件就完成了 二、調用DLL中封裝的窗口     新建一個工程,添加一個Button,窗體布局如下:

   object Form1: TForm1
  Left = 192
  Top = 133
  Width = 336
  Height = 222
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
  Left = 128
  Top = 88
  Width = 75
  Height = 25
  Caption = #25171#24320#31383#20307
  TabOrder = 0
  OnClick = Button1Click
  end
  end

完整的代碼如下:

   unit Use_Unit; interface uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
  type
  TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end; var
  Form1: TForm1;
  procedure LoadForm; external 'usedll.dll' index 1;
  implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
  begin
  LoadForm;
  end; end.

三、MDI-Child在DLL中載入並使用
      如果是MDI-Child又如何在DLL中載入並使用呢,下面就這個問題說說使用DLL文件中封裝的窗口。
  新建一個DLL工程,保存為mdidll,再新建一個窗體,FormStyle設為fsMDIChild,如下:
  object Form1: TForm1
  Left = 192
  Top = 133
  Width = 344
  Height = 234
  Caption = 'MDI'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  FormStyle = fsMDIChild
  OldCreateOrder = False
  Position = poDefault
  Visible = True
  OnClose = FormClose
  PixelsPerInch = 96
  TextHeight = 13
  end 代碼如下:

   unit mdi_Unit; interface uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs; type
  TForm1 = class(TForm)
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
  { Private declarations }
  public
  { Public declarations }
  MyParentForm: TForm;
  MyParentApplication: TApplication;
  end; var
  DllApplication: TApplication;
  implementation {$R *.dfm} procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  begin
  Action:=caFree;
  end; end.


  

   library mdidll; uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  mdi_Unit in 'mdi_Unit.pas' {Form1}; procedure LoadChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
  var
  Form1: TForm1;
  DllProc: Pointer; begin
  Application:=ParentApplication;
  Form1:=TForm1.Create(ParentForm);
  Form1.MyParentForm:=ParentForm;
  Form1.MyParentApplication:=ParentApplication;
  Form1.Show;
  end; procedure DLLUnloadProc(Reason: Integer); register;
  begin
  if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
  end; {$R *.res}
  exports
  LoadChild;
  begin
  DllApplication:=Application;
  DLLProc := @DLLUnloadProc;
  end.

編譯後生成mdidll.dll文件。
  使用DLL中的MDI-Child窗口如下:     新建一個工程,主窗口設置如下FormStyle設為fsMDIForm:
  object Form1: TForm1
  Left = 192
  Top = 133
  Width = 544
  Height = 375
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  FormStyle = fsMDIForm
  Menu = MainMenu1
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object MainMenu1: TMainMenu
  Left = 72
  Top = 136
  object N1: TMenuItem
  Caption = #26032#24314'(&N)'
  OnClick = N1Click
  end
  end
  end
  代碼:

   unit usemdi_Unit; interface uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus; type
  TForm1 = class(TForm)
  MainMenu1: TMainMenu;
  N1: TMenuItem;
  procedure N1Click(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end;
  T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;
  var
  Form1: TForm1; implementation {$R *.dfm} procedure TForm1.N1Click(Sender: TObject);
  var
  DllHandle: THandle;
  ProcAddr: FarProc;
  ProvaChild: T_ProvaChild;
  begin
  DllHandle := LoadLibrary('mdidll');
  ProcAddr := GetProcAddress(DllHandle, 'LoadChild');
  if ProcAddr <> nil then
  begin
  ProvaChild := ProcAddr;
  ProvaChild(Application,Self);
  end;
  end; end.

結束語:
      到這裡你應該會用Delphi調用DLL文件中封裝的窗口了吧,如果還有不明白的話請與我聯系(主頁: http://yousoft.home.chinaren.com ,郵箱:[email protected])
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved