首先点击File->New->Other-> Dynamic Link Libary
把工程文件保存为:CalendarLib.pas 再创建一个Form并放入一个TMonthCalendar控件
borderStyle属性设为:bsToolWindow
保存为 DllFormUnit.pas
unit DllFormUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type TDllForm = class(TForm) MonthCalendar1: TMonthCalendar; procedure MonthCalendar1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var DllForm: TDllForm;
// 供外部调用函数
function ShowCalendar(AHandle: THandle;ACaption: String):PChar;stdcall;
implementation {$R *.dfm} function ShowCalendar(AHandle: THandle;ACaption: String):PChar; var DllForm: TDllForm; begin //复制应用程序的句柄给Dll //Dll中Application对象与调用它的应用程序是分离的,为使Dll中的窗体真正的成 //为应用程序模式窗体,必须将应用程序的句柄赋给Dll的Application.Handle属性 //必须确保AHandle句柄不为nil,否则出现无法预料的错误 Application.Handle := AHandle; DlLForm := TDllForm.Create(Application); try DllForm.Caption := ACaption; DllForm.ShowModal; Result := PChar(DateToStr(DllForm.MonthCalendar1.Date)); finally DllForm.Free; end; end; procedure TDllForm.MonthCalendar1Click(Sender: TObject); begin Close; end; end.
CalendarLib.pas
library CalendarLib; uses SysUtils, Classes, DllFormUnit in 'DllFormUnit.pas' {DllForm}; {$R *.res} exports ShowCalendar; begin end.
主窗体设计
MainFormUnit.pas文件
unit MainFormUnit;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TShowCalendar = function (AHandle: THandle;ACaption: String):PChar;stdcall; TMainForm = class(TForm) btnShowCalendar: TButton; lblDate: TLabel; procedure btnShowCalendarClick(Sender: TObject); private { Private declarations } public { Public declarations } end;var MainForm: TMainForm;implementation{$R *.dfm}procedure TMainForm.btnShowCalendarClick(Sender: TObject);var ShowCalendarForm: TShowCalendar; libHandle: THandle;begin libHandle := LoadLibrary('CalendarLib.dll'); try //是否读取成功 if libHandle = 0 then raise Exception.Create('加载CalendarLib.dll失败'); //读取函数方法地址 @ShowCalendarForm := GetProcAddress(LibHandle,'ShowCalendar'); //读取是否成功 if not (@ShowCalendarForm = nil) then begin lblDate.Caption :=ShowCalendarForm(Application.Handle,'选择日历'); end else RaiseLastWin32Error; finally
//释放Dll
FreeLibrary(LibHandle);
DFM文件
object MainForm: TMainForm Left = 0 Top = 0 Caption = 'MainForm' ClientHeight = 202 ClientWidth = 447 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object lblDate: TLabel Left = 119 Top = 45 Width = 98 Height = 13 Caption = #26085#26399':' end object btnShowCalendar: TButton Left = 16 Top = 40 Width = 97 Height = 25 Caption = #26174#31034#26085#21382#31383#20307 TabOrder = 0 OnClick = btnShowCalendarClick endend
运行结果:
来源:https://www.cnblogs.com/pengshaomin/archive/2012/02/19/2358558.html